/ Hex Artifact Content
Login

Artifact e26d9c5d881435b83551a07cd7e38396518582bc:


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 36 32  : pager.c,v 1.62
0350: 30 20 32 30 30 39 2f 30 37 2f 32 35 20 30 34 3a  0 2009/07/25 04:
0360: 31 32 3a 30 32 20 64 72 68 20 45 78 70 20 24 0a  12:02 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72  t.h"../*.** Macr
03b0: 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  os for troublesh
03c0: 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c 6c  ooting.  Normall
03d0: 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a  y turned off.*/.
03e0: 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69 74 65  #if 0.int sqlite
03f0: 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b 20 20  3PagerTrace=1;  
0400: 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61 62 6c  /* True to enabl
0410: 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 64 65  e tracing */.#de
0420: 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65 62 75  fine sqlite3Debu
0430: 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66 0a 23  gPrintf printf.#
0440: 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43  define PAGERTRAC
0450: 45 28 58 29 20 20 20 20 20 69 66 28 20 73 71 6c  E(X)     if( sql
0460: 69 74 65 33 50 61 67 65 72 54 72 61 63 65 20 29  ite3PagerTrace )
0470: 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72  { sqlite3DebugPr
0480: 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73 65 0a  intf X; }.#else.
0490: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
04a0: 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  CE(X).#endif../*
04b0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
04c0: 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61 72 65  g two macros are
04d0: 20 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65   used within the
04e0: 20 50 41 47 45 52 54 52 41 43 45 28 29 20 6d 61   PAGERTRACE() ma
04f0: 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f  cros above.** to
0500: 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d   print out file-
0510: 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a  descriptors. .**
0520: 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20 74 61  .** PAGERID() ta
0530: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
0540: 20 61 20 50 61 67 65 72 20 73 74 72 75 63 74 20   a Pager struct 
0550: 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74 2e  as its argument.
0560: 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   The.** associat
0570: 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ed file-descript
0580: 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  or is returned. 
0590: 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29 20 74  FILEHANDLEID() t
05a0: 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65 33 5f  akes an sqlite3_
05b0: 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 20 61  file.** struct a
05c0: 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74 2e 0a  s its argument..
05d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
05e0: 49 44 28 70 29 20 28 28 69 6e 74 29 28 70 2d 3e  ID(p) ((int)(p->
05f0: 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49 4c  fd)).#define FIL
0600: 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28 28  EHANDLEID(fd) ((
0610: 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54  int)fd)../*.** T
0620: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73  he page cache as
0630: 20 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61   a whole is alwa
0640: 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  ys in one of the
0650: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
0660: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41  ates:.**.**   PA
0670: 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  GER_UNLOCK      
0680: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
0690: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
06a0: 79 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a  y reading or .**
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06c0: 20 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74         writing t
06d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
06e0: 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a  .  There is no.*
06f0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0700: 20 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c          data hel
0710: 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68  d in memory.  Th
0720: 69 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  is is the initia
0730: 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
0740: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65             state
0750: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0760: 53 48 41 52 45 44 20 20 20 20 20 20 20 20 54 68  SHARED        Th
0770: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0780: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0790: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
07b0: 72 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65  riting is not pe
07c0: 72 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20  rmitted.  There 
07d0: 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  can be.**       
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
0800: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
0810: 61 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ame database.** 
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68        file at th
0840: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a  e same time..**.
0850: 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52  **   PAGER_RESER
0860: 56 45 44 20 20 20 20 20 20 54 68 69 73 20 70 72  VED      This pr
0870: 6f 63 65 73 73 20 68 61 73 20 72 65 73 65 72 76  ocess has reserv
0880: 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
0890: 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20  for writing.**  
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 20 62 75 74 20 68 61 73 20 6e 6f 74       but has not
08c0: 20 79 65 74 20 6d 61 64 65 20 61 6e 79 20 63 68   yet made any ch
08d0: 61 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65  anges.  Only one
08e0: 20 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20   process.**     
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 61 74 20 61 20 74 69 6d 65 20 63 61 6e 20    at a time can 
0910: 72 65 73 65 72 76 65 20 74 68 65 20 64 61 74 61  reserve the data
0920: 62 61 73 65 2e 20 20 54 68 65 20 6f 72 69 67 69  base.  The origi
0930: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  nal.**          
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0950: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e  abase file has n
0960: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
0970: 20 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20   so other.**    
0980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0990: 20 20 20 70 72 6f 63 65 73 73 65 73 20 6d 61 79     processes may
09a0: 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e   still be readin
09b0: 67 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a  g the on-disk.**
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09d0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
09e0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  file..**.**   PA
09f0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20  GER_EXCLUSIVE   
0a00: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
0a10: 20 69 73 20 77 72 69 74 69 6e 67 20 74 68 65 20   is writing the 
0a20: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20  database..**    
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a40: 20 20 20 41 63 63 65 73 73 20 69 73 20 65 78 63     Access is exc
0a50: 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65  lusive.  No othe
0a60: 72 20 70 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a  r processes or.*
0a70: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0a80: 20 20 20 20 20 20 20 20 74 68 72 65 61 64 73 20          threads 
0a90: 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 6f  can be reading o
0aa0: 72 20 77 72 69 74 69 6e 67 20 77 68 69 6c 65 20  r writing while 
0ab0: 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  one.**          
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f               pro
0ad0: 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 2e  cess is writing.
0ae0: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53  .**.**   PAGER_S
0af0: 59 4e 43 45 44 20 20 20 20 20 20 20 20 54 68 65  YNCED        The
0b00: 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20   pager moves to 
0b10: 74 68 69 73 20 73 74 61 74 65 20 66 72 6f 6d 20  this state from 
0b20: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 0a  PAGER_EXCLUSIVE.
0b30: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0b40: 20 20 20 20 20 20 20 20 20 61 66 74 65 72 20 61           after a
0b50: 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 68  ll dirty pages h
0b60: 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
0b70: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
0ba0: 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  nd the file has 
0bb0: 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a  been synced to.*
0bc0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0bd0: 20 20 20 20 20 20 20 20 64 69 73 6b 2e 20 41 6c          disk. Al
0be0: 6c 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74  l that remains t
0bf0: 6f 20 64 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76  o do is to remov
0c00: 65 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  e or.**         
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
0c20: 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
0c30: 61 6c 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  al file and the 
0c40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c60: 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 63 6f        will be co
0c70: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  mmitted..**.** T
0c80: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 63 6f  he page cache co
0c90: 6d 65 73 20 75 70 20 69 6e 20 50 41 47 45 52 5f  mes up in PAGER_
0ca0: 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72  UNLOCK.  The fir
0cb0: 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c  st time a.** sql
0cc0: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 6f  ite3PagerGet() o
0cd0: 63 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65  ccurs, the state
0ce0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20   transitions to 
0cf0: 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a  PAGER_SHARED..**
0d00: 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73   After all pages
0d10: 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61   have been relea
0d20: 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
0d30: 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a  _page_unref(),.*
0d40: 2a 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  * the state tran
0d50: 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20  sitions back to 
0d60: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54  PAGER_UNLOCK.  T
0d70: 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a  he first time.**
0d80: 20 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67   that sqlite3Pag
0d90: 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
0da0: 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65 20 74  led, the state t
0db0: 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a  ransitions to.**
0dc0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
0dd0: 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73 71 6c    (Note that sql
0de0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
0df0: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20   can only be.** 
0e00: 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74  called on an out
0e10: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 77 68  standing page wh
0e20: 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ich means that t
0e30: 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a  he pager must.**
0e40: 20 62 65 20 69 6e 20 50 41 47 45 52 5f 53 48 41   be in PAGER_SHA
0e50: 52 45 44 20 62 65 66 6f 72 65 20 69 74 20 74 72  RED before it tr
0e60: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47  ansitions to PAG
0e70: 45 52 5f 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a  ER_RESERVED.).**
0e80: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
0e90: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65  means that there
0ea0: 20 69 73 20 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c   is an open roll
0eb0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  back journal..**
0ec0: 20 54 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20   The transition 
0ed0: 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  to PAGER_EXCLUSI
0ee0: 56 45 20 6f 63 63 75 72 73 20 62 65 66 6f 72 65  VE occurs before
0ef0: 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20   any changes.** 
0f00: 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
0f10: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
0f20: 68 6f 75 67 68 20 77 72 69 74 65 73 20 74 6f 20  hough writes to 
0f30: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  the rollback.** 
0f40: 6a 6f 75 72 6e 61 6c 20 6f 63 63 75 72 73 20 77  journal occurs w
0f50: 69 74 68 20 6a 75 73 74 20 50 41 47 45 52 5f 52  ith just PAGER_R
0f60: 45 53 45 52 56 45 44 2e 20 20 41 66 74 65 72 20  ESERVED.  After 
0f70: 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  an sqlite3PagerR
0f80: 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20  ollback().** or 
0f90: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
0fa0: 69 74 50 68 61 73 65 54 77 6f 28 29 2c 20 74 68  itPhaseTwo(), th
0fb0: 65 20 73 74 61 74 65 20 63 61 6e 20 67 6f 20 62  e state can go b
0fc0: 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ack to PAGER_SHA
0fd0: 52 45 44 2c 0a 2a 2a 20 6f 72 20 69 74 20 63 61  RED,.** or it ca
0fe0: 6e 20 73 74 61 79 20 61 74 20 50 41 47 45 52 5f  n stay at PAGER_
0ff0: 45 58 43 4c 55 53 49 56 45 20 69 66 20 77 65 20  EXCLUSIVE if we 
1000: 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65  are in exclusive
1010: 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f   access mode..*/
1020: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 55  .#define PAGER_U
1030: 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23 64 65  NLOCK      0.#de
1040: 66 69 6e 65 20 50 41 47 45 52 5f 53 48 41 52 45  fine PAGER_SHARE
1050: 44 20 20 20 20 20 20 31 20 20 20 2f 2a 20 73 61  D      1   /* sa
1060: 6d 65 20 61 73 20 53 48 41 52 45 44 5f 4c 4f 43  me as SHARED_LOC
1070: 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  K */.#define PAG
1080: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 32  ER_RESERVED    2
1090: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 52 45     /* same as RE
10a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23  SERVED_LOCK */.#
10b0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 58 43  define PAGER_EXC
10c0: 4c 55 53 49 56 45 20 20 20 34 20 20 20 2f 2a 20  LUSIVE   4   /* 
10d0: 73 61 6d 65 20 61 73 20 45 58 43 4c 55 53 49 56  same as EXCLUSIV
10e0: 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e  E_LOCK */.#defin
10f0: 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20  e PAGER_SYNCED  
1100: 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d      5../*.** A m
1110: 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69 6e  acro used for in
1120: 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65 63  voking the codec
1130: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
1140: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1150: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64 65  E_HAS_CODEC.# de
1160: 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c  fine CODEC1(P,D,
1170: 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69 66 28  N,X,E) \.    if(
1180: 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20 50 2d   P->xCodec && P-
1190: 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65  >xCodec(P->pCode
11a0: 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b 20 45  c,D,N,X)==0 ){ E
11b0: 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  ; }.# define COD
11c0: 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29  EC2(P,D,N,X,E,O)
11d0: 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e 78 43   \.    if( P->xC
11e0: 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28 63 68  odec==0 ){ O=(ch
11f0: 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c 0a 20  ar*)D; }else \. 
1200: 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61 72 2a     if( (O=(char*
1210: 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70  )(P->xCodec(P->p
1220: 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29 3d 3d  Codec,D,N,X)))==
1230: 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73 65 0a  0 ){ E; }.#else.
1240: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28  # define CODEC1(
1250: 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f 2a 20  P,D,N,X,E)   /* 
1260: 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e  NO-OP */.# defin
1270: 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58  e CODEC2(P,D,N,X
1280: 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a 29 44  ,E,O) O=(char*)D
1290: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
12a0: 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  he maximum allow
12b0: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20  ed sector size. 
12c0: 31 36 4d 42 2e 20 49 66 20 74 68 65 20 78 53 65  16MB. If the xSe
12d0: 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74 68 6f  ctorsize() metho
12e0: 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  d .** returns a 
12f0: 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74 68 61  value larger tha
1300: 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d 41 58  n this, then MAX
1310: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 73 20  _SECTOR_SIZE is 
1320: 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  used instead..**
1330: 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f 6e 63   This could conc
1340: 65 69 76 61 62 6c 79 20 63 61 75 73 65 20 63 6f  eivably cause co
1350: 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f 77 69  rruption followi
1360: 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  ng a power failu
1370: 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20 61 20  re on.** such a 
1380: 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69 73 20  system. This is 
1390: 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75 6e 64  currently an und
13a0: 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69 74 2e  ocumented limit.
13b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f  .*/.#define MAX_
13c0: 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78 30 31  SECTOR_SIZE 0x01
13d0: 30 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  00000../*.** An 
13e0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
13f0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
1400: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
1410: 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76 65   for each active
1420: 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61 6e  .** savepoint an
1430: 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  d statement tran
1440: 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  saction in the s
1450: 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68 20  ystem. All such 
1460: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61 72  structures.** ar
1470: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
1480: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
1490: 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  [] array, which 
14a0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
14b0: 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69 6e  .** resized usin
14c0: 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  g sqlite3Realloc
14d0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ()..**.** When a
14e0: 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63 72   savepoint is cr
14f0: 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65 72  eated, the Pager
1500: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
1510: 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a 2a  fset field is.**
1520: 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61 20   set to 0. If a 
1530: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
1540: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
1550: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
1560: 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61 76  while.** the sav
1570: 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
1580: 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73 65  , then iHdrOffse
1590: 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
15a0: 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a 20  byte offset .** 
15b0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
15c0: 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 6a  owing the last j
15d0: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 72  ournal record wr
15e0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d  itten into the m
15f0: 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 62  ain.** journal b
1600: 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e 61  efore the journa
1610: 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20 69  l-header. This i
1620: 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69 6e  s required durin
1630: 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 72  g savepoint.** r
1640: 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61 67  ollback (see pag
1650: 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
1660: 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65 64  int())..*/.typed
1670: 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72 53  ef struct PagerS
1680: 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53 61  avepoint PagerSa
1690: 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74 20  vepoint;.struct 
16a0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 7b  PagerSavepoint {
16b0: 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b 20  .  i64 iOffset; 
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66 73  /* Starting offs
16e0: 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e  et in main journ
16f0: 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
1700: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
1710: 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f 76       /* See abov
1720: 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
1730: 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20  InSavepoint;    
1740: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70 61      /* Set of pa
1750: 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76 65  ges in this save
1760: 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  point */.  Pgno 
1770: 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20  nOrig;          
1780: 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
1790: 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  nal number of pa
17a0: 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a 20  ges in file */. 
17b0: 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20 20   Pgno iSubRec;  
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17d0: 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
17e0: 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a 6f  record in sub-jo
17f0: 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  urnal */.};../*.
1800: 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63  ** A open page c
1810: 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61  ache is an insta
1820: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1830: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1840: 2a 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a  **.** errCode.**
1850: 0a 2a 2a 20 20 20 50 61 67 65 72 2e 65 72 72 43  .**   Pager.errC
1860: 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20 74  ode may be set t
1870: 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  o SQLITE_IOERR, 
1880: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20  SQLITE_CORRUPT, 
1890: 6f 72 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49 54  or.**   or SQLIT
18a0: 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65  E_FULL. Once one
18b0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68   of the first th
18c0: 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72  ree errors occur
18d0: 73 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a  s, it persists.*
18e0: 2a 20 20 20 61 6e 64 20 69 73 20 72 65 74 75 72  *   and is retur
18f0: 6e 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c  ned as the resul
1900: 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72  t of every major
1910: 20 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e   pager API call.
1920: 20 20 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49 54    The.**   SQLIT
1930: 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f  E_FULL return co
1940: 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64  de is slightly d
1950: 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72  ifferent. It per
1960: 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c  sists only until
1970: 20 74 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20 73   the.**   next s
1980: 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61  uccessful rollba
1990: 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20  ck is performed 
19a0: 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  on the pager cac
19b0: 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20 53  he. Also,.**   S
19c0: 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20  QLITE_FULL does 
19d0: 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 73  not affect the s
19e0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
19f0: 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
1a00: 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20 41  rLookup().**   A
1a10: 50 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74  PIs, they may st
1a20: 69 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63 63  ill be used succ
1a30: 65 73 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20  essfully..**.** 
1a40: 64 62 53 69 7a 65 56 61 6c 69 64 2c 20 64 62 53  dbSizeValid, dbS
1a50: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 2c  ize, dbOrigSize,
1a60: 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a 2a   dbFileSize.**.*
1a70: 2a 20 20 20 4d 61 6e 61 67 69 6e 67 20 74 68 65  *   Managing the
1a80: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1a90: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61  abase file in pa
1aa0: 67 65 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20  ges is a little 
1ab0: 63 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20  complicated..** 
1ac0: 20 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 50    The variable P
1ad0: 61 67 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74  ager.dbSize cont
1ae0: 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ains the number 
1af0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68  of pages that th
1b00: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
1b10: 69 6d 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20  image currently 
1b20: 63 6f 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65  contains. As the
1b30: 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
1b40: 67 72 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73  grows or shrinks
1b50: 20 74 68 69 73 0a 2a 2a 20 20 20 76 61 72 69 61   this.**   varia
1b60: 62 6c 65 20 69 73 20 75 70 64 61 74 65 64 2e 20  ble is updated. 
1b70: 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67  The variable Pag
1b80: 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 63 6f  er.dbFileSize co
1b90: 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65  ntains the numbe
1ba0: 72 0a 2a 2a 20 20 20 6f 66 20 70 61 67 65 73 20  r.**   of pages 
1bb0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1bc0: 66 69 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 62  file. This may b
1bd0: 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
1be0: 20 50 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a 2a   Pager.dbSize.**
1bf0: 20 20 20 69 66 20 73 6f 6d 65 20 70 61 67 65 73     if some pages
1c00: 20 68 61 76 65 20 62 65 65 6e 20 61 70 70 65 6e   have been appen
1c10: 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  ded to the datab
1c20: 61 73 65 20 69 6d 61 67 65 20 62 75 74 20 6e 6f  ase image but no
1c30: 74 20 79 65 74 20 77 72 69 74 74 65 6e 0a 2a 2a  t yet written.**
1c40: 20 20 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20     out from the 
1c50: 63 61 63 68 65 20 74 6f 20 74 68 65 20 61 63 74  cache to the act
1c60: 75 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ual file on disk
1c70: 2e 20 4f 72 20 69 66 20 74 68 65 20 69 6d 61 67  . Or if the imag
1c80: 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20  e has been.**   
1c90: 74 72 75 6e 63 61 74 65 64 20 62 79 20 61 6e 20  truncated by an 
1ca0: 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
1cb0: 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68  um operation. Th
1cc0: 65 20 50 61 67 65 72 2e 64 62 4f 72 69 67 53 69  e Pager.dbOrigSi
1cd0: 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20  ze variable.**  
1ce0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75   contains the nu
1cf0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1d00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
1d10: 61 67 65 20 77 68 65 6e 20 74 68 65 20 63 75 72  age when the cur
1d20: 72 65 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73 61  rent.**   transa
1d30: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
1d40: 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  . The contents o
1d50: 66 20 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74  f all three of t
1d60: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 69  hese variables i
1d70: 73 0a 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61 72  s.**   only guar
1d80: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72  anteed to be cor
1d90: 72 65 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c  rect if the bool
1da0: 65 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  ean Pager.dbSize
1db0: 56 61 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a  Valid is true..*
1dc0: 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e 64  *.**   TODO: Und
1dd0: 65 72 20 77 68 61 74 20 63 6f 6e 64 69 74 69 6f  er what conditio
1de0: 6e 73 20 69 73 20 64 62 53 69 7a 65 56 61 6c 69  ns is dbSizeVali
1df0: 64 20 73 65 74 3f 20 43 6c 65 61 72 65 64 3f 0a  d set? Cleared?.
1e00: 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e  **.** changeCoun
1e10: 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tDone.**.**   Th
1e20: 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  is boolean varia
1e30: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ble is used to m
1e40: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
1e50: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1e60: 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79   .**   (the 4-by
1e70: 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  te header field 
1e80: 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32  at byte offset 2
1e90: 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  4 of the databas
1ea0: 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20  e file) is .**  
1eb0: 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72   not updated mor
1ec0: 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63  e often than nec
1ed0: 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20  essary. .**.**  
1ee0: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72   It is set to tr
1ef0: 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e  ue when the chan
1f00: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
1f10: 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69   is updated, whi
1f20: 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c  ch .**   can onl
1f30: 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65  y happen if an e
1f40: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
1f50: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1f60: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
1f70: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28   It is cleared (
1f80: 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68  set to false) wh
1f90: 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73  enever an exclus
1fa0: 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  ive lock is .** 
1fb0: 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f    relinquished o
1fc0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1fd0: 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61  ile. Each time a
1fe0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1ff0: 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20  committed,.**   
2000: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
2010: 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70  one flag is insp
2020: 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20  ected. If it is 
2030: 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f  true, the work o
2040: 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20  f.**   updating 
2050: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
2060: 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  er is omitted fo
2070: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  r the current tr
2080: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
2090: 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73     This mechanis
20a0: 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65  m means that whe
20b0: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  n running in exc
20c0: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63  lusive mode, a c
20d0: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  onnection .**   
20e0: 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65  need only update
20f0: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
2100: 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68  ter once, for th
2110: 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74  e first transact
2120: 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74  ion.**   committ
2130: 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64 69  ed..**.** dbModi
2140: 66 69 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  fied.**.**   The
2150: 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67   dbModified flag
2160: 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72   is set whenever
2170: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
2180: 20 69 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a 20   is dirtied..** 
2190: 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20    It is cleared 
21a0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61  at the end of ea
21b0: 63 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ch transaction..
21c0: 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 75 73  **.**   It is us
21d0: 65 64 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69  ed when committi
21e0: 6e 67 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20  ng or otherwise 
21f0: 65 6e 64 69 6e 67 20 61 20 74 72 61 6e 73 61 63  ending a transac
2200: 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74 68  tion. If.**   th
2210: 65 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61  e dbModified fla
2220: 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20  g is clear then 
2230: 6c 65 73 73 20 77 6f 72 6b 20 68 61 73 20 74 6f  less work has to
2240: 20 62 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   be done..**.** 
2250: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 0a 2a  journalStarted.*
2260: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 66 6c 61 67  *.**   This flag
2270: 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72   is set whenever
2280: 20 74 68 65 20 74 68 65 20 6d 61 69 6e 20 6a 6f   the the main jo
2290: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2e  urnal is synced.
22a0: 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 70 6f   .**.**   The po
22b0: 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c 61 67  int of this flag
22c0: 20 69 73 20 74 68 61 74 20 69 74 20 6d 75 73 74   is that it must
22d0: 20 62 65 20 73 65 74 20 61 66 74 65 72 20 74 68   be set after th
22e0: 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20 6a 6f  e .**   first jo
22f0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  urnal header in 
2300: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  a journal file h
2310: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74  as been synced t
2320: 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41 66 74  o disk..**   Aft
2330: 65 72 20 74 68 69 73 20 68 61 73 20 68 61 70 70  er this has happ
2340: 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65 73 20  ened, new pages 
2350: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
2360: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 64  database .**   d
2370: 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 50  o not need the P
2380: 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
2390: 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68 65 79  lag set, as they
23a0: 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a 20   do not need.** 
23b0: 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61 20    to wait for a 
23c0: 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62 65 66  journal sync bef
23d0: 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62 65 20  ore they can be 
23e0: 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 2a  written out to.*
23f0: 2a 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65  *   the database
2400: 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e 63 74   file (see funct
2410: 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74 65 28  ion pager_write(
2420: 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73 65 74  ))..**   .** set
2430: 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 54  Master.**.**   T
2440: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
2450: 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  used to ensure t
2460: 68 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a  hat the master j
2470: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
2480: 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29 20 69  .**   (if any) i
2490: 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e 20 69  s only written i
24a0: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
24b0: 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a 2a  file once..**.**
24c0: 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74 74 69     When committi
24d0: 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
24e0: 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  , the master jou
24f0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 28  rnal file name (
2500: 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d 61 79  if any).**   may
2510: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
2520: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2530: 65 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65  e while the page
2540: 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a 2a 2a  r is still in.**
2550: 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56 45     PAGER_RESERVE
2560: 44 20 73 74 61 74 65 20 28 73 65 65 20 43 6f 6d  D state (see Com
2570: 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 66 6f  mitPhaseOne() fo
2580: 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e 20 49  r the action). I
2590: 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74 74 65  t.**   then atte
25a0: 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64 65 20  mpts to upgrade 
25b0: 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  to an exclusive 
25c0: 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20 61 74  lock. If this at
25d0: 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69 6c 73  tempt.**   fails
25e0: 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 42 55  , then SQLITE_BU
25f0: 53 59 20 6d 61 79 20 62 65 20 72 65 74 75 72 6e  SY may be return
2600: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20 61  ed to the user a
2610: 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 20  nd the user.**  
2620: 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20   may attempt to 
2630: 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
2640: 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61 74  action again lat
2650: 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a 20 20  er (calling.**  
2660: 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28   CommitPhaseOne(
2670: 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73 20 66  ) again). This f
2680: 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f 20 65  lag is used to e
2690: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 0a  nsure that the .
26a0: 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72  **   master jour
26b0: 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e 6c 79  nal name is only
26c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
26d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
26e0: 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69 6d 65   first.**   time
26f0: 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28   CommitPhaseOne(
2700: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  ) is called..**.
2710: 2a 2a 20 64 6f 4e 6f 74 53 79 6e 63 0a 2a 2a 0a  ** doNotSync.**.
2720: 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61 62  **   This variab
2730: 6c 65 20 69 73 20 73 65 74 20 61 6e 64 20 63 6c  le is set and cl
2740: 65 61 72 65 64 20 62 79 20 73 71 6c 69 74 65 33  eared by sqlite3
2750: 50 61 67 65 72 57 72 69 74 65 28 29 2e 0a 2a 2a  PagerWrite()..**
2760: 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a 0a  .** needSync.**.
2770: 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74 20 6d 69  **   TODO: It mi
2780: 67 68 74 20 62 65 20 65 61 73 69 65 72 20 74 6f  ght be easier to
2790: 20 73 65 74 20 74 68 69 73 20 76 61 72 69 61 62   set this variab
27a0: 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f 75 72 6e  le in writeJourn
27b0: 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20 61 6e 64  alHdr().**   and
27c0: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
27d0: 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43 68 61 6e  nal() only. Chan
27e0: 67 65 20 69 74 73 20 6d 65 61 6e 69 6e 67 20 74  ge its meaning t
27f0: 6f 20 22 75 6e 73 79 6e 63 65 64 20 64 61 74 61  o "unsynced data
2800: 0a 2a 2a 20 20 20 68 61 73 20 62 65 65 6e 20 77  .**   has been w
2810: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
2820: 75 72 6e 61 6c 22 2e 0a 2a 2a 0a 2a 2a 20 73 75  urnal"..**.** su
2830: 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a  bjInMemory.**.**
2840: 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f 6f     This is a boo
2850: 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20 49  lean variable. I
2860: 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79  f true, then any
2870: 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a 6f   required sub-jo
2880: 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f 70  urnal.**   is op
2890: 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65  ened as an in-me
28a0: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  mory journal fil
28b0: 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68 65  e. If false, the
28c0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20  n in-memory.**  
28d0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61 72   sub-journals ar
28e0: 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20  e only used for 
28f0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20  in-memory pager 
2900: 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  files..*/.struct
2910: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
2920: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
2930: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
2940: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
2950: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63  r IO */.  u8 exc
2960: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
2970: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
2980: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
2990: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
29a0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
29b0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
29c0: 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68 65 20     /* On of the 
29d0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
29e0: 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  E_* values */.  
29f0: 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20  u8 useJournal;  
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
2a10: 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  se a rollback jo
2a20: 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69  urnal on this fi
2a30: 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61  le */.  u8 noRea
2a40: 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  dlock;          
2a50: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f      /* Do not bo
2a60: 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72  ther to obtain r
2a70: 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38  eadlocks */.  u8
2a80: 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20   noSync;        
2a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
2aa0: 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  not sync the jou
2ab0: 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a  rnal if true */.
2ac0: 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20    u8 fullSync;  
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ae0: 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20   Do extra syncs 
2af0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2b00: 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f  or robustness */
2b10: 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c 61 67 73  .  u8 sync_flags
2b20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2b30: 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e 4f  * One of SYNC_NO
2b40: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
2b50: 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69  L */.  u8 tempFi
2b60: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
2b70: 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
2b80: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
2b90: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64  ile */.  u8 read
2ba0: 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20  Only;           
2bb0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
2bc0: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
2bd0: 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d 65  abase */.  u8 me
2be0: 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  mDb;            
2bf0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
2c00: 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69  o inhibit all fi
2c10: 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a 20  le I/O */..  /* 
2c20: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
2c30: 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f  ock contains tho
2c40: 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73  se class members
2c50: 20 74 68 61 74 20 61 72 65 20 64 79 6e 61 6d 69   that are dynami
2c60: 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f 64 69 66  cally.  ** modif
2c70: 69 65 64 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61  ied during norma
2c80: 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 54 68  l operations. Th
2c90: 65 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65  e other variable
2ca0: 73 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  s in this struct
2cb0: 75 72 65 0a 20 20 2a 2a 20 61 72 65 20 65 69 74  ure.  ** are eit
2cc0: 68 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 72  her constant thr
2cd0: 6f 75 67 68 6f 75 74 20 74 68 65 20 6c 69 66 65  oughout the life
2ce0: 74 69 6d 65 20 6f 66 20 74 68 65 20 70 61 67 65  time of the page
2cf0: 72 2c 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20  r, or else.  ** 
2d00: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 63 6f  used to store co
2d10: 6e 66 69 67 75 72 61 74 69 6f 6e 20 70 61 72 61  nfiguration para
2d20: 6d 65 74 65 72 73 20 74 68 61 74 20 61 66 66 65  meters that affe
2d30: 63 74 20 74 68 65 20 77 61 79 20 74 68 65 20 70  ct the way the p
2d40: 61 67 65 72 20 0a 20 20 2a 2a 20 6f 70 65 72 61  ager .  ** opera
2d50: 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  tes..  **.  ** T
2d60: 68 65 20 27 73 74 61 74 65 27 20 76 61 72 69 61  he 'state' varia
2d70: 62 6c 65 20 69 73 20 64 65 73 63 72 69 62 65 64  ble is described
2d80: 20 69 6e 20 6d 6f 72 65 20 64 65 74 61 69 6c 20   in more detail 
2d90: 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 0a 20  along with the. 
2da0: 20 2a 2a 20 64 65 73 63 72 69 70 74 69 6f 6e 73   ** descriptions
2db0: 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20 69   of the values i
2dc0: 74 20 6d 61 79 20 74 61 6b 65 20 2d 20 50 41 47  t may take - PAG
2dd0: 45 52 5f 55 4e 4c 4f 43 4b 20 65 74 63 2e 20 4d  ER_UNLOCK etc. M
2de0: 61 6e 79 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  any of the.  ** 
2df0: 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65 73 20  other variables 
2e00: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
2e10: 65 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74  e described in t
2e20: 68 65 20 63 6f 6d 6d 65 6e 74 20 64 69 72 65 63  he comment direc
2e30: 74 6c 79 20 0a 20 20 2a 2a 20 61 62 6f 76 65 20  tly .  ** above 
2e40: 74 68 69 73 20 63 6c 61 73 73 20 64 65 66 69 6e  this class defin
2e50: 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 75 38  ition..  */.  u8
2e60: 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20   state;         
2e70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
2e80: 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52  ER_UNLOCK, _SHAR
2e90: 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20 65  ED, _RESERVED, e
2ea0: 74 63 2e 20 2a 2f 0a 20 20 75 38 20 64 62 4d 6f  tc. */.  u8 dbMo
2eb0: 64 69 66 69 65 64 3b 20 20 20 20 20 20 20 20 20  dified;         
2ec0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2ed0: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 63 68  there are any ch
2ee0: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 44 62 20  anges to the Db 
2ef0: 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63  */.  u8 needSync
2f00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f10: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66   /* True if an f
2f20: 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64  sync() is needed
2f30: 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
2f40: 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53  */.  u8 journalS
2f50: 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20 20  tarted;         
2f60: 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61 64   /* True if head
2f70: 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73  er of journal is
2f80: 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20   synced */.  u8 
2f90: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b  changeCountDone;
2fa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
2fb0: 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69  after incrementi
2fc0: 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  ng the change-co
2fd0: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65  unter */.  u8 se
2fe0: 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  tMaster;        
2ff0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3000: 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73  f a m-j name has
3010: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
3020: 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f   jrnl */.  u8 do
3030: 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20 20  NotSync;        
3040: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
3050: 6e 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20 64  n. While true, d
3060: 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20  o not spill the 
3070: 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 64 62  cache */.  u8 db
3080: 53 69 7a 65 56 61 6c 69 64 3b 20 20 20 20 20 20  SizeValid;      
3090: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 77 68         /* Set wh
30a0: 65 6e 20 64 62 53 69 7a 65 20 69 73 20 63 6f 72  en dbSize is cor
30b0: 72 65 63 74 20 2a 2f 0a 20 20 75 38 20 73 75 62  rect */.  u8 sub
30c0: 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20 20  jInMemory;      
30d0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
30e0: 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   use in-memory s
30f0: 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20  ub-journals */. 
3100: 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20   Pgno dbSize;   
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3120: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
3130: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
3140: 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69 67  */.  Pgno dbOrig
3150: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
3160: 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72   /* dbSize befor
3170: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  e the current tr
3180: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50  ansaction */.  P
3190: 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b 20  gno dbFileSize; 
31a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
31b0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
31c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31d0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43  le */.  int errC
31e0: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
31f0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65      /* One of se
3200: 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65  veral kinds of e
3210: 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  rrors */.  int n
3220: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
3230: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20         /* Pages 
3240: 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63 65  journalled since
3250: 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20 77   last j-header w
3260: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32 20  ritten */.  u32 
3270: 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20  cksumInit;      
3280: 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69          /* Quasi
3290: 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64  -random value ad
32a0: 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65  ded to every che
32b0: 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20 6e  cksum */.  u32 n
32c0: 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20 20  SubRec;         
32d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
32e0: 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69 74   of records writ
32f0: 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72 6e  ten to sub-journ
3300: 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  al */.  Bitvec *
3310: 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  pInJournal;     
3320: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
3330: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
3340: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
3350: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
3360: 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20 20  ile *fd;        
3370: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
3380: 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62 61  iptor for databa
3390: 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
33a0: 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20  file *jfd;      
33b0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
33c0: 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e 20  riptor for main 
33d0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c  journal */.  sql
33e0: 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64 3b  ite3_file *sjfd;
33f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
3400: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
3410: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  sub-journal */. 
3420: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b   i64 journalOff;
3430: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3440: 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f 66  Current write of
3450: 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  fset in the jour
3460: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
3470: 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20  4 journalHdr;   
3480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
3490: 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76  e offset to prev
34a0: 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61  ious journal hea
34b0: 64 65 72 20 2a 2f 0a 20 20 50 61 67 65 72 53 61  der */.  PagerSa
34c0: 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70 6f  vepoint *aSavepo
34d0: 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f 66  int; /* Array of
34e0: 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
34f0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 76  ts */.  int nSav
3500: 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 20  epoint;         
3510: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3520: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53 61   elements in aSa
3530: 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20 63  vepoint[] */.  c
3540: 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31  har dbFileVers[1
3550: 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68  6];        /* Ch
3560: 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64  anges whenever d
3570: 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
3580: 6e 67 65 73 20 2a 2f 0a 20 20 75 33 32 20 73 65  nges */.  u32 se
3590: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
35a0: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
35b0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
35c0: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
35d0: 0a 20 20 75 31 36 20 6e 45 78 74 72 61 3b 20 20  .  u16 nExtra;  
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35f0: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
3600: 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e  bytes to each in
3610: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
3620: 20 20 69 31 36 20 6e 52 65 73 65 72 76 65 3b 20    i16 nReserve; 
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3640: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
3650: 64 20 62 79 74 65 73 20 61 74 20 65 6e 64 20 6f  d bytes at end o
3660: 66 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  f each page */. 
3670: 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20 20   u32 vfsFlags;  
3680: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3690: 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65  Flags for sqlite
36a0: 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
36b0: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
36e0: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
36f0: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3710: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
3720: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
3730: 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  base */.  char *
3740: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
3750: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
3760: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3770: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
3780: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
3790: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
37a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
37b0: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
37c0: 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b  Handler)(void*);
37d0: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
37e0: 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a  call when busy *
37f0: 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
3800: 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20  andlerArg;      
3810: 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d  /* Context argum
3820: 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e  ent for xBusyHan
3830: 64 6c 65 72 20 2a 2f 0a 23 69 66 64 65 66 20 53  dler */.#ifdef S
3840: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
3850: 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20   nHit, nMiss;   
3860: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68           /* Cach
3870: 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73 69  e hits and missi
3880: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61  ng */.  int nRea
3890: 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20  d, nWrite;      
38a0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
38b0: 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74  pages read/writt
38c0: 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76  en */.#endif.  v
38d0: 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29  oid (*xReiniter)
38e0: 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61  (DbPage*); /* Ca
38f0: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
3900: 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70  when reloading p
3910: 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53  ages */.#ifdef S
3920: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
3930: 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63    void *(*xCodec
3940: 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
3950: 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74  no,int); /* Rout
3960: 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64  ine for en/decod
3970: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  ing data */.  vo
3980: 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43  id (*xCodecSizeC
3990: 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69  hng)(void*,int,i
39a0: 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f  nt); /* Notify o
39b0: 66 20 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e  f page size chan
39c0: 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ges */.  void (*
39d0: 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64  xCodecFree)(void
39e0: 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *);             
39f0: 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f  /* Destructor fo
3a00: 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20  r the codec */. 
3a10: 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20   void *pCodec;  
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3a30: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
3a40: 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68  o xCodec... meth
3a50: 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ods */.#endif.  
3a60: 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b  char *pTmpSpace;
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3a80: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79  ager.pageSize by
3a90: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
3aa0: 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 69 36   tmp use */.  i6
3ab0: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  4 journalSizeLim
3ac0: 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  it;       /* Siz
3ad0: 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73  e limit for pers
3ae0: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
3af0: 69 6c 65 73 20 2a 2f 0a 20 20 50 43 61 63 68 65  iles */.  PCache
3b00: 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20   *pPCache;      
3b10: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
3b20: 20 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f   to page cache o
3b30: 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
3b40: 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b  e3_backup *pBack
3b50: 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  up;    /* Pointe
3b60: 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67  r to list of ong
3b70: 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63  oing backup proc
3b80: 65 73 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  esses */.};../*.
3b90: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
3ba0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
3bb0: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
3bc0: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
3bd0: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
3be0: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
3bf0: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
3c00: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
3c10: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
3c20: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
3c30: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
3c40: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
3c50: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
3c60: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
3c70: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
3c80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
3c90: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
3ca0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
3cb0: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
3cc0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
3cd0: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
3ce0: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
3cf0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
3d00: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
3d10: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
3d20: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
3d30: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
3d40: 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  nal */.# define 
3d50: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
3d60: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
3d70: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
3d80: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
3d90: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
3da0: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
3db0: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
3dc0: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
3dd0: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
3de0: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
3df0: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
3e00: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
3e10: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
3e20: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
3e30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
3e40: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
3e50: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
3e60: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
3e70: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
3e80: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
3e90: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
3ea0: 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e  being.** written
3eb0: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
3ec0: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
3ed0: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
3ee0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
3ef0: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
3f00: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
3f10: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
3f20: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
3f30: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
3f40: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
3f50: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
3f60: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
3f70: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
3f80: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
3f90: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
3fa0: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
3fb0: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
3fc0: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
3fd0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
3fe0: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
3ff0: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
4000: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
4010: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
4020: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
4030: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
4040: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
4050: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
4060: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
4070: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
4080: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
4090: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
40a0: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
40b0: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
40c0: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
40d0: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
40e0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
40f0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
4100: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
4110: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
4120: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
4130: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
4140: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
4150: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
4160: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
4170: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
4180: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
4190: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
41a0: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
41b0: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
41c0: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
41d0: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
41e0: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
41f0: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
4200: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
4210: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
4220: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
4230: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
4240: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
4250: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
4260: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
4270: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
4280: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
4290: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
42a0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
42b0: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
42c0: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
42d0: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
42e0: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
42f0: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
4300: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
4310: 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63  ze of the of eac
4320: 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e  h page record in
4330: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
4340: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20  given by.** the 
4350: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e  following macro.
4360: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
4370: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
4380: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
4390: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
43a0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
43b0: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
43c0: 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20  his pager. This 
43d0: 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73  is usually the s
43e0: 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20  ame .** size as 
43f0: 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
4400: 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73  ctor. See also s
4410: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a  etSectorSize()..
4420: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
4430: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
4440: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
4450: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
4460: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
4470: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
4480: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
4490: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
44a0: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
44b0: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
44c0: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
44d0: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
44e0: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
44f0: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
4500: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
4510: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
4520: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
4530: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
4540: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
4550: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
4560: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
4570: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
4580: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
4590: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
45a0: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
45b0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
45c0: 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20  e maximum legal 
45d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28  page number is (
45e0: 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64  2^31 - 1)..*/.#d
45f0: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f  efine PAGER_MAX_
4600: 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a  PGNO 2147483647.
4610: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
4620: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a  ./*.** Usage:.**
4630: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73  .**   assert( as
4640: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
4650: 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2f 0a 73  (pPager) );.*/.s
4660: 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74  tatic int assert
4670: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67  _pager_state(Pag
4680: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20  er *pPager){..  
4690: 2f 2a 20 41 20 74 65 6d 70 2d 66 69 6c 65 20 69  /* A temp-file i
46a0: 73 20 61 6c 77 61 79 73 20 69 6e 20 50 41 47 45  s always in PAGE
46b0: 52 5f 45 58 43 4c 55 53 49 56 45 20 6f 72 20 50  R_EXCLUSIVE or P
46c0: 41 47 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74  AGER_SYNCED stat
46d0: 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
46e0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
46f0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ==0 || pPager->s
4700: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
4710: 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 54  USIVE );..  /* T
4720: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
4730: 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79  ne flag is alway
4740: 73 20 73 65 74 20 66 6f 72 20 74 65 6d 70 2d 66  s set for temp-f
4750: 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  iles */.  assert
4760: 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
4770: 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  le==0 || pPager-
4780: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
4790: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b   );..  return 1;
47a0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
47b0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
47c0: 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
47d0: 74 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70  to write page *p
47e0: 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  Pg into the sub-
47f0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61  journal..** A pa
4800: 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77  ge needs to be w
4810: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4820: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74  sub-journal if t
4830: 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a  here exists one.
4840: 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20  ** or more open 
4850: 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77  savepoints for w
4860: 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  hich:.**.**   * 
4870: 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  The page-number 
4880: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
4890: 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61  equal to PagerSa
48a0: 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61  vepoint.nOrig, a
48b0: 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69  nd.**   * The bi
48c0: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
48d0: 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  to the page-numb
48e0: 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e  er is not set in
48f0: 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
4900: 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
4910: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
4920: 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  nt subjRequiresP
4930: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
4940: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
4950: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  Pg->pgno;.  Page
4960: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
4970: 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69  >pPager;.  int i
4980: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
4990: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
49a0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67  t; i++){.    Pag
49b0: 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d  erSavepoint *p =
49c0: 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
49d0: 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28  oint[i];.    if(
49e0: 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20   p->nOrig>=pgno 
49f0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74  && 0==sqlite3Bit
4a00: 76 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61  vecTest(p->pInSa
4a10: 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29  vepoint, pgno) )
4a20: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
4a30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
4a40: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
4a50: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
4a60: 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65  the page is alre
4a70: 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
4a80: 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  al file..*/.stat
4a90: 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75  ic int pageInJou
4aa0: 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29  rnal(PgHdr *pPg)
4ab0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
4ac0: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 67  e3BitvecTest(pPg
4ad0: 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ->pPager->pInJou
4ae0: 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
4af0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
4b00: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
4b10: 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20   from the given 
4b20: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
4b30: 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65    Store the inte
4b40: 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72  ger.** that is r
4b50: 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52  ead in *pRes.  R
4b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
4b70: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
4b80: 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65  rked, or an.** e
4b90: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
4ba0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
4bb0: 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c  g..**.** All val
4bc0: 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f  ues are stored o
4bd0: 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e  n disk as big-en
4be0: 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dian..*/.static 
4bf0: 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73  int read32bits(s
4c00: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
4c10: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
4c20: 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67   *pRes){.  unsig
4c30: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
4c40: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
4c50: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c  e3OsRead(fd, ac,
4c60: 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66   sizeof(ac), off
4c70: 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
4c80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4c90: 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33   *pRes = sqlite3
4ca0: 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20  Get4byte(ac);.  
4cb0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4cc0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
4cd0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
4ce0: 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66  nto a string buf
4cf0: 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  fer in big-endia
4d00: 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f  n byte order..*/
4d10: 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69  .#define put32bi
4d20: 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33  ts(A,B)  sqlite3
4d30: 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c  Put4byte((u8*)A,
4d40: 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  B)../*.** Write 
4d50: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
4d60: 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20   into the given 
4d70: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
4d80: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
4d90: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
4da0: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
4db0: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
4dc0: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
4dd0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
4de0: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
4df0: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
4e00: 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63  t, u32 val){.  c
4e10: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74  har ac[4];.  put
4e20: 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b  32bits(ac, val);
4e30: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
4e40: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
4e50: 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a   4, offset);.}..
4e60: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
4e70: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
4e80: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
4e90: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
4ea0: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
4eb0: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
4ec0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
4ed0: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
4ee0: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
4ef0: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
4f00: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
4f10: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
4f20: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
4f30: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
4f40: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
4f50: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
4f60: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
4f70: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
4f80: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
4f90: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
4fa0: 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a  ->pMethods)../*.
4fb0: 2a 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20 69  ** If file pFd i
4fc0: 73 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c  s open, call sql
4fd0: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f  ite3OsUnlock() o
4fe0: 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  n it..*/.static 
4ff0: 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c  int osUnlock(sql
5000: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20  ite3_file *pFd, 
5010: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66  int eLock){.  if
5020: 28 20 21 69 73 4f 70 65 6e 28 70 46 64 29 20 29  ( !isOpen(pFd) )
5030: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
5040: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
5050: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e  turn sqlite3OsUn
5060: 6c 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29  lock(pFd, eLock)
5070: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
5080: 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69  function determi
5090: 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e  nes whether or n
50a0: 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ot the atomic-wr
50b0: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
50c0: 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20  .** can be used 
50d0: 77 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e  with this pager.
50e0: 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   The optimizatio
50f0: 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66  n can be used if
5100: 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65  :.**.**  (a) the
5110: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
5120: 62 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61  by OsDeviceChara
5130: 63 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64  cteristics() ind
5140: 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20  icates that.**  
5150: 20 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70      a database p
5160: 61 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74  age may be writt
5170: 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61  en atomically, a
5180: 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76  nd.**  (b) the v
5190: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
51a0: 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20   OsSectorSize() 
51b0: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
51c0: 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f  equal.**      to
51d0: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a   the page size..
51e0: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69  **.** The optimi
51f0: 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61  zation is also a
5200: 6c 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f  lways enabled fo
5210: 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
5220: 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65  s. It is.** an e
5230: 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69  rror to call thi
5240: 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50  s function if pP
5250: 61 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f  ager is opened o
5260: 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  n an in-memory.*
5270: 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  * database..**.*
5280: 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  * If the optimiz
5290: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
52a0: 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72  used, 0 is retur
52b0: 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62  ned. If it can b
52c0: 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  e used,.** then 
52d0: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
52e0: 65 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ed is the size o
52f0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
5300: 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f  le when it.** co
5310: 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20  ntains rollback 
5320: 64 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79  data for exactly
5330: 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   one page..*/.#i
5340: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5350: 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
5360: 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42  static int jrnlB
5370: 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20  ufferSize(Pager 
5380: 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65  *pPager){.  asse
5390: 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
53a0: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
53b0: 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  pFile ){.    int
53c0: 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   dc;            
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
53e0: 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74  * Device charact
53f0: 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20  eristics */.    
5400: 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20  int nSector;    
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5420: 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65    /* Sector size
5430: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61   */.    int szPa
5440: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
5450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
5460: 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61  e size */..    a
5470: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
5480: 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20  ager->fd) );.   
5490: 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   dc = sqlite3OsD
54a0: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
54b0: 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
54c0: 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20  ;.    nSector = 
54d0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
54e0: 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d  ze;.    szPage =
54f0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
5500: 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53  e;..    assert(S
5510: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
5520: 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
5530: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c  ;.    assert(SQL
5540: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
5550: 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29  64K==(65536>>8))
5560: 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63  ;.    if( 0==(dc
5570: 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
5580: 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38  TOMIC|(szPage>>8
5590: 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a  )) || nSector>sz
55a0: 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72  Page) ){.      r
55b0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
55c0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55   }..  return JOU
55d0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
55e0: 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47  er) + JOURNAL_PG
55f0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23  _SZ(pPager);.}.#
5600: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
5610: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
5620: 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68  ES is defined th
5630: 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61  en we do some sa
5640: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  nity checking.**
5650: 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73   on the cache us
5660: 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74  ing a hash funct
5670: 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73  ion.  This is us
5680: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a  ed for testing.*
5690: 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  * and debugging 
56a0: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  only..*/.#ifdef 
56b0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
56c0: 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ES./*.** Return 
56d0: 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66  a 32-bit hash of
56e0: 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66   the page data f
56f0: 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  or pPage..*/.sta
5700: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61  tic u32 pager_da
5710: 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65  tahash(int nByte
5720: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
5730: 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68  *pData){.  u32 h
5740: 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ash = 0;.  int i
5750: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
5760: 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Byte; i++){.    
5770: 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33  hash = (hash*103
5780: 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20  9) + pData[i];. 
5790: 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68   }.  return hash
57a0: 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70  ;.}.static u32 p
57b0: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67  ager_pagehash(Pg
57c0: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72  Hdr *pPage){.  r
57d0: 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61  eturn pager_data
57e0: 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67  hash(pPage->pPag
57f0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75  er->pageSize, (u
5800: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
5810: 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a  Page->pData);.}.
5820: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
5830: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50  r_set_pagehash(P
5840: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
5850: 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20  pPage->pageHash 
5860: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
5870: 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pPage);.}../*.*
5880: 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45  * The CHECK_PAGE
5890: 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50   macro takes a P
58a0: 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75  gHdr* as an argu
58b0: 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f  ment. If SQLITE_
58c0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69  CHECK_PAGES.** i
58d0: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e  s defined, and N
58e0: 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66  DEBUG is not def
58f0: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
5900: 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63  ) statement chec
5910: 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  ks.** that the p
5920: 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69  age is either di
5930: 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74  rty or still mat
5940: 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61  ches the calcula
5950: 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a  ted page-hash..*
5960: 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  /.#define CHECK_
5970: 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67  PAGE(x) checkPag
5980: 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64  e(x).static void
5990: 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72   checkPage(PgHdr
59a0: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
59b0: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
59c0: 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28  Pager;.  assert(
59d0: 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20   !pPg->pageHash 
59e0: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
59f0: 64 65 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67  de.      || (pPg
5a00: 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
5a10: 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67  RTY) || pPg->pag
5a20: 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67  eHash==pager_pag
5a30: 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a  ehash(pPg) );.}.
5a40: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70  .#else.#define p
5a50: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c  ager_datahash(X,
5a60: 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61  Y)  0.#define pa
5a70: 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20  ger_pagehash(X) 
5a80: 20 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b   0.#define CHECK
5a90: 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20  _PAGE(x).#endif 
5aa0: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   /* SQLITE_CHECK
5ab0: 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _PAGES */../*.**
5ac0: 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
5ad0: 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lled the journal
5ae0: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
5af0: 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f  pPager must be o
5b00: 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e  pen..** This fun
5b10: 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
5b20: 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20  o read a master 
5b30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
5b40: 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65  e from the .** e
5b50: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61  nd of the file a
5b60: 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75  nd, if successfu
5b70: 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74  l, copies it int
5b80: 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65  o memory supplie
5b90: 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  d .** by the cal
5ba0: 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ler. See comment
5bb0: 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73  s above writeMas
5bc0: 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72  terJournal() for
5bd0: 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75   the format.** u
5be0: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d  sed to store a m
5bf0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
5c00: 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65  le name at the e
5c10: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
5c20: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73  file..**.** zMas
5c30: 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ter must point t
5c40: 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74  o a buffer of at
5c50: 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62   least nMaster b
5c60: 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ytes allocated b
5c70: 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e  y.** the caller.
5c80: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
5c90: 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
5ca0: 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73  thname+1 (to ens
5cb0: 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  ure there is.** 
5cc0: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20  enough space to 
5cd0: 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  write the master
5ce0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20   journal name). 
5cf0: 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  If the master jo
5d00: 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e  urnal.** name in
5d10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
5d20: 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73  longer than nMas
5d30: 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75  ter bytes (inclu
5d40: 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65  ding a.** nul-te
5d50: 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20  rminator), then 
5d60: 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20  this is handled 
5d70: 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20  as if no master 
5d80: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20  journal name.** 
5d90: 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20  were present in 
5da0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
5db0: 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
5dc0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
5dd0: 20 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74   is present at t
5de0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
5df0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74  urnal.** file, t
5e00: 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64  hen it is copied
5e10: 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72   into the buffer
5e20: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
5e30: 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c  Master. A.** nul
5e40: 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
5e50: 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20   is appended to 
5e60: 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f  the buffer follo
5e70: 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a  wing the master.
5e80: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
5e90: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  name..**.** If i
5ea0: 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  t is determined 
5eb0: 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a  that no master j
5ec0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
5ed0: 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20   is present .** 
5ee0: 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65  zMaster[0] is se
5ef0: 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
5f00: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
5f10: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
5f20: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65   occurs while re
5f30: 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a  ading from the j
5f40: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20  ournal file, an 
5f50: 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20  SQLite.** error 
5f60: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
5f70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5f80: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
5f90: 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
5fa0: 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61  pJrnl, char *zMa
5fb0: 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65  ster, u32 nMaste
5fc0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fe0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
5ff0: 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20  */.  u32 len;   
6000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6010: 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74  /* Length in byt
6020: 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  es of master jou
6030: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  rnal name */.  i
6040: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
6050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
6060: 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  al size in bytes
6070: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   of journal file
6080: 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20   pJrnl */.  u32 
6090: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
60a0: 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65         /* MJ che
60b0: 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64  cksum value read
60c0: 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f   from journal */
60d0: 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
60f0: 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
6100: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69  ounter */.  unsi
6110: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
6120: 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66  [8];   /* A buff
6130: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
6140: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
6150: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c   zMaster[0] = '\
6160: 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54  0';..  if( SQLIT
6170: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
6180: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a  te3OsFileSize(pJ
6190: 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c  rnl, &szJ)).   |
61a0: 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53  | szJ<16.   || S
61b0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
61c0: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
61d0: 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29  , szJ-16, &len))
61e0: 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73  .   || len>=nMas
61f0: 74 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54  ter .   || SQLIT
6200: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
6210: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a  32bits(pJrnl, sz
6220: 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20  J-12, &cksum)). 
6230: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
6240: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52  (rc = sqlite3OsR
6250: 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69  ead(pJrnl, aMagi
6260: 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20  c, 8, szJ-8)).  
6270: 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69   || memcmp(aMagi
6280: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
6290: 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  , 8).   || SQLIT
62a0: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
62b0: 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c  te3OsRead(pJrnl,
62c0: 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73   zMaster, len, s
62d0: 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b  zJ-16-len)).  ){
62e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
62f0: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66    }..  /* See if
6300: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61   the checksum ma
6310: 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72  tches the master
6320: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f   journal name */
6330: 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65  .  for(u=0; u<le
6340: 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  n; u++){.    cks
6350: 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d  um -= zMaster[u]
6360: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75  ;.  }.  if( cksu
6370: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  m ){.    /* If t
6380: 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73  he checksum does
6390: 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e  n't add up, then
63a0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
63b0: 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73  the disk sectors
63c0: 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  .    ** containi
63d0: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
63e0: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
63f0: 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  s corrupted. Thi
6400: 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64  s means.    ** d
6410: 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62  efinitely roll b
6420: 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74  ack, so just ret
6430: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
6440: 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29  d report a (nul)
6450: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  .    ** master-j
6460: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  ournal filename.
6470: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20  .    */.    len 
6480: 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  = 0;.  }.  zMast
6490: 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a  er[len] = '\0';.
64a0: 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c     .  return SQL
64b0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
64c0: 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73   Return the offs
64d0: 65 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  et of the sector
64e0: 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20   boundary at or 
64f0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20  immediately .** 
6500: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61  following the va
6510: 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a  lue in pPager->j
6520: 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d  ournalOff, assum
6530: 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a  ing a sector .**
6540: 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d   size of pPager-
6550: 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65  >sectorSize byte
6560: 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72  s..**.** i.e for
6570: 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f   a sector size o
6580: 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50  f 512:.**.**   P
6590: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
65a0: 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20           Return 
65b0: 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  value.**   -----
65c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65e0: 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20  --.**   0       
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6600: 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20    0.**   512    
6610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6620: 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20     512.**   100 
6630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6640: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32        512.**   2
6650: 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  000             
6660: 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a           2048.**
6670: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20   .*/.static i64 
6680: 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
6690: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
66a0: 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20  .  i64 offset = 
66b0: 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61  0;.  i64 c = pPa
66c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
66d0: 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20  .  if( c ){.    
66e0: 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f  offset = ((c-1)/
66f0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
6700: 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f  Pager) + 1) * JO
6710: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
6720: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ger);.  }.  asse
6730: 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e  rt( offset%JOURN
6740: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
6750: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
6760: 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20  ( offset>=c );. 
6770: 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74   assert( (offset
6780: 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -c)<JOURNAL_HDR_
6790: 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
67a0: 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d  return offset;.}
67b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
67c0: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
67d0: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
67e0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
67f0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ed..**.** This f
6800: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
6810: 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  op if the journa
6820: 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62  l file has not b
6830: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a  een written to.*
6840: 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72  * within the cur
6850: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
6860: 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e   (i.e. if Pager.
6870: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a  journalOff==0)..
6880: 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63  **.** If doTrunc
6890: 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  ate is non-zero 
68a0: 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75  or the Pager.jou
68b0: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61  rnalSizeLimit va
68c0: 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74  riable is.** set
68d0: 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e   to 0, then trun
68e0: 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
68f0: 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79   file to zero by
6900: 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68  tes in size. Oth
6910: 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20  erwise,.** zero 
6920: 74 68 65 20 32 38 2d 62 79 74 65 20 68 65 61 64  the 28-byte head
6930: 65 72 20 61 74 20 74 68 65 20 73 74 61 72 74 20  er at the start 
6940: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
6950: 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63  ile. In either c
6960: 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20  ase, .** if the 
6970: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
6980: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79  no-sync mode, sy
6990: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
69a0: 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ile immediately 
69b0: 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e  .** after writin
69c0: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
69d0: 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67  it..**.** If Pag
69e0: 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  er.journalSizeLi
69f0: 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20 61 20  mit is set to a 
6a00: 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65  positive, non-ze
6a10: 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a  ro value, and.**
6a20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74   following the t
6a30: 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72  runcation or zer
6a40: 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64 20 61  oing described a
6a50: 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66  bove the size of
6a60: 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c   the .** journal
6a70: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69   file in bytes i
6a80: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
6a90: 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  is value, then t
6aa0: 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a  runcate the.** j
6ab0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50  ournal file to P
6ac0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
6ad0: 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65  Limit bytes. The
6ae0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
6af0: 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74  es.** not need t
6b00: 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c  o be synced foll
6b10: 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61  owing this opera
6b20: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tion..**.** If a
6b30: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
6b40: 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65  s, abandon proce
6b50: 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  ssing and return
6b60: 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
6b70: 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  de..** Otherwise
6b80: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
6b90: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
6ba0: 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  t zeroJournalHdr
6bb0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
6bc0: 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b  int doTruncate){
6bd0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
6be0: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c00: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
6c10: 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ode */.  assert(
6c20: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
6c30: 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50  jfd) );.  if( pP
6c40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6c50: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36   ){.    const i6
6c60: 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65  4 iLimit = pPage
6c70: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
6c80: 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  mit;    /* Local
6c90: 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f   cache of jsl */
6ca0: 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ..    IOTRACE(("
6cb0: 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20  JZEROHDR %p\n", 
6cc0: 70 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28  pPager)).    if(
6cd0: 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69   doTruncate || i
6ce0: 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Limit==0 ){.    
6cf0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6d00: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
6d10: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65  >jfd, 0);.    }e
6d20: 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69  lse{.      stati
6d30: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72  c const char zer
6d40: 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a  oHdr[28] = {0};.
6d50: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6d60: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
6d70: 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20  ->jfd, zeroHdr, 
6d80: 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c  sizeof(zeroHdr),
6d90: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
6da0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6db0: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
6dc0: 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
6dd0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
6de0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
6df0: 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
6e00: 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  Y|pPager->sync_f
6e10: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  lags);.    }..  
6e20: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
6e30: 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nt the transacti
6e40: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  on is committed 
6e50: 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f  but the write lo
6e60: 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  ck .    ** is st
6e70: 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ill held on the 
6e80: 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
6e90: 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63  s a size limit c
6ea0: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20  onfigured for . 
6eb0: 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73     ** the persis
6ec0: 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  tent journal and
6ed0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6ee0: 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73  e currently cons
6ef0: 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a  umes more.    **
6f00: 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74   space than that
6f10: 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f   limit allows fo
6f20: 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e  r, truncate it n
6f30: 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  ow. There is no 
6f40: 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73  need.    ** to s
6f50: 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c  ync the file fol
6f60: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
6f70: 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
6f80: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6f90: 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20  _OK && iLimit>0 
6fa0: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b  ){.      i64 sz;
6fb0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
6fc0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
6fd0: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b  ager->jfd, &sz);
6fe0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
6ff0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69  QLITE_OK && sz>i
7000: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
7010: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
7020: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
7030: 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  jfd, iLimit);.  
7040: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7050: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7060: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
7070: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
7080: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f  pen when this ro
7090: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
70a0: 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65   A journal.** he
70b0: 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  ader (JOURNAL_HD
70c0: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77  R_SZ bytes) is w
70d0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
70e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20  journal file at 
70f0: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c  the.** current l
7100: 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
7110: 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68  he format for th
7120: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
7130: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
7140: 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61  ** - 8 bytes: Ma
7150: 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20  gic identifying 
7160: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a  journal format..
7170: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75  ** - 4 bytes: Nu
7180: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
7190: 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d  in journal, or -
71a0: 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69  1 no-sync mode i
71b0: 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  s on..** - 4 byt
71c0: 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65  es: Random numbe
71d0: 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20  r used for page 
71e0: 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  hash..** - 4 byt
71f0: 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61  es: Initial data
7200: 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e  base page count.
7210: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53  .** - 4 bytes: S
7220: 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20  ector size used 
7230: 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  by the process t
7240: 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a  hat wrote this j
7250: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62  ournal..** - 4 b
7260: 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70  ytes: Database p
7270: 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a  age size..** .**
7280: 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f   Followed by (JO
7290: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
72a0: 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73  8) bytes of unus
72b0: 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  ed space..*/.sta
72c0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75  tic int writeJou
72d0: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
72e0: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
72f0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
7300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7310: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
7320: 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20    char *zHeader 
7330: 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
7340: 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61  ace;  /* Tempora
7350: 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f  ry space used to
7360: 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f   build header */
7370: 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d  .  u32 nHeader =
7380: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
7390: 65 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  e;     /* Size o
73a0: 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  f buffer pointed
73b0: 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a   to by zHeader *
73c0: 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20  /.  u32 nWrite; 
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73e0: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
73f0: 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74 6f   of header secto
7400: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69  r written */.  i
7410: 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
7420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7430: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
7440: 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
7450: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
7460: 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20  jfd) );      /* 
7470: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  Journal file mus
7480: 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20  t be open. */.. 
7490: 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55   if( nHeader>JOU
74a0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
74b0: 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  er) ){.    nHead
74c0: 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  er = JOURNAL_HDR
74d0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
74e0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
74f0: 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70  are active savep
7500: 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66  oints and any of
7510: 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61 74   them were creat
7520: 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74  ed .  ** since t
7530: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a  he most recent j
7540: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61  ournal header wa
7550: 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74  s written, updat
7560: 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65  e the .  ** Page
7570: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
7580: 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77  ffset fields now
7590: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
75a0: 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
75b0: 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
75c0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
75d0: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
75e0: 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b  iHdrOffset==0 ){
75f0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
7600: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48  Savepoint[ii].iH
7610: 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  drOffset = pPage
7620: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
7630: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
7640: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
7650: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7660: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
7670: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
7680: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74  .  /* .  ** Writ
7690: 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64  e the nRec Field
76a0: 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66   - the number of
76b0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68   page records th
76c0: 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20  at follow this. 
76d0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
76e0: 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65  er. Normally, ze
76f0: 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ro is written to
7700: 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74   this value at t
7710: 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41  his time..  ** A
7720: 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73  fter the records
7730: 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68   are added to th
7740: 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74  e journal (and t
7750: 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65  he journal synce
7760: 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66  d, .  ** if in f
7770: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20  ull-sync mode), 
7780: 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72  the zero is over
7790: 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65  written with the
77a0: 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a   true number.  *
77b0: 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65  * of records (se
77c0: 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29  e syncJournal())
77d0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61  ..  **.  ** A fa
77e0: 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65  ster alternative
77f0: 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46   is to write 0xF
7800: 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e  FFFFFFF to the n
7810: 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a  Rec field. When.
7820: 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
7830: 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61   journal this va
7840: 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65  lue tells SQLite
7850: 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20   to assume that 
7860: 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66  the.  ** rest of
7870: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7880: 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64  e contains valid
7890: 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54   page records. T
78a0: 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20  his assumption. 
78b0: 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73   ** is dangerous
78c0: 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72  , as if a failur
78d0: 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73  e occurred whils
78e0: 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  t writing to the
78f0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
7900: 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69  le it may contai
7910: 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64  n some garbage d
7920: 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74  ata. There are t
7930: 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a  wo scenarios.  *
7940: 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73  * where this ris
7950: 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  k can be ignored
7960: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  :.  **.  **   * 
7970: 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69  When the pager i
7980: 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
7990: 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61  e. Corruption ca
79a0: 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20  n follow a.  ** 
79b0: 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72      power failur
79c0: 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61  e in this case a
79d0: 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nyway..  **.  **
79e0: 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51     * When the SQ
79f0: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
7a00: 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73  APPEND flag is s
7a10: 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  et. This guarant
7a20: 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61  ees.  **     tha
7a30: 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69  t garbage data i
7a40: 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64  s never appended
7a50: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
7a60: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  file..  */.  ass
7a70: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
7a80: 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
7a90: 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69  r->noSync );.  i
7aa0: 66 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( (pPager->noSy
7ab0: 6e 63 29 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  nc) || (pPager->
7ac0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
7ad0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
7ae0: 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71  EMORY).   || (sq
7af0: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
7b00: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
7b10: 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  ger->fd)&SQLITE_
7b20: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
7b30: 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d  D) .  ){.    mem
7b40: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
7b50: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
7b60: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7b70: 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74  ));.    put32bit
7b80: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
7b90: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
7ba0: 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a  ], 0xffffffff);.
7bb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 48 65    }else{.    zHe
7bc0: 61 64 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ader[0] = '\0';.
7bd0: 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
7be0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
7bf0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30  ournalMagic)], 0
7c00: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
7c10: 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61   random check-ha
7c20: 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a  sh initialiser *
7c30: 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  / .  sqlite3_ran
7c40: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
7c50: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
7c60: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
7c70: 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62  mInit);.  put32b
7c80: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
7c90: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
7ca0: 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63  c)+4], pPager->c
7cb0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20  ksumInit);.  /* 
7cc0: 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61  The initial data
7cd0: 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  base size */.  p
7ce0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
7cf0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
7d00: 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67  lMagic)+8], pPag
7d10: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b  er->dbOrigSize);
7d20: 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65  .  /* The assume
7d30: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f  d sector size fo
7d40: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a  r this process *
7d50: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
7d60: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
7d70: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d  ournalMagic)+12]
7d80: 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  , pPager->sector
7d90: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  Size);..  /* The
7da0: 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
7db0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
7dc0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
7dd0: 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50  alMagic)+16], pP
7de0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
7df0: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
7e00: 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20  ing the tail of 
7e10: 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f  the buffer is no
7e20: 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76  t necessary.  Ev
7e30: 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f  erything.  ** wo
7e40: 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20  rks find if the 
7e50: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74  following memset
7e60: 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20  () is omitted.  
7e70: 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  But initializing
7e80: 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79  .  ** the memory
7e90: 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69   prevents valgri
7ea0: 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e  nd from complain
7eb0: 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77  ing, so we are w
7ec0: 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74  illing to.  ** t
7ed0: 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ake the performa
7ee0: 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20  nce hit..  */.  
7ef0: 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b  memset(&zHeader[
7f00: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
7f10: 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20  agic)+20], 0,.  
7f20: 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28         nHeader-(
7f30: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
7f40: 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f  agic)+20));..  /
7f50: 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74 20  * In theory, it 
7f60: 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72  is only necessar
7f70: 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 32  y to write the 2
7f80: 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68 65  8 bytes that the
7f90: 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68   .  ** journal h
7fa0: 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20 74  eader consumes t
7fb0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
7fc0: 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69 6e  le here. Then in
7fd0: 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a  crement the .  *
7fe0: 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  * Pager.journalO
7ff0: 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20 4a  ff variable by J
8000: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f  OURNAL_HDR_SZ so
8010: 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 0a   that the next .
8020: 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 77    ** record is w
8030: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 6f  ritten to the fo
8040: 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20 28  llowing sector (
8050: 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69 6e  leaving a gap in
8060: 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74   the file.  ** t
8070: 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c  hat will be impl
8080: 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e  icitly filled in
8090: 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a   by the OS)..  *
80a0: 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 69  *.  ** However i
80b0: 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63 6f  t has been disco
80c0: 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73 6f  vered that on so
80d0: 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73 20  me systems this 
80e0: 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a  pattern can .  *
80f0: 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74  * be significant
8100: 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 63  ly slower than c
8110: 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69 74  ontiguously writ
8120: 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20  ing data to the 
8130: 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20  file,.  ** even 
8140: 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65 78  if that means ex
8150: 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e 67  plicitly writing
8160: 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c 6f   data to the blo
8170: 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55  ck of .  ** (JOU
8180: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
8190: 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69 6c  ) bytes that wil
81a0: 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 53  l not be used. S
81b0: 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a 20  o that is what. 
81c0: 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20   ** is done. .  
81d0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70  **.  ** The loop
81e0: 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65 72   is required her
81f0: 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 65  e in case the se
8200: 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72  ctor-size is lar
8210: 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ger than the .  
8220: 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ** database page
8230: 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68 65   size. Since the
8240: 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72 20   zHeader buffer 
8250: 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61  is only Pager.pa
8260: 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65  geSize.  ** byte
8270: 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20  s in size, more 
8280: 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f  than one call to
8290: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
82a0: 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72 65  ) may be require
82b0: 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61  d.  ** to popula
82c0: 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  te the entire jo
82d0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63  urnal header sec
82e0: 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  tor..  */ .  for
82f0: 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53  (nWrite=0; rc==S
8300: 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65  QLITE_OK&&nWrite
8310: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
8320: 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b  pPager); nWrite+
8330: 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49  =nHeader){.    I
8340: 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
8350: 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
8360: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
8370: 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72  rnalHdr, nHeader
8380: 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
8390: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
83a0: 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
83b0: 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65 72   nHeader, pPager
83c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
83d0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
83e0: 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72  alOff += nHeader
83f0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
8400: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
8410: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
8420: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
8430: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20  this is called. 
8440: 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  A journal header
8450: 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41   file.** (JOURNA
8460: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
8470: 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
8480: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
8490: 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n in the journal
84a0: 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75  .** file. The cu
84b0: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69  rrent location i
84c0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
84d0: 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a  le is given by.*
84e0: 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  * pPager->journa
84f0: 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  lOff. See commen
8500: 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f  ts above functio
8510: 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  n writeJournalHd
8520: 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73  r() for.** a des
8530: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
8540: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
8550: 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormat..**.** If 
8560: 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65  the header is re
8570: 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ad successfully,
8580: 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74   *pNRec is set t
8590: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
85a0: 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  ** page records 
85b0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68  following this h
85c0: 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69  eader and *pDbSi
85d0: 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
85e0: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
85f0: 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
8600: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
8610: 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e  began, in pages.
8620: 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63   Also, pPager->c
8630: 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73  ksumInit.** is s
8640: 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
8650: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
8660: 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51  urnal header. SQ
8670: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
8680: 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ned.** in this c
8690: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
86a0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
86b0: 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f   file appears to
86c0: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53   be corrupted, S
86d0: 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a  QLITE_DONE is.**
86e0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
86f0: 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a  NRec and *PDbSiz
8700: 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e  e are undefined.
8710: 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52    If JOURNAL_HDR
8720: 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e  _SZ bytes.** can
8730: 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d  not be read from
8740: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
8750: 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  e an error code 
8760: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
8770: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a  static int readJ
8780: 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67  ournalHdr(.  Pag
8790: 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
87a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
87b0: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
87c0: 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20  nt isHot,.  i64 
87d0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20  journalSize,    
87e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
87f0: 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75   of the open jou
8800: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
8810: 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52  es */.  u32 *pNR
8820: 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ec,             
8830: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c       /* OUT: Val
8840: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
8850: 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20   nRec field */. 
8860: 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20   u32 *pDbSize   
8870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8880: 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f   OUT: Value of o
8890: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
88a0: 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29   size field */.)
88b0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
88c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88d0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
88e0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
88f0: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20  ar aMagic[8];   
8900: 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f    /* A buffer to
8910: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
8920: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20  header */.  i64 
8930: 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
8940: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
8950: 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  et of journal he
8960: 61 64 65 72 20 62 65 69 6e 67 20 72 65 61 64 20  ader being read 
8970: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73  */..  assert( is
8980: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
8990: 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75  ) );      /* Jou
89a0: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
89b0: 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a  e open. */..  /*
89c0: 20 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a   Advance Pager.j
89d0: 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65  ournalOff to the
89e0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65   start of the ne
89f0: 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68  xt sector. If th
8a00: 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  e.  ** journal f
8a10: 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c  ile is too small
8a20: 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65   for there to be
8a30: 20 61 20 68 65 61 64 65 72 20 73 74 6f 72 65 64   a header stored
8a40: 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f   at this.  ** po
8a50: 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  int, return SQLI
8a60: 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20  TE_DONE..  */.  
8a70: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8a80: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
8a90: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
8aa0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
8ab0: 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f  rnalOff+JOURNAL_
8ac0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e  HDR_SZ(pPager) >
8ad0: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a   journalSize ){.
8ae0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8af0: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48  E_DONE;.  }.  iH
8b00: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
8b10: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f  journalOff;..  /
8b20: 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 66 69  * Read in the fi
8b30: 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74  rst 8 bytes of t
8b40: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
8b50: 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f  r. If they do no
8b60: 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65  t match.  ** the
8b70: 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66    magic string f
8b80: 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74 61 72  ound at the star
8b90: 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61  t of each journa
8ba0: 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e  l header, return
8bb0: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  .  ** SQLITE_DON
8bc0: 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  E. If an IO erro
8bd0: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
8be0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20   an error code. 
8bf0: 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20  Otherwise,.  ** 
8c00: 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20  proceed..  */.  
8c10: 69 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64  if( isHot || iHd
8c20: 72 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f  rOff!=pPager->jo
8c30: 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20  urnalHdr ){.    
8c40: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
8c50: 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
8c60: 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  aMagic, sizeof(a
8c70: 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29  Magic), iHdrOff)
8c80: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
8c90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
8ca0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d  .    }.    if( m
8cb0: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
8cc0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
8cd0: 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20  eof(aMagic))!=0 
8ce0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8cf0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
8d00: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61   }.  }..  /* Rea
8d10: 64 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  d the first thre
8d20: 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20  e 32-bit fields 
8d30: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
8d40: 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a  eader: The nRec.
8d50: 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20    ** field, the 
8d60: 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c  checksum-initial
8d70: 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61 74  izer and the dat
8d80: 61 62 61 73 65 20 73 69 7a 65 20 61 74 20 74 68  abase size at th
8d90: 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20  e start.  ** of 
8da0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
8db0: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
8dc0: 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
8dd0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20  g goes wrong..  
8de0: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
8df0: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
8e00: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
8e10: 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52  , iHdrOff+8, pNR
8e20: 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  ec)).   || SQLIT
8e30: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
8e40: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
8e50: 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20  fd, iHdrOff+12, 
8e60: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
8e70: 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  it)).   || SQLIT
8e80: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
8e90: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
8ea0: 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20  fd, iHdrOff+16, 
8eb0: 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20  pDbSize)).  ){. 
8ec0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
8ed0: 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
8ee0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29  >journalOff==0 )
8ef0: 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67 65 53  {.    u32 iPageS
8f00: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
8f10: 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20     /* Page-size 
8f20: 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c  field of journal
8f30: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75   header */.    u
8f40: 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20  32 iSectorSize; 
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8f60: 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
8f70: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
8f80: 65 72 20 2a 2f 0a 20 20 20 20 75 31 36 20 69 50  er */.    u16 iP
8f90: 61 67 65 53 69 7a 65 31 36 3b 20 20 20 20 20 20  ageSize16;      
8fa0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
8fb0: 66 20 69 50 61 67 65 53 69 7a 65 20 69 6e 20 31  f iPageSize in 1
8fc0: 36 2d 62 69 74 20 76 61 72 69 61 62 6c 65 20 2a  6-bit variable *
8fd0: 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  /..    /* Read t
8fe0: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
8ff0: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75   sector-size jou
9000: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c  rnal header fiel
9010: 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53  ds. */.    if( S
9020: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
9030: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
9040: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
9050: 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65  20, &iSectorSize
9060: 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54  )).     || SQLIT
9070: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
9080: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
9090: 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20  fd, iHdrOff+24, 
90a0: 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20  &iPageSize)).   
90b0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
90c0: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
90d0: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
90e0: 65 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72  e values read fr
90f0: 6f 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  om the page-size
9100: 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
9110: 20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61   fields.    ** a
9120: 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e  re within range.
9130: 20 54 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65   To be 'in range
9140: 27 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e  ', both values n
9150: 65 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  eed to be a powe
9160: 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20  r.    ** of two 
9170: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
9180: 65 71 75 61 6c 20 74 6f 20 35 31 32 2c 20 61 6e  equal to 512, an
9190: 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68  d not greater th
91a0: 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a  an their .    **
91b0: 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70   respective comp
91c0: 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d  ile time maximum
91d0: 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a   limits..    */.
91e0: 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
91f0: 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20  e<512           
9200: 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f         || iSecto
9210: 72 53 69 7a 65 3c 35 31 32 0a 20 20 20 20 20 7c  rSize<512.     |
9220: 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49  | iPageSize>SQLI
9230: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
9240: 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e   || iSectorSize>
9250: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a  MAX_SECTOR_SIZE.
9260: 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53       || ((iPageS
9270: 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65  ize-1)&iPageSize
9280: 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63  )!=0   || ((iSec
9290: 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74  torSize-1)&iSect
92a0: 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20  orSize)!=0 .    
92b0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
92c0: 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61  he either the pa
92d0: 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f  ge-size or secto
92e0: 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f  r-size in the jo
92f0: 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20  urnal-header is 
9300: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69  .      ** invali
9310: 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63  d, then the proc
9320: 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74  ess that wrote t
9330: 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
9340: 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20  r must have .   
9350: 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65     ** crashed be
9360: 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20  fore the header 
9370: 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74  was synced. In t
9380: 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65  his case stop re
9390: 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20  ading .      ** 
93a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
93b0: 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   here..      */.
93c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
93d0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
93e0: 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
93f0: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20  he page-size to 
9400: 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
9410: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
9420: 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55  urnal. .    ** U
9430: 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20  se a testcase() 
9440: 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75  macro to make su
9450: 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66  re that malloc f
9460: 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20  ailure within . 
9470: 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61     ** PagerSetPa
9480: 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74  gesize() is test
9490: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
94a0: 50 61 67 65 53 69 7a 65 31 36 20 3d 20 28 75 31  PageSize16 = (u1
94b0: 36 29 69 50 61 67 65 53 69 7a 65 3b 0a 20 20 20  6)iPageSize;.   
94c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
94d0: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
94e0: 61 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65  ager, &iPageSize
94f0: 31 36 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73  16, -1);.    tes
9500: 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
9510: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  E_OK );.    asse
9520: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
9530: 4b 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 31 36  K || iPageSize16
9540: 3d 3d 28 75 31 36 29 69 50 61 67 65 53 69 7a 65  ==(u16)iPageSize
9550: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   );..    /* Upda
9560: 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73  te the assumed s
9570: 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61  ector-size to ma
9580: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73  tch the value us
9590: 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68  ed by .    ** th
95a0: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
95b0: 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72  reated this jour
95c0: 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75  nal. If this jou
95d0: 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20  rnal was.    ** 
95e0: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
95f0: 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20  cess other than 
9600: 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74  this one, then t
9610: 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20  his routine.    
9620: 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  ** is being call
9630: 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70  ed from within p
9640: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e  ager_playback().
9650: 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   The local value
9660: 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  .    ** of Pager
9670: 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
9680: 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
9690: 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
96a0: 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ne..    */.    p
96b0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
96c0: 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  e = iSectorSize;
96d0: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
96e0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
96f0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
9700: 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
9710: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  c;.}.../*.** Wri
9720: 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  te the supplied 
9730: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
9740: 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
9750: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
9760: 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74  ger.** pPager at
9770: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
9780: 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65  ation. The maste
9790: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
97a0: 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a  ust be the last.
97b0: 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e  ** thing written
97c0: 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   to a journal fi
97d0: 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  le. If the pager
97e0: 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   is in full-sync
97f0: 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f   mode, the.** jo
9800: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
9810: 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65  iptor is advance
9820: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  d to the next se
9830: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65  ctor boundary be
9840: 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67  fore.** anything
9850: 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65   is written. The
9860: 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a   format is:.**.*
9870: 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50  *   + 4 bytes: P
9880: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a  AGER_MJ_PGNO..**
9890: 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61     + N bytes: Ma
98a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
98b0: 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a  ename in utf-8..
98c0: 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
98d0: 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73  N (length of mas
98e0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
98f0: 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75   in bytes, no nu
9900: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a  l-terminator)..*
9910: 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d  *   + 4 bytes: M
9920: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
9930: 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  me checksum..** 
9940: 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f    + 8 bytes: aJo
9950: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
9960: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
9970: 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63  ournal page chec
9980: 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20  ksum is the sum 
9990: 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  of the bytes in 
99a0: 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
99b0: 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72  urnal name, wher
99c0: 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69  e each byte is i
99d0: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20  nterpreted as a 
99e0: 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74  signed 8-bit int
99f0: 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  eger..**.** If z
9a00: 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c  Master is a NULL
9a10: 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73   pointer (occurs
9a20: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61   for a single da
9a30: 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
9a40: 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61  on), .** this ca
9a50: 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ll is a no-op..*
9a60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
9a70: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
9a80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
9a90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
9aa0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
9ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ac0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
9ad0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
9ae0: 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  nMaster;        
9af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9b00: 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67  Length of string
9b10: 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36   zMaster */.  i6
9b20: 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
9b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9b40: 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64  * Offset of head
9b50: 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69  er in journal fi
9b60: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c  le */.  i64 jrnl
9b70: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
9b80: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
9b90: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   of journal file
9ba0: 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33   on disk */.  u3
9bb0: 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20  2 cksum = 0;    
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9bd0: 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74  * Checksum of st
9be0: 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  ring zMaster */.
9bf0: 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20  .  if( !zMaster 
9c00: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  || pPager->setMa
9c10: 73 74 65 72 0a 20 20 20 7c 7c 20 70 50 61 67 65  ster.   || pPage
9c20: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
9c30: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9c40: 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20  E_MEMORY .   || 
9c50: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
9c60: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9c70: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b  ALMODE_OFF .  ){
9c80: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9c90: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61  TE_OK;.  }.  pPa
9ca0: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
9cb0: 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   1;.  assert( is
9cc0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
9cd0: 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75  ) );..  /* Calcu
9ce0: 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20  late the length 
9cf0: 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68 65  in bytes and the
9d00: 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61   checksum of zMa
9d10: 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d  ster */.  for(nM
9d20: 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72  aster=0; zMaster
9d30: 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74  [nMaster]; nMast
9d40: 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d  er++){.    cksum
9d50: 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73   += zMaster[nMas
9d60: 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ter];.  }..  /* 
9d70: 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
9d80: 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
9d90: 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
9da0: 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
9db0: 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
9dc0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
9dd0: 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
9de0: 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
9df0: 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
9e00: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
9e10: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
9e20: 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
9e30: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
9e40: 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  lSync ){.    pPa
9e50: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
9e60: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
9e70: 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
9e80: 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67    iHdrOff = pPag
9e90: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
9ea0: 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
9eb0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64  master journal d
9ec0: 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ata to the end o
9ed0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
9ee0: 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  le. If.  ** an e
9ef0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
9f00: 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
9f10: 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
9f20: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20  ..  */.  if( (0 
9f30: 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
9f40: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
9f50: 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52  , iHdrOff, PAGER
9f60: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
9f70: 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
9f80: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57  (rc = sqlite3OsW
9f90: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
9fa0: 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  , zMaster, nMast
9fb0: 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29  er, iHdrOff+4)))
9fc0: 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
9fd0: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
9fe0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
9ff0: 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e  Off+4+nMaster, n
a000: 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20  Master))).   || 
a010: 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
a020: 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
a030: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
a040: 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29  Master+4, cksum)
a050: 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
a060: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
a070: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
a080: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
a090: 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  8, iHdrOff+4+nMa
a0a0: 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20  ster+8))).  ){. 
a0b0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
a0c0: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
a0d0: 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74  nalOff += (nMast
a0e0: 65 72 2b 32 30 29 3b 0a 20 20 70 50 61 67 65 72  er+20);.  pPager
a0f0: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
a100: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20  ager->noSync;.. 
a110: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
a120: 20 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74   is in peristent
a130: 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74  -journal mode, t
a140: 68 65 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c  hen the physical
a150: 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66   .  ** journal-f
a160: 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70  ile may extend p
a170: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
a180: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
a190: 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20  l name.  ** and 
a1a0: 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63  8 bytes of magic
a1b0: 20 64 61 74 61 20 6a 75 73 74 20 77 72 69 74 74   data just writt
a1c0: 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20  en to the file. 
a1d0: 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61  This is .  ** da
a1e0: 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73 65 20  ngerous because 
a1f0: 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c  the code to roll
a200: 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
a210: 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c  al file.  ** wil
a220: 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f  l not be able to
a230: 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72   find the master
a240: 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f  -journal name to
a250: 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a   determine .  **
a260: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
a270: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68  the journal is h
a280: 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  ot. .  **.  ** E
a290: 61 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20  asiest thing to 
a2a0: 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61  do in this scena
a2b0: 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61  rio is to trunca
a2c0: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  te the journal .
a2d0: 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65    ** file to the
a2e0: 20 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a   required size..
a2f0: 20 20 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49    */ .  if( SQLI
a300: 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c  TE_OK==(rc = sql
a310: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
a320: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e  Pager->jfd, &jrn
a330: 6c 53 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72  lSize)).   && jr
a340: 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a  nlSize>pPager->j
a350: 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20  ournalOff.  ){. 
a360: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
a370: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
a380: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
a390: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a  ournalOff);.  }.
a3a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
a3b0: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67  /*.** Find a pag
a3c0: 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61  e in the hash ta
a3d0: 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61  ble given its pa
a3e0: 67 65 20 6e 75 6d 62 65 72 2e 20 52 65 74 75 72  ge number. Retur
a3f0: 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
a400: 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55  o the page or NU
a410: 4c 4c 20 69 66 20 74 68 65 20 72 65 71 75 65 73  LL if the reques
a420: 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20  ted page is not 
a430: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 6d  .** already in m
a440: 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
a450: 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f   PgHdr *pager_lo
a460: 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
a470: 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
a480: 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20    PgHdr *p;     
a490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4a0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
a4b0: 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20  lue */..  /* It 
a4c0: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
a4d0: 66 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20 50 63  for a call to Pc
a4e0: 61 63 68 65 46 65 74 63 68 28 29 20 77 69 74 68  acheFetch() with
a4f0: 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 30 20 74   createFlag==0 t
a500: 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e  o.  ** fail, sin
a510: 63 65 20 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f  ce no attempt to
a520: 20 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69   allocate dynami
a530: 63 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65  c memory will be
a540: 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76   made..  */.  (v
a550: 6f 69 64 29 73 71 6c 69 74 65 33 50 63 61 63 68  oid)sqlite3Pcach
a560: 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
a570: 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c  PCache, pgno, 0,
a580: 20 26 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70   &p);.  return p
a590: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  ;.}../*.** Unles
a5a0: 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  s the pager is i
a5b0: 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 64  n error-state, d
a5c0: 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65  iscard all in-me
a5d0: 6d 6f 72 79 20 70 61 67 65 73 2e 20 49 66 0a 2a  mory pages. If.*
a5e0: 2a 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  * the pager is i
a5f0: 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 74  n error-state, t
a600: 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 20 69 73  hen this call is
a610: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
a620: 54 4f 44 4f 3a 20 57 68 79 20 63 61 6e 20 77 65  TODO: Why can we
a630: 20 6e 6f 74 20 72 65 73 65 74 20 74 68 65 20 70   not reset the p
a640: 61 67 65 72 20 77 68 69 6c 65 20 69 6e 20 65 72  ager while in er
a650: 72 6f 72 20 73 74 61 74 65 3f 0a 2a 2f 0a 73 74  ror state?.*/.st
a660: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
a670: 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  reset(Pager *pPa
a680: 67 65 72 29 7b 0a 20 20 69 66 28 20 53 51 4c 49  ger){.  if( SQLI
a690: 54 45 5f 4f 4b 3d 3d 70 50 61 67 65 72 2d 3e 65  TE_OK==pPager->e
a6a0: 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 73 71  rrCode ){.    sq
a6b0: 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
a6c0: 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  rt(pPager->pBack
a6d0: 75 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  up);.    sqlite3
a6e0: 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67  PcacheClear(pPag
a6f0: 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
a700: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
a710: 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Valid = 0;.  }.}
a720: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
a730: 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74   structures in t
a740: 68 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  he Pager.aSavepo
a750: 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20  int[] array and 
a760: 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65  set both.** Page
a770: 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64  r.aSavepoint and
a780: 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e   Pager.nSavepoin
a790: 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65  t to zero. Close
a7a0: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
a7b0: 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65  .** if it is ope
a7c0: 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  n and the pager 
a7d0: 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  is not in exclus
a7e0: 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ive mode..*/.sta
a7f0: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
a800: 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61  AllSavepoints(Pa
a810: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
a820: 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
a830: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
a840: 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  r for looping th
a850: 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53 61 76  rough Pager.aSav
a860: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28  epoint */.  for(
a870: 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d  ii=0; ii<pPager-
a880: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
a890: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  +){.    sqlite3B
a8a0: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
a8b0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
a8c0: 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  ii].pInSavepoint
a8d0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  );.  }.  if( !pP
a8e0: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
a8f0: 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33 49 73  ode || sqlite3Is
a900: 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  MemJournal(pPage
a910: 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
a920: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
a930: 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20  Pager->sjfd);.  
a940: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
a950: 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
a960: 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  int);.  pPager->
a970: 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  aSavepoint = 0;.
a980: 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70    pPager->nSavep
a990: 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  oint = 0;.  pPag
a9a0: 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b  er->nSubRec = 0;
a9b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
a9c0: 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e  e bit number pgn
a9d0: 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72 53 61  o in the PagerSa
a9e0: 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
a9f0: 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73  oint .** bitvecs
aa00: 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76   of all open sav
aa10: 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20  epoints. Return 
aa20: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
aa30: 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51  cessful.** or SQ
aa40: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
aa50: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f  malloc failure o
aa60: 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccurs..*/.static
aa70: 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f   int addToSavepo
aa80: 69 6e 74 42 69 74 76 65 63 73 28 50 61 67 65 72  intBitvecs(Pager
aa90: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
aaa0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20  gno){.  int ii; 
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aac0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
aad0: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
aae0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
aaf0: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
ab00: 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  */..  for(ii=0; 
ab10: 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
ab20: 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
ab30: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
ab40: 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61   *p = &pPager->a
ab50: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20  Savepoint[ii];. 
ab60: 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e     if( pgno<=p->
ab70: 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72  nOrig ){.      r
ab80: 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76  c |= sqlite3Bitv
ab90: 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65  ecSet(p->pInSave
aba0: 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  point, pgno);.  
abb0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
abc0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
abd0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
abe0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
abf0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
ac00: 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  M );.    }.  }. 
ac10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ac20: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
ac30: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
ac40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
ac50: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70  a no-op if the p
ac60: 61 67 65 72 0a 2a 2a 20 69 73 20 69 6e 20 65 78  ager.** is in ex
ac70: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a  clusive mode..**
ac80: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
ac90: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
aca0: 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 69   error state, di
acb0: 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e  scard the conten
acc0: 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61  ts of .** the ca
acd0: 63 68 65 20 61 6e 64 20 72 65 73 65 74 20 74 68  che and reset th
ace0: 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
acf0: 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
ad00: 2e 20 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  . If there is.**
ad10: 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c   an open journal
ad20: 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20  -file, then the 
ad30: 6e 65 78 74 20 74 69 6d 65 20 61 20 73 68 61 72  next time a shar
ad40: 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  ed-lock is obtai
ad50: 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61  ned.** on the pa
ad60: 67 65 72 20 66 69 6c 65 20 28 62 79 20 74 68 69  ger file (by thi
ad70: 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
ad80: 72 6f 63 65 73 73 29 2c 20 69 74 20 77 69 6c 6c  rocess), it will
ad90: 20 62 65 0a 2a 2a 20 74 72 65 61 74 65 64 20 61   be.** treated a
ada0: 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
adb0: 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  and rolled back.
adc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
add0: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
ade0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
adf0: 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
ae00: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
ae10: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ae30: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
ae40: 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 63  .    /* Always c
ae50: 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
ae60: 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70   file when dropp
ae70: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
ae80: 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2a 20 4f 74   lock..    ** Ot
ae90: 68 65 72 77 69 73 65 2c 20 61 6e 6f 74 68 65 72  herwise, another
aea0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
aeb0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65   journal_mode=de
aec0: 6c 65 74 65 20 6d 69 67 68 74 0a 20 20 20 20 2a  lete might.    *
aed0: 2a 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  * delete the fil
aee0: 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  e out from under
aef0: 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   us..    */.    
af00: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
af10: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
af20: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
af30: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
af40: 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
af50: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
af60: 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  l = 0;.    relea
af70: 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
af80: 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a  pPager);..    /*
af90: 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
afa0: 75 6e 6c 6f 63 6b 65 64 2c 20 73 6f 6d 65 62 6f  unlocked, somebo
afb0: 64 79 20 65 6c 73 65 20 6d 69 67 68 74 20 63 68  dy else might ch
afc0: 61 6e 67 65 20 69 74 2e 20 54 68 65 0a 20 20 20  ange it. The.   
afd0: 20 2a 2a 20 76 61 6c 75 65 73 20 73 74 6f 72 65   ** values store
afe0: 64 20 69 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  d in Pager.dbSiz
aff0: 65 20 65 74 63 2e 20 6d 69 67 68 74 20 62 65 63  e etc. might bec
b000: 6f 6d 65 20 69 6e 76 61 6c 69 64 20 69 66 0a 20  ome invalid if. 
b010: 20 20 20 2a 2a 20 74 68 69 73 20 68 61 70 70 65     ** this happe
b020: 6e 73 2e 20 54 4f 44 4f 3a 20 52 65 61 6c 6c 79  ns. TODO: Really
b030: 2c 20 74 68 69 73 20 64 6f 65 73 6e 27 74 20 6e  , this doesn't n
b040: 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65  eed to be cleare
b050: 64 0a 20 20 20 20 2a 2a 20 75 6e 74 69 6c 20 74  d.    ** until t
b060: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
b070: 72 20 63 68 65 63 6b 20 66 61 69 6c 73 20 69 6e  r check fails in
b080: 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b   PagerSharedLock
b090: 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ()..    */.    p
b0a0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
b0b0: 69 64 20 3d 20 30 3b 0a 0a 20 20 20 20 72 63 20  id = 0;..    rc 
b0c0: 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  = osUnlock(pPage
b0d0: 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
b0e0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
b0f0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
b100: 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 7d  Code = rc;.    }
b110: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55  .    IOTRACE(("U
b120: 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61  NLOCK %p\n", pPa
b130: 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20 49 66  ger))..    /* If
b140: 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69   Pager.errCode i
b150: 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65  s set, the conte
b160: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
b170: 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65   cache cannot be
b180: 0a 20 20 20 20 2a 2a 20 74 72 75 73 74 65 64 2e  .    ** trusted.
b190: 20 4e 6f 77 20 74 68 61 74 20 74 68 65 20 70 61   Now that the pa
b1a0: 67 65 72 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  ger file is unlo
b1b0: 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e  cked, the conten
b1c0: 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ts of the.    **
b1d0: 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64 69   cache can be di
b1e0: 73 63 61 72 64 65 64 20 61 6e 64 20 74 68 65 20  scarded and the 
b1f0: 65 72 72 6f 72 20 63 6f 64 65 20 73 61 66 65 6c  error code safel
b200: 79 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a  y cleared..    *
b210: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
b220: 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
b230: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
b240: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
b250: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
b260: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
b270: 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65 72     }.      pager
b280: 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
b290: 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65      }..    pPage
b2a0: 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
b2b0: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ne = 0;.    pPag
b2c0: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
b2d0: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a 7d 0a  R_UNLOCK;.  }.}.
b2e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
b2f0: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63  tion should be c
b300: 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4f  alled when an IO
b310: 45 52 52 2c 20 43 4f 52 52 55 50 54 20 6f 72 20  ERR, CORRUPT or 
b320: 46 55 4c 4c 20 65 72 72 6f 72 0a 2a 2a 20 6d 61  FULL error.** ma
b330: 79 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 2e  y have occurred.
b340: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
b350: 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
b360: 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 0a 2a   to the pager .*
b370: 2a 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  * structure, the
b380: 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f   second the erro
b390: 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20  r-code about to 
b3a0: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  be returned by a
b3b0: 20 70 61 67 65 72 20 0a 2a 2a 20 41 50 49 20 66   pager .** API f
b3c0: 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76 61 6c  unction. The val
b3d0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61  ue returned is a
b3e0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63   copy of the sec
b3f0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a  ond argument .**
b400: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
b410: 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  n. .**.** If the
b420: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
b430: 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   is SQLITE_IOERR
b440: 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  , SQLITE_CORRUPT
b450: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  , or SQLITE_FULL
b460: 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65  .** the error be
b470: 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74  comes persistent
b480: 2e 20 55 6e 74 69 6c 20 74 68 65 20 70 65 72 73  . Until the pers
b490: 69 73 74 65 6e 20 65 72 72 6f 72 20 69 73 20 63  isten error is c
b4a0: 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62 73 65  leared,.** subse
b4b0: 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73 20  quent API calls 
b4c0: 6f 6e 20 74 68 69 73 20 50 61 67 65 72 20 77 69  on this Pager wi
b4d0: 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72  ll immediately r
b4e0: 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 0a  eturn the same .
b4f0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  ** error code..*
b500: 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73 74 65 6e  *.** A persisten
b510: 74 20 65 72 72 6f 72 20 69 6e 64 69 63 61 74 65  t error indicate
b520: 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  s that the conte
b530: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
b540: 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f  -cache .** canno
b550: 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 54 68  t be trusted. Th
b560: 69 73 20 73 74 61 74 65 20 63 61 6e 20 62 65 20  is state can be 
b570: 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c  cleared by compl
b580: 65 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67  etely discarding
b590: 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74   .** the content
b5a0: 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63  s of the pager-c
b5b0: 61 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73  ache. If a trans
b5c0: 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76  action was activ
b5d0: 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65  e when.** the pe
b5e0: 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f  rsistent error o
b5f0: 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68  ccurred, then th
b600: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
b610: 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74  al may need.** t
b620: 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f  o be replayed to
b630: 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e   restore the con
b640: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74  tents of the dat
b650: 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 69  abase file (as i
b660: 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68  f.** it were a h
b670: 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a  ot-journal)..*/.
b680: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
b690: 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50  _error(Pager *pP
b6a0: 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20  ager, int rc){. 
b6b0: 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20   int rc2 = rc & 
b6c0: 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 0a  0xff;.  assert(.
b6d0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
b6e0: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
b6f0: 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50  ULL ||.       pP
b700: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
b710: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
b720: 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43     (pPager->errC
b730: 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c  ode & 0xff)==SQL
b740: 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20  ITE_IOERR.  );. 
b750: 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51   if(.    rc2==SQ
b760: 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
b770: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   rc2==SQLITE_IOE
b780: 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53  RR ||.    rc2==S
b790: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20  QLITE_CORRUPT.  
b7a0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
b7b0: 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20  rrCode = rc;.   
b7c0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
b7d0: 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
b7e0: 20 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65   .     && sqlite
b7f0: 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
b800: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
b810: 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ==0 .    ){.    
b820: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
b830: 72 20 69 73 20 61 6c 72 65 61 64 79 20 75 6e 6c  r is already unl
b840: 6f 63 6b 65 64 2c 20 63 61 6c 6c 20 70 61 67 65  ocked, call page
b850: 72 5f 75 6e 6c 6f 63 6b 28 29 20 6e 6f 77 20 74  r_unlock() now t
b860: 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 72  o.      ** clear
b870: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
b880: 20 61 6e 64 20 65 6e 73 75 72 65 20 74 68 61 74   and ensure that
b890: 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
b8a0: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f   is .      ** co
b8b0: 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a  mpletely empty..
b8c0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
b8d0: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
b8e0: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
b8f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b900: 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72  *.** Execute a r
b910: 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61  ollback if a tra
b920: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
b930: 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  ve and unlock th
b940: 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  e .** database f
b950: 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ile. .**.** If t
b960: 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72  he pager has alr
b970: 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65  eady entered the
b980: 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f   error state, do
b990: 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a   not attempt .**
b9a0: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74   the rollback at
b9b0: 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74   this time. Inst
b9c0: 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63  ead, pager_unloc
b9d0: 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54  k() is called. T
b9e0: 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61  he.** call to pa
b9f0: 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c  ger_unlock() wil
ba00: 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e  l discard all in
ba10: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75  -memory pages, u
ba20: 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74  nlock.** the dat
ba30: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 63  abase file and c
ba40: 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73  lear the error s
ba50: 74 61 74 65 2e 20 49 66 20 74 68 69 73 20 6d 65  tate. If this me
ba60: 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 72  ans that.** ther
ba70: 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  e is a hot-journ
ba80: 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  al left in the f
ba90: 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20  ile-system, the 
baa0: 6e 65 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  next connection.
bab0: 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73  ** to obtain a s
bac0: 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
bad0: 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d  e pager (which m
bae0: 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20  ay be this one) 
baf0: 77 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74 20  will.** roll it 
bb00: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
bb10: 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74  he pager has not
bb20: 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
bb30: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
bb40: 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a  , but an IO or.*
bb50: 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  * malloc error o
bb60: 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72  ccurs during a r
bb70: 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68  ollback, then th
bb80: 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63  is will itself c
bb90: 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
bba0: 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
bbb0: 65 72 72 6f 72 20 73 74 61 74 65 2e 20 57 68 69  error state. Whi
bbc0: 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72  ch will be clear
bbd0: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c  ed by the.** cal
bbe0: 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
bbf0: 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65  k(), as describe
bc00: 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74  d above..*/.stat
bc10: 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
bc20: 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
bc30: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
bc40: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
bc50: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
bc60: 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  && pPager->state
bc70: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
bc80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
bc90: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
bca0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ();.    sqlite3P
bcb0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
bcc0: 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ger);.    sqlite
bcd0: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
bce0: 28 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f  ();.  }.  pager_
bcf0: 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
bd00: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
bd10: 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61  utine ends a tra
bd20: 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e  nsaction. A tran
bd30: 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c  saction is usual
bd40: 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20  ly ended by .** 
bd50: 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20  either a COMMIT 
bd60: 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70  or a ROLLBACK op
bd70: 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f  eration. This ro
bd80: 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c  utine may be cal
bd90: 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f  led .** after ro
bda0: 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d  llback of a hot-
bdb0: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61  journal, or if a
bdc0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
bdd0: 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20  hile opening.** 
bde0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
bdf0: 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
be00: 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e  very first journ
be10: 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a  al-header of a.*
be20: 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  * database trans
be30: 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49  action..** .** I
be40: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
be50: 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6f  n PAGER_SHARED o
be60: 72 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73  r PAGER_UNLOCK s
be70: 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
be80: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
be90: 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
bea0: 6f 70 20 28 72 65 74 75 72 6e 73 20 53 51 4c 49  op (returns SQLI
beb0: 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  TE_OK)..**.** Ot
bec0: 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74  herwise, any act
bed0: 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
bee0: 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  re released..**.
bef0: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
bf00: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20  l file is open, 
bf10: 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61  then it is "fina
bf20: 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a  lized". Once a j
bf30: 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20  ournal .** file 
bf40: 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
bf50: 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  ed it is not pos
bf60: 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20  sible to use it 
bf70: 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a  to roll back a .
bf80: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
bf90: 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63  Nor will it be c
bfa0: 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
bfb0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79  a hot-journal by
bfc0: 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20   this.** or any 
bfd0: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
bfe0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74  onnection. Exact
bff0: 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c  ly how a journal
c000: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a   is finalized.**
c010: 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
c020: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70  her or not the p
c030: 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
c040: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
c050: 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72  e and.** the cur
c060: 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  rent journal-mod
c070: 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  e (Pager.journal
c080: 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20  Mode value), as 
c090: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
c0a0: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45   journalMode==ME
c0b0: 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  MORY.**     Jour
c0c0: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
c0d0: 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c  tor is simply cl
c0e0: 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72  osed. This destr
c0f0: 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69  oys an .**     i
c100: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
c110: 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
c120: 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a  lMode==TRUNCATE.
c130: 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
c140: 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
c150: 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
c160: 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  n size..**.**   
c170: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
c180: 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20  SIST.**     The 
c190: 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f  first 28 bytes o
c1a0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
c1b0: 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54  le are zeroed. T
c1c0: 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a  his invalidates.
c1d0: 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74  **     the first
c1e0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
c1f0: 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64  in the file, and
c200: 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72   hence the entir
c210: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
c220: 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69   file. An invali
c230: 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  d journal file c
c240: 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  annot be rolled 
c250: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  back..**.**   jo
c260: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54  urnalMode==DELET
c270: 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75  E.**     The jou
c280: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  rnal file is clo
c290: 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20  sed and deleted 
c2a0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
c2b0: 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  elete()..**.**  
c2c0: 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20     If the pager 
c2d0: 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
c2e0: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
c2f0: 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e  is method of fin
c300: 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74  alizing.**     t
c310: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c320: 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49  is never used. I
c330: 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a  nstead, if the j
c340: 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a  ournalMode is.**
c350: 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20       DELETE and 
c360: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
c370: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
c380: 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72  the method descr
c390: 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20  ibed under.**   
c3a0: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
c3b0: 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69  ERSIST is used i
c3c0: 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66  nstead..**.** Af
c3d0: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
c3e0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 69 66  is finalized, if
c3f0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d   running in non-
c400: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
c410: 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 6d 6f 76  the.** pager mov
c420: 65 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  es to PAGER_SHAR
c430: 45 44 20 73 74 61 74 65 20 28 61 6e 64 20 64 6f  ED state (and do
c440: 77 6e 67 72 61 64 65 73 20 74 68 65 20 6c 6f 63  wngrades the loc
c450: 6b 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  k on the.** data
c460: 62 61 73 65 20 66 69 6c 65 20 61 63 63 6f 72 64  base file accord
c470: 69 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ingly)..**.** If
c480: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
c490: 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
c4a0: 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 73 20 69  ve mode and is i
c4b0: 6e 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 73  n PAGER_SYNCED s
c4c0: 74 61 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76 65  tate,.** it move
c4d0: 73 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55  s to PAGER_EXCLU
c4e0: 53 49 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20 61  SIVE. No locks a
c4f0: 72 65 20 64 6f 77 6e 67 72 61 64 65 64 20 77 68  re downgraded wh
c500: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a 2a  en running in.**
c510: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
c520: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
c530: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
c540: 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  no error occurs.
c550: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
c560: 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e  urs during.** an
c570: 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72  y of the IO oper
c580: 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69  ations to finali
c590: 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
c5a0: 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ile or unlock th
c5b0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68  e.** database th
c5c0: 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
c5d0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
c5e0: 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66   to the user. If
c5f0: 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69   the .** operati
c600: 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  on to finalize t
c610: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c620: 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20  fails, then the 
c630: 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72  code still.** tr
c640: 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ies to unlock th
c650: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
c660: 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  if not in exclus
c670: 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  ive mode. If the
c680: 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  .** unlock opera
c690: 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65  tion fails as we
c6a0: 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ll, then the fir
c6b0: 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  st error code re
c6c0: 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  lated.** to the 
c6d0: 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f  first error enco
c6e0: 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75  untered (the jou
c6f0: 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
c700: 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74  n one) is.** ret
c710: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
c720: 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74   int pager_end_t
c730: 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
c740: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61   *pPager, int ha
c750: 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  sMaster){.  int 
c760: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
c770: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
c780: 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  de from journal 
c790: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65  finalization ope
c7a0: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
c7b0: 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
c7c0: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
c7d0: 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20  de from db file 
c7e0: 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
c7f0: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65   */..  if( pPage
c800: 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
c810: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
c820: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c830: 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 41 6c  .  }.  releaseAl
c840: 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67  lSavepoints(pPag
c850: 65 72 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  er);..  assert( 
c860: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
c870: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  fd) || pPager->p
c880: 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
c890: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
c8a0: 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 0a 20 20  ger->jfd) ){..  
c8b0: 20 20 2f 2a 20 54 4f 44 4f 3a 20 54 68 65 72 65    /* TODO: There
c8c0: 27 73 20 61 20 70 72 6f 62 6c 65 6d 20 68 65 72  's a problem her
c8d0: 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 66  e if a journal-f
c8e0: 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 69  ile was opened i
c8f0: 6e 20 4d 45 4d 4f 52 59 0a 20 20 20 20 2a 2a 20  n MEMORY.    ** 
c900: 6d 6f 64 65 20 61 6e 64 20 74 68 65 6e 20 74 68  mode and then th
c910: 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69  e journal-mode i
c920: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 52 55  s changed to TRU
c930: 4e 43 41 54 45 20 6f 72 20 50 45 52 53 49 53 54  NCATE or PERSIST
c940: 0a 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74  .    ** during t
c950: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
c960: 54 68 69 73 20 63 6f 64 65 20 73 68 6f 75 6c 64  This code should
c970: 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61   be changed to a
c980: 73 73 75 6d 65 0a 20 20 20 20 2a 2a 20 74 68 61  ssume.    ** tha
c990: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f  t the journal mo
c9a0: 64 65 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67  de has not chang
c9b0: 65 64 20 73 69 6e 63 65 20 74 68 65 20 74 72 61  ed since the tra
c9c0: 6e 73 61 63 74 69 6f 6e 20 77 61 73 0a 20 20 20  nsaction was.   
c9d0: 20 2a 2a 20 73 74 61 72 74 65 64 2e 20 41 6e 64   ** started. And
c9e0: 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
c9f0: 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 29 20 66  rJournalMode() f
ca00: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  unction should b
ca10: 65 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 64  e.    ** changed
ca20: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
ca30: 61 74 20 74 68 69 73 20 69 73 20 74 68 65 20 63  at this is the c
ca40: 61 73 65 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  ase too..    */.
ca50: 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65  .    /* Finalize
ca60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
ca70: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  e. */.    if( pP
ca80: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
ca90: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
caa0: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
cab0: 20 20 20 20 20 69 6e 74 20 69 73 4d 65 6d 6f 72       int isMemor
cac0: 79 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  yJournal = sqlit
cad0: 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
cae0: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
caf0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
cb00: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
cb10: 20 20 20 20 20 20 69 66 28 20 21 69 73 4d 65 6d        if( !isMem
cb20: 6f 72 79 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  oryJournal ){.  
cb30: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
cb40: 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
cb50: 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
cb60: 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
cb70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
cb80: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
cb90: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
cba0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
cbb0: 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66  CATE ){.      if
cbc0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
cbd0: 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lOff==0 ){.     
cbe0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
cbf0: 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
cc00: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
cc10: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
cc20: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a  Pager->jfd, 0);.
cc30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
cc40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
cc50: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
cc60: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
cc70: 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ed = 0;.    }els
cc80: 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78  e if( pPager->ex
cc90: 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
cca0: 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
ccb0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
ccc0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
ccd0: 49 53 54 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  IST.    ){.     
cce0: 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61   rc = zeroJourna
ccf0: 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73  lHdr(pPager, has
cd00: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70  Master);.      p
cd10: 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
cd20: 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 70 50  r, rc);.      pP
cd30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
cd40: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
cd50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
cd60: 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ed = 0;.    }els
cd70: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
cd80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
cd90: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
cda0: 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 29  NALMODE_DELETE )
cdb0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
cdc0: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
cdd0: 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  fd);.      if( !
cde0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
cdf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
ce00: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
ce10: 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
ce20: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
ce30: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
ce40: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
ce50: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
ce60: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49    sqlite3PcacheI
ce70: 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67  terateDirty(pPag
ce80: 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
ce90: 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29  er_set_pagehash)
cea0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 71  ;.#endif..    sq
ceb0: 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e  lite3PcacheClean
cec0: 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61  All(pPager->pPCa
ced0: 63 68 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  che);.    sqlite
cee0: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
cef0: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
cf00: 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  l);.    pPager->
cf10: 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
cf20: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
cf30: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28   = 0;.  }..  if(
cf40: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
cf50: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72  iveMode ){.    r
cf60: 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50  c2 = osUnlock(pP
cf70: 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44  ager->fd, SHARED
cf80: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67  _LOCK);.    pPag
cf90: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
cfa0: 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 70 50  R_SHARED;.    pP
cfb0: 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
cfc0: 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  tDone = 0;.  }el
cfd0: 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  se if( pPager->s
cfe0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43  tate==PAGER_SYNC
cff0: 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  ED ){.    pPager
d000: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
d010: 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20  EXCLUSIVE;.  }. 
d020: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
d030: 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  er = 0;.  pPager
d040: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
d050: 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69    pPager->dbModi
d060: 66 69 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  fied = 0;..  /* 
d070: 54 4f 44 4f 3a 20 49 73 20 74 68 69 73 20 6f 70  TODO: Is this op
d080: 74 69 6d 61 6c 3f 20 57 68 79 20 69 73 20 74 68  timal? Why is th
d090: 65 20 64 62 20 73 69 7a 65 20 69 6e 76 61 6c 69  e db size invali
d0a0: 64 61 74 65 64 20 68 65 72 65 20 0a 20 20 2a 2a  dated here .  **
d0b0: 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   when the databa
d0c0: 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 75  se file is not u
d0d0: 6e 6c 6f 63 6b 65 64 3f 20 2a 2f 0a 20 20 70 50  nlocked? */.  pP
d0e0: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
d0f0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50   = 0;.  sqlite3P
d100: 63 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50  cacheTruncate(pP
d110: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
d120: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
d130: 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
d140: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
d150: 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d  zeValid = 0;.  }
d160: 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
d170: 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63  SQLITE_OK?rc2:rc
d180: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  );.}../*.** Para
d190: 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73 74  meter aData must
d1a0: 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
d1b0: 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61  er of pPager->pa
d1c0: 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20  geSize bytes.** 
d1d0: 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65  of data. Compute
d1e0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
d1f0: 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74  ecksum based ont
d200: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
d210: 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66   the .** page of
d220: 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63 75   data and the cu
d230: 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70  rrent value of p
d240: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
d250: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
d260: 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b  not a real check
d270: 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c  sum. It is reall
d280: 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f  y just the sum o
d290: 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d  f the .** random
d2a0: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28   initial value (
d2b0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
d2c0: 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30 30  t) and every 200
d2d0: 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68  th byte.** of th
d2e0: 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74 61  e page data, sta
d2f0: 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65 20  rting with byte 
d300: 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e  offset (pPager->
d310: 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a  pageSize%200)..*
d320: 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20 69  * Each byte is i
d330: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e  nterpreted as an
d340: 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20   8-bit unsigned 
d350: 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43  integer..**.** C
d360: 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d  hanging the form
d370: 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  ula used to comp
d380: 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73 75  ute this checksu
d390: 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a  m results in an.
d3a0: 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  ** incompatible 
d3b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
d3c0: 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f  mat..**.** If jo
d3d0: 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e  urnal corruption
d3e0: 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61   occurs due to a
d3f0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
d400: 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20  the most likely 
d410: 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20  .** scenario is 
d420: 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20  that one end or 
d430: 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
d440: 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20   record will be 
d450: 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20  changed. .** It 
d460: 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b  is much less lik
d470: 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f  ely that the two
d480: 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75   ends of the jou
d490: 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c  rnal record will
d4a0: 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61   be.** correct a
d4b0: 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65  nd the middle be
d4c0: 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c   corrupt.  Thus,
d4d0: 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22   this "checksum"
d4e0: 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75   scheme,.** thou
d4f0: 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70  gh fast and simp
d500: 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20  le, catches the 
d510: 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69  mostly likely ki
d520: 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e  nd of corruption
d530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
d540: 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65  pager_cksum(Page
d550: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
d560: 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75   u8 *aData){.  u
d570: 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65  32 cksum = pPage
d580: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  r->cksumInit;   
d590: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
d5a0: 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72  m value to retur
d5b0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70  n */.  int i = p
d5c0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
d5d0: 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  200;          /*
d5e0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
d5f0: 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b  .  while( i>0 ){
d600: 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44  .    cksum += aD
d610: 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d  ata[i];.    i -=
d620: 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   200;.  }.  retu
d630: 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a  rn cksum;.}../*.
d640: 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  ** Read a single
d650: 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65   page from eithe
d660: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
d670: 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e  le (if isMainJrn
d680: 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d  l==1) or.** from
d690: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
d6a0: 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d   (if isMainJrnl=
d6b0: 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b  =0) and playback
d6c0: 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54   that page..** T
d6d0: 68 65 20 70 61 67 65 20 62 65 67 69 6e 73 20 61  he page begins a
d6e0: 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65  t offset *pOffse
d6f0: 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  t into the file.
d700: 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a   The *pOffset.**
d710: 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61   value is increa
d720: 73 65 64 20 74 6f 20 74 68 65 20 73 74 61 72 74  sed to the start
d730: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
d740: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
d750: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 4d 61  ..**.** The isMa
d760: 69 6e 4a 72 6e 6c 20 66 6c 61 67 20 69 73 20 74  inJrnl flag is t
d770: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 74  rue if this is t
d780: 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
d790: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20   journal and.** 
d7a0: 66 61 6c 73 65 20 66 6f 72 20 74 68 65 20 73 74  false for the st
d7b0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
d7c0: 20 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62    The main rollb
d7d0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73  ack journal uses
d7e0: 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 73 20 2d 20  .** checksums - 
d7f0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
d800: 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 2e 0a  urnal does not..
d810: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
d820: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
d830: 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61 64  page record read
d840: 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
d850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
d860: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
d870: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
d880: 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a  e of Pager.dbSiz
d890: 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b  e, then playback
d8a0: 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61   is.** skipped a
d8b0: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  nd SQLITE_OK is 
d8c0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
d8d0: 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20  If pDone is not 
d8e0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73  NULL, then it is
d8f0: 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67   a record of pag
d900: 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c 72  es that have alr
d910: 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61  eady.** been pla
d920: 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68  yed back.  If th
d930: 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73  e page at *pOffs
d940: 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  et has already b
d950: 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a  een played back.
d960: 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72 65  ** (if the corre
d970: 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62  sponding pDone b
d980: 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e 20  it is set) then 
d990: 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61 63  skip the playbac
d9a0: 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  k..** Make sure 
d9b0: 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f  the pDone bit co
d9c0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
d9d0: 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65  he *pOffset page
d9e0: 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72   is set.** prior
d9f0: 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a   to returning..*
da00: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
da10: 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63 65   record is succe
da20: 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f  ssfully read fro
da30: 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
da40: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20  nal file.** and 
da50: 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65  played back, the
da60: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  n SQLITE_OK is r
da70: 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
da80: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a  O error occurs.*
da90: 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  * while reading 
daa0: 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  the record from 
dab0: 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
dac0: 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20  l file or while 
dad0: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68  writing.** to th
dae0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
daf0: 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
db00: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
db10: 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20  ned. If data.** 
db20: 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
db30: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
db40: 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
db50: 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f 20   but appears to 
db60: 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c  be.** corrupted,
db70: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
db80: 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69  returned. Data i
db90: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72  s considered cor
dba0: 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f  rupted in.** two
dbb0: 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a   circumstances:.
dbc0: 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  ** .**   * If th
dbd0: 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75  e record page-nu
dbe0: 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20  mber is illegal 
dbf0: 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50  (0 or PAGER_MJ_P
dc00: 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20  GNO), or.**   * 
dc10: 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  If the record is
dc20: 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
dc30: 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
dc40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
dc50: 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68 65       and the che
dc60: 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73  cksum field does
dc70: 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72   not match the r
dc80: 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a  ecord content..*
dc90: 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20  *.** Neither of 
dca0: 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72  these two scenar
dcb0: 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65  ios are possible
dcc0: 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f   during a savepo
dcd0: 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  int rollback..**
dce0: 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61  .** If this is a
dcf0: 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
dd00: 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79  ack, then memory
dd10: 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65 20   may have to be 
dd20: 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61  dynamically.** a
dd30: 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
dd40: 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68   function. If th
dd50: 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20 61  is is the case a
dd60: 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  nd an allocation
dd70: 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54   fails,.** SQLIT
dd80: 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
dd90: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
dda0: 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
ddb0: 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61  k_one_page(.  Pa
ddc0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
dde0: 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70  he pager being p
ddf0: 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20  layed back */.  
de00: 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20  int isMainJrnl, 
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
de20: 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e   1 -> main journ
de30: 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75  al. 0 -> sub-jou
de40: 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69  rnal. */.  int i
de50: 73 55 6e 73 79 6e 63 2c 20 20 20 20 20 20 20 20  sUnsync,        
de60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
de70: 20 69 66 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   if reading from
de80: 20 75 6e 73 79 6e 63 65 64 20 6d 61 69 6e 20 6a   unsynced main j
de90: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
dea0: 2a 70 4f 66 66 73 65 74 2c 20 20 20 20 20 20 20  *pOffset,       
deb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
dec0: 73 65 74 20 6f 66 20 72 65 63 6f 72 64 20 74 6f  set of record to
ded0: 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20 69   playback */.  i
dee0: 6e 74 20 69 73 53 61 76 65 70 6e 74 2c 20 20 20  nt isSavepnt,   
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
df00: 54 72 75 65 20 66 6f 72 20 61 20 73 61 76 65 70  True for a savep
df10: 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  oint rollback */
df20: 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65  .  Bitvec *pDone
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df40: 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61   /* Bitvec of pa
df50: 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79  ges already play
df60: 65 64 20 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20  ed back */.){.  
df70: 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
df80: 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
df90: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
dfa0: 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
dfb0: 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
dfc0: 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
dfe0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
dff0: 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
e000: 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
e010: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
e020: 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
e030: 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
e040: 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
e050: 20 75 38 20 2a 61 44 61 74 61 3b 20 20 20 20 20   u8 *aData;     
e060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e070: 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  * Temporary stor
e080: 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  age for the page
e090: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
e0a0: 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20  le *jfd;        
e0b0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
e0c0: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
e0d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
e0e0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28 69  */..  assert( (i
e0f0: 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30  sMainJrnl&~1)==0
e100: 20 29 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d 61   );      /* isMa
e110: 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20 31  inJrnl is 0 or 1
e120: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 69   */.  assert( (i
e130: 73 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20  sSavepnt&~1)==0 
e140: 29 3b 20 20 20 20 20 20 20 2f 2a 20 69 73 53 61  );       /* isSa
e150: 76 65 70 6e 74 20 69 73 20 30 20 6f 72 20 31 20  vepnt is 0 or 1 
e160: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4d  */.  assert( isM
e170: 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65  ainJrnl || pDone
e180: 20 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65   );     /* pDone
e190: 20 61 6c 77 61 79 73 20 75 73 65 64 20 6f 6e 20   always used on 
e1a0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a  sub-journals */.
e1b0: 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76 65    assert( isSave
e1c0: 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20  pnt || pDone==0 
e1d0: 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65  );   /* pDone ne
e1e0: 76 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d  ver used on non-
e1f0: 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20  savepoint */..  
e200: 61 44 61 74 61 20 3d 20 28 75 38 2a 29 70 50 61  aData = (u8*)pPa
e210: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
e220: 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20    assert( aData 
e230: 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  );         /* Te
e240: 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20  mp storage must 
e250: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
e260: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a  n allocated */..
e270: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61    /* Read the pa
e280: 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61  ge number and pa
e290: 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ge data from the
e2a0: 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d   journal or sub-
e2b0: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
e2c0: 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  e. Return an err
e2d0: 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
e2e0: 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65  aller if an IO e
e2f0: 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a  rror occurs..  *
e300: 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e  /.  jfd = isMain
e310: 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a  Jrnl ? pPager->j
e320: 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66  fd : pPager->sjf
e330: 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  d;.  rc = read32
e340: 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73  bits(jfd, *pOffs
e350: 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  et, &pgno);.  if
e360: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e370: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
e380: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
e390: 64 28 6a 66 64 2c 20 61 44 61 74 61 2c 20 70 50  d(jfd, aData, pP
e3a0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
e3b0: 28 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20  (*pOffset)+4);. 
e3c0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e3d0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
e3e0: 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50    *pOffset += pP
e3f0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b  ager->pageSize +
e400: 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a   4 + isMainJrnl*
e410: 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20  4;..  /* Sanity 
e420: 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20  checking on the 
e430: 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d  page.  This is m
e440: 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ore important th
e450: 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a  at I originally.
e460: 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49    ** thought.  I
e470: 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  f a power failur
e480: 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  e occurs while t
e490: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
e4a0: 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a  ing written,.  *
e4b0: 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65  * it could cause
e4c0: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f   invalid data to
e4d0: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
e4e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57   the journal.  W
e4f0: 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64  e need to.  ** d
e500: 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c  etect this inval
e510: 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69  id data (with hi
e520: 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20  gh probability) 
e530: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20  and ignore it.. 
e540: 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
e550: 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  0 || pgno==PAGER
e560: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
e570: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
e580: 21 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20  !isSavepnt );.  
e590: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e5a0: 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  DONE;.  }.  if( 
e5b0: 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65  pgno>(Pgno)pPage
e5c0: 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c  r->dbSize || sql
e5d0: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
e5e0: 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20  Done, pgno) ){. 
e5f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e600: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  _OK;.  }.  if( i
e610: 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20  sMainJrnl ){.   
e620: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
e630: 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29  (jfd, (*pOffset)
e640: 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20  -4, &cksum);.   
e650: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
e660: 20 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73   rc;.    if( !is
e670: 53 61 76 65 70 6e 74 20 26 26 20 70 61 67 65 72  Savepnt && pager
e680: 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 61  _cksum(pPager, a
e690: 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a  Data)!=cksum ){.
e6a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
e6b0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
e6c0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 44 6f 6e 65    }..  if( pDone
e6d0: 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65   && (rc = sqlite
e6e0: 33 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65  3BitvecSet(pDone
e6f0: 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45  , pgno))!=SQLITE
e700: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
e710: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  n rc;.  }..  ass
e720: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
e730: 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
e740: 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  ED || pPager->st
e750: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
e760: 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  SIVE );..  /* If
e770: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
e780: 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
e790: 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
e7a0: 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68   be a copy of th
e7b0: 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20  is.  ** page in 
e7c0: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
e7d0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75   In this case ju
e7e0: 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61  st update the pa
e7f0: 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20  ger cache,.  ** 
e800: 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65  not the database
e810: 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
e820: 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64  is left marked d
e830: 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73  irty in this cas
e840: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  e..  **.  ** An 
e850: 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65  exception to the
e860: 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20   above rule: If 
e870: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
e880: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a  in no-sync mode.
e890: 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20    ** and a page 
e8a0: 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20  is moved during 
e8b0: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
e8c0: 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70  acuum then the p
e8d0: 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74  age may.  ** not
e8e0: 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65 72   be in the pager
e8f0: 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69   cache. Later: i
e900: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20  f a malloc() or 
e910: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
e920: 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f    ** during a Mo
e930: 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74  vepage() call, t
e940: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
e950: 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63   not be in the c
e960: 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72  ache.  ** either
e970: 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69  . So the conditi
e980: 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  on described in 
e990: 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67 72  the above paragr
e9a0: 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  aph is not.  ** 
e9b0: 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20  assert()able..  
e9c0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58  **.  ** If in EX
e9d0: 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74  CLUSIVE state, t
e9e0: 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68  hen we update th
e9f0: 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66  e pager cache if
ea00: 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20   it exists.  ** 
ea10: 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  and the main fil
ea20: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74  e. The page is t
ea30: 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64  hen marked not d
ea40: 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  irty..  **.  ** 
ea50: 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54  Ticket #1171:  T
ea60: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
ea70: 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
ea80: 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  in page content 
ea90: 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66  that is.  ** dif
eaa0: 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
eab0: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20  page content at 
eac0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
ead0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
eae0: 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77  ** This occurs w
eaf0: 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68  hen a page is ch
eb00: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74  anged prior to t
eb10: 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74  he start of a st
eb20: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65  atement.  ** the
eb30: 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20  n changed again 
eb40: 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
eb50: 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c  ment.  When roll
eb60: 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a  ing back such a.
eb70: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77    ** statement w
eb80: 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65  e must not write
eb90: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
eba0: 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73   database unless
ebb0: 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f   we know.  ** fo
ebc0: 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f  r certain that o
ebd0: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
ebe0: 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64  tents are synced
ebf0: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72   into the main r
ec00: 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
ec10: 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  rnal.  Otherwise
ec20: 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d  , a power loss m
ec30: 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66  ight leave modif
ec40: 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a  ied data in the.
ec50: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
ec60: 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e  le without an en
ec70: 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  try in the rollb
ec80: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ack journal that
ec90: 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72   can.  ** restor
eca0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
ecb0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66  o its original f
ecc0: 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74  orm.  Two condit
ecd0: 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a  ions must be.  *
ece0: 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69  * met before wri
ecf0: 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
ed00: 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20  base files. (1) 
ed10: 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
ed20: 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64  t be.  ** locked
ed30: 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74  .  (2) we know t
ed40: 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
ed50: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
ed60: 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20   fully synced.  
ed70: 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ** in the main j
ed80: 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65  ournal either be
ed90: 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69  cause the page i
eda0: 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
edb0: 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20  r else.  ** the 
edc0: 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
edd0: 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20  s needSync==0.. 
ede0: 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34   **.  ** 2008-04
edf0: 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d  -14:  When attem
ee00: 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20  pting to vacuum 
ee10: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
ee20: 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a  se file, it.  **
ee30: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
ee40: 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74  fail a statement
ee50: 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74   on a database t
ee60: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74  hat does not yet
ee70: 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20   exist..  ** Do 
ee80: 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77  not attempt to w
ee90: 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65  rite if database
eea0: 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20   file has never 
eeb0: 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a  been opened..  *
eec0: 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  /.  pPg = pager_
eed0: 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
eee0: 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  gno);.  assert( 
eef0: 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b  pPg || !MEMDB );
ef00: 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
ef10: 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65  PLAYBACK %d page
ef20: 20 25 64 20 68 61 73 68 28 25 30 38 78 29 20 25   %d hash(%08x) %
ef30: 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
ef40: 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
ef50: 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
ef60: 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
ef70: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 61 44 61  r->pageSize, aDa
ef80: 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ta),.           
ef90: 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f      (isMainJrnl?
efa0: 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22  "main-journal":"
efb0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20  sub-journal").  
efc0: 29 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65  ));.  if( (pPage
efd0: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
efe0: 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 26 26  EXCLUSIVE).   &&
eff0: 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28   (pPg==0 || 0==(
f000: 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
f010: 5f 4e 45 45 44 5f 53 59 4e 43 29 29 0a 20 20 20  _NEED_SYNC)).   
f020: 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
f030: 2d 3e 66 64 29 0a 20 20 20 26 26 20 21 69 73 55  ->fd).   && !isU
f040: 6e 73 79 6e 63 0a 20 20 29 7b 0a 20 20 20 20 69  nsync.  ){.    i
f050: 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d  64 ofst = (pgno-
f060: 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
f070: 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  pageSize;.    rc
f080: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
f090: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44  e(pPager->fd, aD
f0a0: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
f0b0: 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20  eSize, ofst);.  
f0c0: 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
f0d0: 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
f0e0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
f0f0: 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
f100: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f110: 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
f120: 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28  ){.      CODEC1(
f130: 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70  pPager, aData, p
f140: 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
f150: 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20  E_NOMEM);.      
f160: 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
f170: 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
f180: 6b 75 70 2c 20 70 67 6e 6f 2c 20 61 44 61 74 61  kup, pgno, aData
f190: 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28  );.      CODEC1(
f1a0: 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70  pPager, aData, p
f1b0: 67 6e 6f 2c 20 30 2c 20 72 63 3d 53 51 4c 49 54  gno, 0, rc=SQLIT
f1c0: 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 7d 0a  E_NOMEM);.    }.
f1d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d    }else if( !isM
f1e0: 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d  ainJrnl && pPg==
f1f0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
f200: 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63  his is a rollbac
f210: 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  k of a savepoint
f220: 20 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f   and data was no
f230: 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20  t written to.   
f240: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
f250: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
f260: 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20   not in-memory, 
f270: 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e  there is a poten
f280: 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62  tial.    ** prob
f290: 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61  lem. When the pa
f2a0: 67 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68  ge is next fetch
f2b0: 65 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65  ed by the b-tree
f2c0: 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20   layer, it .    
f2d0: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20  ** will be read 
f2e0: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
f2f0: 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61  e file, which ma
f300: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
f310: 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e  .    ** current.
f320: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
f330: 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70  There are a coup
f340: 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20  le of different 
f350: 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61  ways this can ha
f360: 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75  ppen. All are qu
f370: 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75  ite.    ** obscu
f380: 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67  re. When running
f390: 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   in synchronous 
f3a0: 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f  mode, this can o
f3b0: 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20  nly happen .    
f3c0: 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ** if the page i
f3d0: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
f3e0: 73 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  st at the start 
f3f0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
f400: 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
f410: 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20  populated, then 
f420: 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69  moved using sqli
f430: 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
f440: 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
f450: 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69  * The solution i
f460: 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d  s to add an in-m
f470: 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68  emory page to th
f480: 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69  e cache containi
f490: 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  ng.    ** the da
f4a0: 74 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ta just read fro
f4b0: 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
f4c0: 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  l. Mark the page
f4d0: 20 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a   as dirty .    *
f4e0: 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67  * and if the pag
f4f0: 65 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f  er requires a jo
f500: 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e  urnal-sync, then
f510: 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
f520: 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  s .    ** requir
f530: 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79  ing a journal-sy
f540: 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  nc before it is 
f550: 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a  written..    */.
f560: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61      assert( isSa
f570: 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 69 66 28  vepnt );.    if(
f580: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61   (rc = sqlite3Pa
f590: 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67 65  gerAcquire(pPage
f5a0: 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31  r, pgno, &pPg, 1
f5b0: 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))!=SQLITE_OK ){
f5c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
f5d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
f5e0: 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52  >flags &= ~PGHDR
f5f0: 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20  _NEED_READ;.    
f600: 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
f610: 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d  eDirty(pPg);.  }
f620: 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
f630: 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f    /* No page sho
f640: 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c  uld ever be expl
f650: 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61  icitly rolled ba
f660: 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73  ck that is in us
f670: 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  e, except.    **
f680: 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63   for page 1 whic
f690: 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65  h is held in use
f6a0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
f6b0: 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  p the lock on th
f6c0: 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
f6d0: 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65  e active. Howeve
f6e0: 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61  r such a page ma
f6f0: 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y be rolled back
f700: 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20   as a result.   
f710: 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e   ** of an intern
f720: 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69  al error resulti
f730: 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74  ng in an automat
f740: 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ic call to.    *
f750: 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
f760: 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f  llback()..    */
f770: 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
f780: 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50  ;.    pData = pP
f790: 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65  g->pData;.    me
f7a0: 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44 61 74  mcpy(pData, aDat
f7b0: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
f7c0: 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ize);.    pPager
f7d0: 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29  ->xReiniter(pPg)
f7e0: 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e  ;.    if( isMain
f7f0: 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65  Jrnl && (!isSave
f800: 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c  pnt || *pOffset<
f810: 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
f820: 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Hdr) ){.      /*
f830: 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   If the contents
f840: 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65   of this page we
f850: 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64  re just restored
f860: 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a   from the main .
f870: 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
f880: 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20   file, then its 
f890: 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20  content must be 
f8a0: 61 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65  as they were whe
f8b0: 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
f8c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
f8d0: 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e  first opened. In
f8e0: 20 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61   this case we ca
f8f0: 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a  n mark the page.
f900: 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61        ** as clea
f910: 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77  n, since there w
f920: 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74  ill be no need t
f930: 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74  o write it out t
f940: 6f 20 74 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  o the..      **.
f950: 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
f960: 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20  s one exception 
f970: 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66  to this rule. If
f980: 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
f990: 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20  ng rolled.      
f9a0: 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74 20  ** back as part 
f9b0: 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28  of a savepoint (
f9c0: 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f  or statement) ro
f9d0: 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a  llback from an .
f9e0: 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65        ** unsynce
f9f0: 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  d portion of the
fa00: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
fa10: 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e  le, then it is n
fa20: 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a  ot safe.      **
fa30: 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67   to mark the pag
fa40: 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73  e as clean. This
fa50: 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b   is because mark
fa60: 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73 0a  ing the page as.
fa70: 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77        ** clean w
fa80: 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47  ill clear the PG
fa90: 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
faa0: 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61  ag. Since the pa
fab0: 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  ge is.      ** a
fac0: 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f  lready in the jo
fad0: 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f  urnal file (reco
fae0: 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49  rded in Pager.pI
faf0: 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20  nJournal) and.  
fb00: 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
fb10: 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
fb20: 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74  is cleared, if t
fb30: 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
fb40: 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61  en to.      ** a
fb50: 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73  gain within this
fb60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74   transaction, it
fb70: 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20   will be marked 
fb80: 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20 20  as dirty but.   
fb90: 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f     ** the PGHDR_
fba0: 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77  NEED_SYNC flag w
fbb0: 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20  ill not be set. 
fbc0: 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f  It could then po
fbd0: 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20  tentially.      
fbe0: 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75  ** be written ou
fbf0: 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  t into the datab
fc00: 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  ase file before 
fc10: 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  its journal file
fc20: 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e  .      ** segmen
fc30: 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20  t is synced. If 
fc40: 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 64  a crash occurs d
fc50: 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69  uring or followi
fc60: 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a  ng this,.      *
fc70: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  * database corru
fc80: 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e  ption may ensue.
fc90: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
fca0: 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
fcb0: 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
fcc0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
fcd0: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
fce0: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
fcf0: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
fd00: 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
fd10: 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
fd20: 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73  page 1, then res
fd30: 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f  tore the value o
fd40: 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  f Pager.dbFileVe
fd50: 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68  rs..    ** Do th
fd60: 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65  is before any de
fd70: 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69  coding. */.    i
fd80: 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
fd90: 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
fda0: 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
fdb0: 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34  &((u8*)pData)[24
fdc0: 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  ],sizeof(pPager-
fdd0: 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
fde0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63     }..    /* Dec
fdf0: 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73  ode the page jus
fe00: 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b  t read from disk
fe10: 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70   */.    CODEC1(p
fe20: 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
fe30: 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53  g->pgno, 3, rc=S
fe40: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20  QLITE_NOMEM);.  
fe50: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
fe60: 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d  elease(pPg);.  }
fe70: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
fe80: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
fe90: 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
fea0: 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45  (SQLITE_COVERAGE
feb0: 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 69  _TEST)./*.** Thi
fec0: 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
fed0: 61 68 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6d  ahead into the m
fee0: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
fef0: 20 61 6e 64 20 64 65 74 65 72 6d 69 6e 65 73 0a   and determines.
ff00: 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
ff10: 74 20 74 68 65 20 6e 65 78 74 20 72 65 63 6f 72  t the next recor
ff20: 64 20 28 74 68 65 20 72 65 63 6f 72 64 20 74 68  d (the record th
ff30: 61 74 20 62 65 67 69 6e 73 20 61 74 20 66 69 6c  at begins at fil
ff40: 65 0a 2a 2a 20 6f 66 66 73 65 74 20 70 50 61 67  e.** offset pPag
ff50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
ff60: 69 73 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  is a well-formed
ff70: 20 70 61 67 65 20 72 65 63 6f 72 64 20 63 6f 6e   page record con
ff80: 73 69 73 74 69 6e 67 0a 2a 2a 20 6f 66 20 61 20  sisting.** of a 
ff90: 76 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65  valid page numbe
ffa0: 72 2c 20 70 50 61 67 65 2d 3e 70 61 67 65 53 69  r, pPage->pageSi
ffb0: 7a 65 20 62 79 74 65 73 20 6f 66 20 63 6f 6e 74  ze bytes of cont
ffc0: 65 6e 74 2c 20 66 6f 6c 6c 6f 77 65 64 0a 2a 2a  ent, followed.**
ffd0: 20 62 79 20 61 20 76 61 6c 69 64 20 63 68 65 63   by a valid chec
ffe0: 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ksum..**.** The 
fff0: 70 61 67 65 72 20 6e 65 76 65 72 20 6e 65 65 64  pager never need
10000 73 20 74 6f 20 6b 6e 6f 77 20 74 68 69 73 20 69  s to know this i
10010 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f 20 69 74  n order to do it
10020 73 20 6a 6f 62 2e 20 20 20 54 68 69 73 0a 2a 2a  s job.   This.**
10030 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
10040 20 75 73 65 64 20 66 72 6f 6d 20 77 69 74 68 69   used from withi
10050 6e 20 61 73 73 65 72 74 28 29 20 61 6e 64 20 74  n assert() and t
10060 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73  estcase() macros
10070 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10080 70 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c  pagerNextJournal
10090 50 61 67 65 49 73 56 61 6c 69 64 28 50 61 67 65  PageIsValid(Page
100a0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
100b0 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
100c0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
100d0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
100e0 65 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  e */.  u32 cksum
100f0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
10100 68 65 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d  he page checksum
10110 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
10120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10130 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 72  turn code from r
10140 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a  ead operations *
10150 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
10160 20 2a 66 64 3b 20 20 20 20 2f 2a 20 54 68 65 20   *fd;    /* The 
10170 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
10180 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20 61 72  from which we ar
10190 65 20 72 65 61 64 69 6e 67 20 2a 2f 0a 20 20 75  e reading */.  u
101a0 38 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20  8 *aData;       
101b0 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
101c0 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 0a 20  f the page */.. 
101d0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67   /* Read the pag
101e0 65 20 6e 75 6d 62 65 72 20 68 65 61 64 65 72 20  e number header 
101f0 2a 2f 0a 20 20 66 64 20 3d 20 70 50 61 67 65 72  */.  fd = pPager
10200 2d 3e 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65  ->jfd;.  rc = re
10210 61 64 33 32 62 69 74 73 28 66 64 2c 20 70 50 61  ad32bits(fd, pPa
10220 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
10230 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72   &pgno);.  if( r
10240 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
10250 72 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20 20  return 0; }     
10260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e               /*N
10280 4f 5f 54 45 53 54 2a 2f 0a 20 20 69 66 28 20 70  O_TEST*/.  if( p
10290 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
102a0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
102b0 61 67 65 72 29 20 29 7b 20 72 65 74 75 72 6e 20  ager) ){ return 
102c0 30 3b 20 7d 20 20 20 20 20 20 20 20 20 2f 2a 4e  0; }         /*N
102d0 4f 5f 54 45 53 54 2a 2f 0a 20 20 69 66 28 20 70  O_TEST*/.  if( p
102e0 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72  gno>(Pgno)pPager
102f0 2d 3e 64 62 53 69 7a 65 20 29 7b 20 72 65 74 75  ->dbSize ){ retu
10300 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20  rn 0; }         
10310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e               /*N
10320 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52  O_TEST*/..  /* R
10330 65 61 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ead the checksum
10340 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33   */.  rc = read3
10350 32 62 69 74 73 28 66 64 2c 20 70 50 61 67 65 72  2bits(fd, pPager
10360 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 70 50 61  ->journalOff+pPa
10370 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c  ger->pageSize+4,
10380 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20   &cksum);.  if( 
10390 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
103a0 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20   return 0; }    
103b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
103d0 4e 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20 2f 2a 20  NO_TEST*/..  /* 
103e0 52 65 61 64 20 74 68 65 20 64 61 74 61 20 61 6e  Read the data an
103f0 64 20 76 65 72 69 66 79 20 74 68 65 20 63 68 65  d verify the che
10400 63 6b 73 75 6d 20 2a 2f 0a 20 20 61 44 61 74 61  cksum */.  aData
10410 20 3d 20 28 75 38 2a 29 70 50 61 67 65 72 2d 3e   = (u8*)pPager->
10420 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20  pTmpSpace;.  rc 
10430 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
10440 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
10450 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 61  r->pageSize, pPa
10460 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
10470 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
10480 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75 72  LITE_OK ){ retur
10490 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20  n 0; }          
104a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104b0 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53          /*NO_TES
104c0 54 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72 5f  T*/.  if( pager_
104d0 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44  cksum(pPager, aD
104e0 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 20 72  ata)!=cksum ){ r
104f0 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20  eturn 0; }      
10500 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53          /*NO_TES
10510 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 63 68 20  T*/..  /* Reach 
10520 74 68 69 73 20 70 6f 69 6e 74 20 6f 6e 6c 79 20  this point only 
10530 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 76  if the page is v
10540 61 6c 69 64 20 2a 2f 0a 20 20 72 65 74 75 72 6e  alid */.  return
10550 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
10560 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
10570 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
10580 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54  TE_COVERAGE_TEST
10590 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  ) */../*.** Para
105a0 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73  meter zMaster is
105b0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
105c0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
105d0 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75  le. A single jou
105e0 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61  rnal.** file tha
105f0 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68  t referred to th
10600 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10610 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62   file has just b
10620 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  een rolled back.
10630 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10640 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73   checks if it is
10650 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
10660 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
10670 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20  ournal file,.** 
10680 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69  and does so if i
10690 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  t is..**.** Argu
106a0 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79  ment zMaster may
106b0 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e   point to Pager.
106c0 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68  pTmpSpace. So th
106d0 61 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74  at buffer is not
106e0 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66   .** available f
106f0 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20 74 68  or use within th
10700 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
10710 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72  ** When a master
10720 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
10730 20 63 72 65 61 74 65 64 2c 20 69 74 20 69 73 20   created, it is 
10740 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
10750 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20  he names .** of 
10760 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64  all of its child
10770 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61   journals, one a
10780 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f  fter another, fo
10790 72 6d 61 74 74 65 64 20 61 73 20 75 74 66 2d 38  rmatted as utf-8
107a0 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78   .** encoded tex
107b0 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61  t. The end of ea
107c0 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ch child journal
107d0 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20   file is marked 
107e0 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74  with a .** nul-t
107f0 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28  erminator byte (
10800 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20  0x00). i.e. the 
10810 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
10820 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
10830 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20  nal.** file for 
10840 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
10850 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61  volving two data
10860 62 61 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a  bases might be:.
10870 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62  **.**   "/home/b
10880 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c  ill/a.db-journal
10890 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62  \x00/home/bill/b
108a0 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22  .db-journal\x00"
108b0 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20  .**.** A master 
108c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79  journal file may
108d0 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64   only be deleted
108e0 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73   once all of its
108f0 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e   child .** journ
10900 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f  als have been ro
10910 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
10920 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
10930 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  eads the content
10940 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d  s of the master-
10950 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
10960 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64  o .** memory and
10970 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65   loops through e
10980 61 63 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ach of the child
10990 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20   journal names. 
109a0 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c  For.** each chil
109b0 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68  d journal, it ch
109c0 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  ecks if:.**.**  
109d0 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20   * if the child 
109e0 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20  journal exists, 
109f0 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a  and if so.**   *
10a00 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f   if the child jo
10a10 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61  urnal contains a
10a20 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61   reference to ma
10a30 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a  ster journal .**
10a40 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65       file zMaste
10a50 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69  r.**.** If a chi
10a60 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  ld journal can b
10a70 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74  e found that mat
10a80 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65  ches both of the
10a90 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f   criteria.** abo
10aa0 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ve, this functio
10ab0 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75  n returns withou
10ac0 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
10ad0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a  . Otherwise, if.
10ae0 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64  ** no such child
10af0 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
10b00 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73  found, file zMas
10b10 74 65 72 20 69 73 20 64 65 6c 65 74 65 64 20 66  ter is deleted f
10b20 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d  rom.** the file-
10b30 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c  system using sql
10b40 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a  ite3OsDelete()..
10b50 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
10b60 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73  rror within this
10b70 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72   function, an er
10b80 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
10b90 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75  rned. This.** fu
10ba0 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73  nction allocates
10bb0 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69   memory by calli
10bc0 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  ng sqlite3Malloc
10bd0 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61  (). If an alloca
10be0 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53  tion.** fails, S
10bf0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
10c00 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
10c10 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20  se, if no IO or 
10c20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a  malloc errors .*
10c30 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f  * occur, SQLITE_
10c40 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
10c50 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73  **.** TODO: This
10c60 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
10c70 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f  tes a single blo
10c80 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20  ck of memory to 
10c90 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69  load.** the enti
10ca0 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
10cb0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10cc0 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75  l file. This cou
10cd0 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c  ld be.** a coupl
10ce0 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f  e of kilobytes o
10cf0 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c  r so - potential
10d00 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  ly larger than t
10d10 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65  he page .** size
10d20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10d30 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
10d40 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
10d50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
10d60 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  er){.  sqlite3_v
10d70 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
10d80 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  r->pVfs;.  int r
10d90 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
10da0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
10db0 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
10dc0 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20  _file *pMaster; 
10dd0 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d     /* Malloc'd m
10de0 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
10df0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
10e00 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
10e10 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20  *pJournal;   /* 
10e20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a  Malloc'd child-j
10e30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
10e40 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72  riptor */.  char
10e50 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   *zMasterJournal
10e60 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74   = 0; /* Content
10e70 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
10e80 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
10e90 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  4 nMasterJournal
10ea0 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  ;       /* Size 
10eb0 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
10ec0 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20  l file */..  /* 
10ed0 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
10ee0 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75  or both the pJou
10ef0 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72  rnal and pMaster
10f00 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
10f10 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65  s..  ** If succe
10f20 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20  ssful, open the 
10f30 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
10f40 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  ile for reading.
10f50 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20  .  */.  pMaster 
10f60 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
10f70 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
10f80 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ero(pVfs->szOsFi
10f90 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72  le * 2);.  pJour
10fa0 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  nal = (sqlite3_f
10fb0 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d  ile *)(((u8 *)pM
10fc0 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73  aster) + pVfs->s
10fd0 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  zOsFile);.  if( 
10fe0 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  !pMaster ){.    
10ff0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
11000 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
11010 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
11020 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
11030 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
11040 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
11050 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  AL);.    rc = sq
11060 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
11070 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74  , zMaster, pMast
11080 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  er, flags, 0);. 
11090 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
110a0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
110b0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
110c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
110d0 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20  leSize(pMaster, 
110e0 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  &nMasterJournal)
110f0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
11100 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
11110 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69  master_out;..  i
11120 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( nMasterJourna
11130 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  l>0 ){.    char 
11140 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63  *zJournal;.    c
11150 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20  har *zMasterPtr 
11160 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61  = 0;.    int nMa
11170 73 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e  sterPtr = pVfs->
11180 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20  mxPathname+1;.. 
11190 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65     /* Load the e
111a0 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
111b0 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73  rnal file into s
111c0 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
111d0 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  om.    ** sqlite
111e0 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  3_malloc() and p
111f0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
11200 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20  sterJournal. .  
11210 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72    */.    zMaster
11220 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20  Journal = (char 
11230 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  *)sqlite3Malloc(
11240 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72  (int)nMasterJour
11250 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72  nal + nMasterPtr
11260 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73  );.    if( !zMas
11270 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
11280 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11290 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
112a0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
112b0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74  .    }.    zMast
112c0 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72  erPtr = &zMaster
112d0 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
112e0 6f 75 72 6e 61 6c 5d 3b 0a 20 20 20 20 72 63 20  ournal];.    rc 
112f0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
11300 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72  pMaster, zMaster
11310 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d  Journal, (int)nM
11320 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29  asterJournal, 0)
11330 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
11340 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
11350 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
11360 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d     zJournal = zM
11370 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20  asterJournal;.  
11380 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e    while( (zJourn
11390 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al-zMasterJourna
113a0 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l)<nMasterJourna
113b0 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  l ){.      int e
113c0 78 69 73 74 73 3b 0a 20 20 20 20 20 20 72 63 20  xists;.      rc 
113d0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
113e0 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  s(pVfs, zJournal
113f0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
11400 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
11410 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
11420 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11430 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
11440 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
11450 0a 20 20 20 20 20 20 69 66 28 20 65 78 69 73 74  .      if( exist
11460 73 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  s ){.        /* 
11470 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
11480 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
11490 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
114a0 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
114b0 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
114c0 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
114d0 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
114e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
114f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20  .        ** so, 
11500 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
11510 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74  eleting the mast
11520 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
11530 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
11540 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20      int c;.     
11550 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
11560 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
11570 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
11580 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _MAIN_JOURNAL);.
11590 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
115a0 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
115b0 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72   zJournal, pJour
115c0 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  nal, flags, 0);.
115d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
115e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
115f0 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
11600 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
11610 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63     }..        rc
11620 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
11630 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a  rnal(pJournal, z
11640 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74  MasterPtr, nMast
11650 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20  erPtr);.        
11660 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
11670 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
11680 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11690 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
116a0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
116b0 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
116c0 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73          c = zMas
116d0 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
116e0 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
116f0 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
11700 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b          if( c ){
11710 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
11720 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44   have a match. D
11730 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
11740 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11750 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
11760 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
11770 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
11780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
11790 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69  Journal += (sqli
117a0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75  te3Strlen30(zJou
117b0 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a  rnal)+1);.    }.
117c0 20 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71    }.  .  rc = sq
117d0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
117e0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
117f0 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a  ..delmaster_out:
11800 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f  .  if( zMasterJo
11810 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c  urnal ){.    sql
11820 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65  ite3_free(zMaste
11830 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20  rJournal);.  }  
11840 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29  .  if( pMaster )
11850 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
11860 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
11870 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
11880 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a  en(pJournal) );.
11890 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
118a0 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ee(pMaster);.  r
118b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
118c0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
118d0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 61  n is used to cha
118e0 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c 20 73  nge the actual s
118f0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
11900 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20  ase .** file in 
11910 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
11920 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65   This only happe
11930 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69  ns when committi
11940 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
11950 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20  ,.** or rolling 
11960 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69  back a transacti
11970 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f  on (including ro
11980 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74  lling back a hot
11990 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a  -journal)..**.**
119a0 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74   If the main dat
119b0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f  abase file is no
119c0 74 20 6f 70 65 6e 2c 20 6f 72 20 61 6e 20 65 78  t open, or an ex
119d0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
119e0 6e 6f 74 0a 2a 2a 20 68 65 6c 64 2c 20 74 68 69  not.** held, thi
119f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
11a00 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
11a10 2c 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  , the size of th
11a20 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 68 61  e file is.** cha
11a30 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61  nged to nPage pa
11a40 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65  ges (nPage*pPage
11a50 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
11a60 73 29 2e 20 49 66 20 74 68 65 20 66 69 6c 65 0a  s). If the file.
11a70 2a 2a 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75  ** on disk is cu
11a80 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74  rrently larger t
11a90 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c  han nPage pages,
11aa0 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 56 46   then use the VF
11ab0 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29  S.** xTruncate()
11ac0 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63   method to trunc
11ad0 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72  ate it..**.** Or
11ae0 2c 20 69 74 20 6d 69 67 68 74 20 6d 69 67 68 74  , it might might
11af0 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
11b00 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  t the file on di
11b10 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  sk is smaller th
11b20 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67  an .** nPage pag
11b30 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69  es. Some operati
11b40 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d  ng system implem
11b50 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65  entations can ge
11b60 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a  t confused if .*
11b70 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75  * you try to tru
11b80 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20  ncate a file to 
11b90 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69  some size that i
11ba0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74  s larger than it
11bb0 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69   .** currently i
11bc0 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68 69  s, so detect thi
11bd0 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65  s case and write
11be0 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62   a single zero b
11bf0 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65  yte to .** the e
11c00 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69  nd of the new fi
11c10 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  le instead..**.*
11c20 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
11c30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11c40 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  K. If an IO erro
11c50 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d  r occurs while m
11c60 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20  odifying.** the 
11c70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72  database file, r
11c80 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
11c90 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
11ca0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
11cb0 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
11cc0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
11cd0 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69  Pgno nPage){.  i
11ce0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
11cf0 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
11d00 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
11d10 43 4c 55 53 49 56 45 20 26 26 20 69 73 4f 70 65  CLUSIVE && isOpe
11d20 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
11d30 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74  .    i64 current
11d40 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20  Size, newSize;. 
11d50 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69     /* TODO: Is i
11d60 74 20 73 61 66 65 20 74 6f 20 75 73 65 20 50 61  t safe to use Pa
11d70 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68  ger.dbFileSize h
11d80 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ere? */.    rc =
11d90 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
11da0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
11db0 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20  currentSize);.  
11dc0 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67    newSize = pPag
11dd0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36  er->pageSize*(i6
11de0 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28  4)nPage;.    if(
11df0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
11e00 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e  & currentSize!=n
11e10 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
11e20 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e  if( currentSize>
11e30 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
11e40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
11e50 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
11e60 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a  ->fd, newSize);.
11e70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11e80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11e90 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
11ea0 3e 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65 77 53  >fd, "", 1, newS
11eb0 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  ize-1);.      }.
11ec0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
11ed0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11ee0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
11ef0 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  eSize = nPage;. 
11f00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
11f10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11f20 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76  ./*.** Set the v
11f30 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67 65  alue of the Page
11f40 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
11f50 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69  iable for the gi
11f60 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73  ven.** pager bas
11f70 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ed on the value 
11f80 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
11f90 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68  xSectorSize meth
11fa0 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65  od.** of the ope
11fb0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
11fc0 20 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   The sector size
11fd0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 75 73   will be used us
11fe0 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ed .** to determ
11ff0 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64  ine the size and
12000 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f   alignment of jo
12010 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64  urnal header and
12020 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72   .** master jour
12030 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74  nal pointers wit
12040 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72  hin created jour
12050 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  nal files..**.**
12060 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   For temporary f
12070 69 6c 65 73 20 74 68 65 20 65 66 66 65 63 74 69  iles the effecti
12080 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  ve sector size i
12090 73 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  s always 512 byt
120a0 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  es..**.** Otherw
120b0 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d  ise, for non-tem
120c0 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68  porary files, th
120d0 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
120e0 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68  or size is.** th
120f0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
12100 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53   by the xSectorS
12110 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75  ize() method rou
12120 6e 64 65 64 20 75 70 20 74 6f 20 35 31 32 20 69  nded up to 512 i
12130 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20  f.** it is less 
12140 74 68 61 6e 20 35 31 32 2c 20 6f 72 20 72 6f 75  than 512, or rou
12150 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58  nded down to MAX
12160 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20  _SECTOR_SIZE if 
12170 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  it.** is greater
12180 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52   than MAX_SECTOR
12190 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  _SIZE..*/.static
121a0 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53   void setSectorS
121b0 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
121c0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73  r){.  assert( is
121d0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
121e0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
121f0 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 21  File );..  if( !
12200 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
12210 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f   ){.    /* Secto
12220 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d  r size doesn't m
12230 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72  atter for tempor
12240 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c  ary files. Also,
12250 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
12260 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65   may not have be
12270 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69  en opened yet, i
12280 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
12290 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a   OsSectorSize().
122a0 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c      ** call will
122b0 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a   segfault..    *
122c0 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
122d0 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
122e0 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
122f0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a  Pager->fd);.  }.
12300 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
12310 63 74 6f 72 53 69 7a 65 3c 35 31 32 20 29 7b 0a  ctorSize<512 ){.
12320 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
12330 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20  orSize = 512;.  
12340 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
12350 73 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53  sectorSize>MAX_S
12360 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20  ECTOR_SIZE ){.  
12370 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45    assert( MAX_SE
12380 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29  CTOR_SIZE>=512 )
12390 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  ;.    pPager->se
123a0 63 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f 53  ctorSize = MAX_S
123b0 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a  ECTOR_SIZE;.  }.
123c0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
123d0 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  k the journal an
123e0 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74  d thus restore t
123f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
12400 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65   to.** the state
12410 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72   it was in befor
12420 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b  e we started mak
12430 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a  ing changes.  .*
12440 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
12450 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20   file format is 
12460 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a  as follows: .**.
12470 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20  **  (1)  8 byte 
12480 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20  prefix.  A copy 
12490 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of aJournalMagic
124a0 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62  []..**  (2)  4 b
124b0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
124c0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
124d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61  the number of va
124e0 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73  lid page records
124f0 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65  .**       in the
12500 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68   journal.  If th
12510 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  is value is 0xff
12520 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d  ffffff, then com
12530 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  pute the.**     
12540 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65    number of page
12550 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
12560 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a  e journal size..
12570 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20  **  (3)  4 byte 
12580 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
12590 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
125a0 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f  initial value fo
125b0 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20  r the .**       
125c0 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e  sanity checksum.
125d0 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65  .**  (4)  4 byte
125e0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
125f0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
12600 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74  pages to truncat
12610 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64  e the.**       d
12620 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e  atabase to durin
12630 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  g a rollback..**
12640 20 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69    (5)  4 byte bi
12650 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
12660 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65   which is the se
12670 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20  ctor size.  The 
12680 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20  header.**       
12690 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  is this many byt
126a0 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20  es in size..**  
126b0 28 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (6)  4 byte big-
126c0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
126d0 68 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65  hich is the page
126e0 20 63 61 73 65 2e 0a 2a 2a 20 20 28 37 29 20 20   case..**  (7)  
126f0 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
12700 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
12710 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
12720 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
12730 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e  l.**       name.
12740 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20    The value may 
12750 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74  be zero (indicat
12760 65 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  e that there is 
12770 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20  no master.**    
12780 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20     journal.).** 
12790 20 28 38 29 20 20 4e 20 62 79 74 65 73 20 6f 66   (8)  N bytes of
127a0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
127b0 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e  nal name.  The n
127c0 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d  ame will be nul-
127d0 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20  terminated.**   
127e0 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65      and might be
127f0 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68   shorter than th
12800 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
12810 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65 20 66  m (5).  If the f
12820 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20  irst byte.**    
12830 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69     of the name i
12840 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72  s \000 then ther
12850 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a  e is no master j
12860 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73  ournal.  The mas
12870 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75  ter.**       jou
12880 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f  rnal name is sto
12890 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a  red in UTF-8..**
128a0 20 20 28 39 29 20 20 5a 65 72 6f 20 6f 72 20 6d    (9)  Zero or m
128b0 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e  ore pages instan
128c0 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c  ces, each as fol
128d0 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20  lows:.**        
128e0 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e  +  4 byte page n
128f0 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20  umber..**       
12900 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65   +  pPager->page
12910 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
12920 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ta..**        + 
12930 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d   4 byte checksum
12940 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73  .**.** When we s
12950 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  peak of the jour
12960 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d  nal header, we m
12970 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 38 20  ean the first 8 
12980 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20  items above..** 
12990 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68  Each entry in th
129a0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20  e journal is an 
129b0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
129c0 39 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  9th item..**.** 
129d0 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66  Call the value f
129e0 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62  rom the second b
129f0 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e  ullet "nRec".  n
12a00 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Rec is the numbe
12a10 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61  r of.** valid pa
12a20 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ge entries in th
12a30 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d  e journal.  In m
12a40 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63  ost cases, you c
12a50 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  an compute the.*
12a60 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  * value of nRec 
12a70 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
12a80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12a90 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77  e.  But if a pow
12aa0 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63  er.** failure oc
12ab0 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65  curred while the
12ac0 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
12ad0 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63  ng written, it c
12ae0 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63  ould be the.** c
12af0 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a  ase that the siz
12b00 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
12b10 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64   file had alread
12b20 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64  y been increased
12b30 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72   but.** the extr
12b40 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f  a entries had no
12b50 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61  t yet made it sa
12b60 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49  fely to disk.  I
12b70 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a  n such a case,.*
12b80 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
12b90 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f  Rec computed fro
12ba0 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  m the file size 
12bb0 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72  would be too lar
12bc0 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74  ge.  For.** that
12bd0 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61   reason, we alwa
12be0 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20  ys use the nRec 
12bf0 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61  value in the hea
12c00 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  der..**.** If th
12c10 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20  e nRec value is 
12c20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65  0xffffffff it me
12c30 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68  ans that nRec sh
12c40 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
12c50 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  .** from the fil
12c60 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61  e size.  This va
12c70 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e  lue is used when
12c80 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74   the user select
12c90 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63  s the.** no-sync
12ca0 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20   option for the 
12cb0 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65  journal.  A powe
12cc0 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
12cd0 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69  lead to corrupti
12ce0 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  on.** in this ca
12cf0 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69  se.  But for thi
12d00 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61  ngs like tempora
12d10 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20  ry table (which 
12d20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74  will be.** delet
12d30 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65  ed when the powe
12d40 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77  r is restored) w
12d50 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a  e don't care.  .
12d60 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
12d70 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20  e opened as the 
12d80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
12d90 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  not a well-forme
12da0 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  d.** journal fil
12db0 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  e then all pages
12dc0 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74   up to the first
12dd0 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20   corrupted page 
12de0 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61  are rolled.** ba
12df0 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20  ck (or no pages 
12e00 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  if the journal h
12e10 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74  eader is corrupt
12e20 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ed). The journal
12e30 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e   file.** is then
12e40 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c   deleted and SQL
12e50 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c  ITE_OK returned,
12e60 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63   just as if no c
12e70 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a  orruption had.**
12e80 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65   been encountere
12e90 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
12ea0 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  /O or malloc() e
12eb0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
12ec0 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73   journal-file is
12ed0 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20   not deleted.** 
12ee0 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
12ef0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
12f00 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70  *.** The isHot p
12f10 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74  arameter indicat
12f20 65 73 20 74 68 61 74 20 77 65 20 61 72 65 20 74  es that we are t
12f30 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  rying to rollbac
12f40 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74  k a journal.** t
12f50 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 20 68  hat might be a h
12f60 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c  ot journal.  Or,
12f70 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61   it could be tha
12f80 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
12f90 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62   .** preserved b
12fa0 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41  ecause of JOURNA
12fb0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72  LMODE_PERSIST or
12fc0 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55   JOURNALMODE_TRU
12fd0 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65  NCATE..** If the
12fe0 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20   journal really 
12ff0 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68  is hot, reset th
13000 65 20 70 61 67 65 72 20 63 61 63 68 65 20 70 72  e pager cache pr
13010 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62  ior rolling.** b
13020 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e  ack any content.
13030 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    If the journal
13040 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69   is merely persi
13050 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20  stent, no reset 
13060 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f  is.** needed..*/
13070 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
13080 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  r_playback(Pager
13090 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73   *pPager, int is
130a0 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Hot){.  sqlite3_
130b0 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
130c0 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20  er->pVfs;.  i64 
130d0 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
130e0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
130f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13100 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
13110 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  32 nRec;        
13120 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
13130 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20  r of Records in 
13140 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
13150 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20   u32 u;         
13160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
13170 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
13180 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  er */.  Pgno mxP
13190 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
131a0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
131b0 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e  original file in
131c0 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
131d0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
131e0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
131f0 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ode of a subrout
13200 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  ine */.  int res
13210 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
13220 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
13230 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
13240 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68  Access() */.  ch
13250 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
13260 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
13270 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
13280 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a   file if any */.
13290 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52    int needPagerR
132a0 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72  eset;      /* Tr
132b0 75 65 20 74 6f 20 72 65 73 65 74 20 70 61 67 65  ue to reset page
132c0 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20   prior to first 
132d0 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  page rollback */
132e0 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
132f0 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
13300 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f  ds are in the jo
13310 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61  urnal.  Abort ea
13320 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  rly if.  ** the 
13330 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79  journal is empty
13340 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
13350 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
13360 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  jfd) );.  rc = s
13370 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
13380 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  (pPager->jfd, &s
13390 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
133a0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d  QLITE_OK || szJ=
133b0 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  =0 ){.    goto e
133c0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
133d0 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
133e0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
133f0 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ame from the jou
13400 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70  rnal, if it is p
13410 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20  resent..  ** If 
13420 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
13430 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70   file name is sp
13440 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65  ecified, but the
13450 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a   file is not.  *
13460 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73  * present on dis
13470 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  k, then the jour
13480 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61  nal is not hot a
13490 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  nd does not need
134a0 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79   to be.  ** play
134b0 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20  ed back..  **.  
134c0 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63  ** TODO: Technic
134d0 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ally the followi
134e0 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62  ng is an error b
134f0 65 63 61 75 73 65 20 69 74 20 61 73 73 75 6d 65  ecause it assume
13500 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66  s that.  ** buff
13510 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  er Pager.pTmpSpa
13520 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d  ce is (mxPathnam
13530 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61  e+1) bytes or la
13540 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a  rger. i.e. that.
13550 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61    ** (pPager->pa
13560 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72  geSize >= pPager
13570 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
13580 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f  me+1). Using os_
13590 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78  unix.c,.  **  mx
135a0 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32 2c  Pathname is 512,
135b0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 61   which is the sa
135c0 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d 75  me as the minimu
135d0 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75  m allowable valu
135e0 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 53  e.  ** for pageS
135f0 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73  ize..  */.  zMas
13600 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ter = pPager->pT
13610 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20  mpSpace;.  rc = 
13620 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
13630 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  l(pPager->jfd, z
13640 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
13650 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
13660 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  +1);.  if( rc==S
13670 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
13680 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63  ter[0] ){.    rc
13690 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
136a0 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  ss(pVfs, zMaster
136b0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
136c0 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20  EXISTS, &res);. 
136d0 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30   }.  zMaster = 0
136e0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
136f0 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b  TE_OK || !res ){
13700 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
13710 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50  ayback;.  }.  pP
13720 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
13730 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67 65   = 0;.  needPage
13740 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a  rReset = isHot;.
13750 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  /* This loop 
13760 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65  terminates eithe
13770 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f 75  r when a readJou
13780 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20 20  rnalHdr() or .  
13790 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  ** pager_playbac
137a0 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61 6c  k_one_page() cal
137b0 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  l returns SQLITE
137c0 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65  _DONE or an IO e
137d0 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72  rror .  ** occur
137e0 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  s. .  */.  while
137f0 28 20 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ( 1 ){.    int i
13800 73 55 6e 73 79 6e 63 20 3d 20 30 3b 0a 0a 20 20  sUnsync = 0;..  
13810 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65    /* Read the ne
13820 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
13830 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  r from the journ
13840 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  al file.  If the
13850 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f  re are.    ** no
13860 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c  t enough bytes l
13870 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  eft in the journ
13880 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f  al file for a co
13890 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f  mplete header, o
138a0 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63  r.    ** it is c
138b0 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61  orrupted, then a
138c0 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66   process must of
138d0 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72   failed while wr
138e0 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a  iting it..    **
138f0 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   This indicates 
13900 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65  nothing more nee
13910 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ds to be rolled 
13920 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  back..    */.   
13930 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
13940 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69 73 48  lHdr(pPager, isH
13950 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20  ot, szJ, &nRec, 
13960 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20  &mxPg);.    if( 
13970 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13980 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d   .      if( rc==
13990 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
139a0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
139b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
139c0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
139d0 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20  ayback;.    }.. 
139e0 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
139f0 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
13a00 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  n this journal w
13a10 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
13a20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77  process.    ** w
13a30 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e  orking in no-syn
13a40 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61  c mode. This mea
13a50 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74  ns that the rest
13a60 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
13a70 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73      ** file cons
13a80 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74  ists of pages, t
13a90 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
13aa0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73   journal headers
13ab0 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a  . Compute.    **
13ac0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
13ad0 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73  ec based on this
13ae0 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20   assumption..   
13af0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
13b00 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a  ==0xffffffff ){.
13b10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
13b20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
13b30 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
13b40 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
13b50 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28    nRec = (int)((
13b60 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44  szJ - JOURNAL_HD
13b70 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f  R_SZ(pPager))/JO
13b80 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
13b90 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  er));.    }..   
13ba0 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30   /* If nRec is 0
13bb0 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61   and this rollba
13bc0 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73  ck is of a trans
13bd0 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62  action created b
13be0 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72  y this.    ** pr
13bf0 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74 68 69  ocess and if thi
13c00 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68  s is the final h
13c10 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75  eader in the jou
13c20 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65  rnal, then it me
13c30 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ans.    ** that 
13c40 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  this part of the
13c50 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
13c60 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61  ng filled but ha
13c70 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20  s not yet been. 
13c80 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20     ** synced to 
13c90 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74  disk.  Compute t
13ca0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
13cb0 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  es based on the 
13cc0 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a  remaining.    **
13cd0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
13ce0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
13cf0 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d 20   The third term 
13d00 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73 20  of the test was 
13d10 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69 63  added to fix tic
13d20 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a  ket #2565..    *
13d30 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62  * When rolling b
13d40 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  ack a hot journa
13d50 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79  l, nRec==0 alway
13d60 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
13d70 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75   next.    ** chu
13d80 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nk of the journa
13d90 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20  l contains zero 
13da0 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c  pages to be roll
13db0 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20  ed back.  But.  
13dc0 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20    ** when doing 
13dd0 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74  a ROLLBACK and t
13de0 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b  he nRec==0 chunk
13df0 20 69 73 20 74 68 65 20 6c 61 73 74 20 63 68 75   is the last chu
13e00 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  nk in.    ** the
13e10 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61   journal, it mea
13e20 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ns that the jour
13e30 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
13e40 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20  n additional.   
13e50 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e   ** pages that n
13e60 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eed to be rolled
13e70 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74   back and that t
13e80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
13e90 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c  es .    ** shoul
13ea0 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61  d be computed ba
13eb0 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  sed on the journ
13ec0 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20  al file size..  
13ed0 20 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73    */.    testcas
13ee0 65 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69  e( nRec==0 && !i
13ef0 73 48 6f 74 0a 20 20 20 20 20 20 20 20 20 26 26  sHot.         &&
13f00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13f10 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
13f20 53 5a 28 70 50 61 67 65 72 29 21 3d 70 50 61 67  SZ(pPager)!=pPag
13f30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20  er->journalOff. 
13f40 20 20 20 20 20 20 20 20 26 26 20 28 28 73 7a 4a          && ((szJ
13f50 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
13f60 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c  alOff) / JOURNAL
13f70 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3e  _PG_SZ(pPager))>
13f80 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 61  0.         && pa
13f90 67 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c 50 61  gerNextJournalPa
13fa0 67 65 49 73 56 61 6c 69 64 28 70 50 61 67 65 72  geIsValid(pPager
13fb0 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ).    );.    if(
13fc0 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48   nRec==0 && !isH
13fd0 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50  ot &&.        pP
13fe0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
13ff0 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
14000 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
14010 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20  >journalOff ){. 
14020 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74       nRec = (int
14030 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
14040 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a  >journalOff) / J
14050 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
14060 67 65 72 29 29 3b 0a 20 20 20 20 20 20 69 73 55  ger));.      isU
14070 6e 73 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 7d  nsync = 1;.    }
14080 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
14090 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65   is the first he
140a0 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74  ader read from t
140b0 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e  he journal, trun
140c0 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  cate the.    ** 
140d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61  database file ba
140e0 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
140f0 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  al size..    */.
14100 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
14110 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
14120 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
14130 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
14140 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
14150 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20  pPager, mxPg);. 
14160 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
14170 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14180 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
14190 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ack;.      }.   
141a0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
141b0 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a  e = mxPg;.    }.
141c0 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69  .    /* Copy ori
141d0 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20  ginal pages out 
141e0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
141f0 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
14200 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73   .    ** databas
14210 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61  e file and/or pa
14220 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f  ge cache..    */
14230 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c  .    for(u=0; u<
14240 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20  nRec; u++){.    
14250 20 20 69 66 28 20 6e 65 65 64 50 61 67 65 72 52    if( needPagerR
14260 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  eset ){.        
14270 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
14280 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65  er);.        nee
14290 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b  dPagerReset = 0;
142a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
142b0 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
142c0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
142d0 65 72 2c 31 2c 69 73 55 6e 73 79 6e 63 2c 26 70  er,1,isUnsync,&p
142e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
142f0 66 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 69 66  f,0,0);.      if
14300 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14310 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
14320 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
14330 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
14340 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
14350 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
14360 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
14370 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
14380 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
14390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
143a0 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
143b0 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20   rollback, quit 
143c0 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
143d0 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  rror.          *
143e0 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69  * code.  This wi
143f0 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67  ll cause the pag
14400 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
14410 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20  error state.    
14420 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74        ** so that
14430 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d   no further harm
14440 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20   will be done.  
14450 50 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74  Perhaps the next
14460 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
14470 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c  ocess to come al
14480 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65  ong will be able
14490 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
144a0 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
144b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
144c0 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
144d0 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ack;.        }. 
144e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
144f0 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a  .  /*NOTREACHED*
14500 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b  /.  assert( 0 );
14510 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a  ..end_playback:.
14520 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61    /* Following a
14530 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64   rollback, the d
14540 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
14550 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69  uld be back in i
14560 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  ts original.  **
14570 20 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20   state prior to 
14580 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
14590 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f   transaction, so
145a0 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a   invoke the.  **
145b0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42   SQLITE_FCNTL_DB
145c0 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d  _UNCHANGED file-
145d0 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74  control method t
145e0 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20  o disable the.  
145f0 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61  ** assertion tha
14600 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
14610 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f  n counter was mo
14620 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  dified..  */.  a
14630 73 73 65 72 74 28 0a 20 20 20 20 70 50 61 67 65  ssert(.    pPage
14640 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 3d  r->fd->pMethods=
14650 3d 30 20 7c 7c 0a 20 20 20 20 73 71 6c 69 74 65  =0 ||.    sqlite
14660 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
14670 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45  Pager->fd,SQLITE
14680 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e  _FCNTL_DB_UNCHAN
14690 47 45 44 2c 30 29 3e 3d 53 51 4c 49 54 45 5f 4f  GED,0)>=SQLITE_O
146a0 4b 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  K.  );..  /* If 
146b0 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73  this playback is
146c0 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d   happening autom
146d0 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65  atically as a re
146e0 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72  sult of an IO or
146f0 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72   .  ** malloc er
14700 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72 65  ror that occurre
14710 64 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e  d after the chan
14720 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75  ge-counter was u
14730 70 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a  pdated but .  **
14740 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
14750 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d  saction was comm
14760 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20  itted, then the 
14770 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a  change-counter .
14780 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f    ** modificatio
14790 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20  n may just have 
147a0 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49  been reverted. I
147b0 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 69  f this happens i
147c0 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a  n exclusive .  *
147d0 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62  * mode, then sub
147e0 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74  sequent transact
147f0 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62  ions performed b
14800 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  y the connection
14810 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75   will not.  ** u
14820 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
14830 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e  -counter at all.
14840 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74   This may lead t
14850 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73  o cache inconsis
14860 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c  tency.  ** probl
14870 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72  ems for other pr
14880 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20  ocesses at some 
14890 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
148a0 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20  ure. So, just.  
148b0 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73 20  ** in case this 
148c0 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c  has happened, cl
148d0 65 61 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f  ear the changeCo
148e0 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77  untDone flag now
148f0 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
14900 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
14910 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
14920 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ile;..  if( rc==
14930 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14940 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65   zMaster = pPage
14950 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
14960 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
14970 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
14980 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
14990 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
149a0 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20  athname+1);.    
149b0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
149c0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
149d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
149e0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
149f0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
14a00 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61  tion(pPager, zMa
14a10 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a  ster[0]!='\0');.
14a20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
14a30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
14a40 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
14a50 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
14a60 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20  r[0] && res ){. 
14a70 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
14a80 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  as a master jour
14a90 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75  nal and this rou
14aa0 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
14ab0 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a   success,.    **
14ac0 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f   see if it is po
14ad0 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
14ae0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
14af0 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nal..    */.    
14b00 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61  rc = pager_delma
14b10 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61  ster(pPager, zMa
14b20 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63  ster);.    testc
14b30 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
14b40 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OK );.  }..  /* 
14b50 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  The Pager.sector
14b60 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
14b70 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61  y have been upda
14b80 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e  ted while rollin
14b90 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f  g.  ** back a jo
14ba0 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79  urnal created by
14bb0 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20   a process with 
14bc0 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63 74  a different sect
14bd0 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c  or size.  ** val
14be0 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20  ue. Reset it to 
14bf0 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75  the correct valu
14c00 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
14c10 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65  ss..  */.  setSe
14c20 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
14c30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14c40 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
14c50 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65   savepoint pSave
14c60 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53  point. Or, if pS
14c70 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20  avepoint==NULL, 
14c80 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a  then playback.**
14c90 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74   the entire mast
14ca0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
14cb0 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65 70   The case pSavep
14cc0 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72  oint==NULL occur
14cd0 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c  s when .** a ROL
14ce0 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64  LBACK TO command
14cf0 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61   is invoked on a
14d00 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20   SAVEPOINT that 
14d10 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
14d20 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a   .** savepoint..
14d30 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65  **.** When pSave
14d40 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  point is not NUL
14d50 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e  L (meaning a non
14d60 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76  -transaction sav
14d70 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65  epoint is .** be
14d80 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29  ing rolled back)
14d90 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62  , then the rollb
14da0 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ack consists of 
14db0 75 70 20 74 6f 20 74 68 72 65 65 20 73 74 61 67  up to three stag
14dc0 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64  es,.** performed
14dd0 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70   in the order sp
14de0 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  ecified:.**.**  
14df0 20 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c 61   * Pages are pla
14e00 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
14e10 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
14e20 74 61 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a  tarting at byte.
14e30 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50 61  **     offset Pa
14e40 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66  gerSavepoint.iOf
14e50 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75  fset and continu
14e60 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50  ing to .**     P
14e70 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
14e80 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20  drOffset, or to 
14e90 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
14ea0 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ain journal.**  
14eb0 20 20 20 66 69 6c 65 20 69 66 20 50 61 67 65 72     file if Pager
14ec0 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
14ed0 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a  fset is zero..**
14ee0 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72  .**   * If Pager
14ef0 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
14f00 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f  fset is not zero
14f10 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65  , then pages are
14f20 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62   played.**     b
14f30 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f  ack starting fro
14f40 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
14f50 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  ader immediately
14f60 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20   following .**  
14f70 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
14f80 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20  t.iHdrOffset to 
14f90 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
14fa0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
14fb0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65  ..**.**   * Page
14fc0 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65  s are then playe
14fd0 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
14fe0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
14ff0 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20  , starting.**   
15000 20 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72    with the Pager
15010 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65  Savepoint.iSubRe
15020 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  c and continuing
15030 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a   to the end of.*
15040 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  *     the journa
15050 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  l file..**.** Th
15060 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c  roughout the rol
15070 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65  lback process, e
15080 61 63 68 20 74 69 6d 65 20 61 20 70 61 67 65 20  ach time a page 
15090 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
150a0 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  the.** correspon
150b0 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20  ding bit is set 
150c0 69 6e 20 61 20 62 69 74 76 65 63 20 73 74 72 75  in a bitvec stru
150d0 63 74 75 72 65 20 28 76 61 72 69 61 62 6c 65 20  cture (variable 
150e0 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20  pDone in the.** 
150f0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62  implementation b
15100 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75  elow). This is u
15110 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  sed to ensure th
15120 61 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c  at a page is onl
15130 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y.** rolled back
15140 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
15150 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  it is encountere
15160 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72  d in either jour
15170 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53  nal..**.** If pS
15180 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c  avepoint is NULL
15190 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65  , then pages are
151a0 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63   only played bac
151b0 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a  k from the main.
151c0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
151d0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
151e0 64 20 66 6f 72 20 61 20 62 69 74 76 65 63 20 69  d for a bitvec i
151f0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
15200 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ** In either cas
15210 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61  e, before playba
15220 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65  ck commences the
15230 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61   Pager.dbSize va
15240 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73  riable.** is res
15250 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
15260 74 68 61 74 20 69 74 20 68 65 6c 64 20 61 74 20  that it held at 
15270 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
15280 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28   savepoint .** (
15290 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  or transaction).
152a0 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61 20   No page with a 
152b0 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61  page-number grea
152c0 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61  ter than this va
152d0 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64  lue.** is played
152e0 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73   back. If one is
152f0 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20   encountered it 
15300 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65  is simply skippe
15310 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
15320 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61   pagerPlaybackSa
15330 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70  vepoint(Pager *p
15340 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76 65  Pager, PagerSave
15350 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e  point *pSavepoin
15360 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  t){.  i64 szJ;  
15370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15380 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a 65  * Effective size
15390 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
153a0 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48  rnal */.  i64 iH
153b0 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
153c0 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72     /* End of fir
153d0 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61  st segment of ma
153e0 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  in-journal recor
153f0 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ds */.  int rc =
15400 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
15410 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
15420 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
15430 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ne = 0;       /*
15440 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72   Bitvec to ensur
15450 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62  e pages played b
15460 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f  ack only once */
15470 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
15480 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
15490 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a  _SHARED );..  /*
154a0 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76   Allocate a bitv
154b0 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f  ec to use to sto
154c0 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70 61  re the set of pa
154d0 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
154e0 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
154f0 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65  int ){.    pDone
15500 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
15510 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e  Create(pSavepoin
15520 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69  t->nOrig);.    i
15530 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20  f( !pDone ){.   
15540 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15550 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
15560 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
15570 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 61  database size ba
15580 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ck to the value 
15590 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68  it was before th
155a0 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a  e savepoint .  *
155b0 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64  * being reverted
155c0 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a   was opened..  *
155d0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
155e0 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20  ze = pSavepoint 
155f0 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f  ? pSavepoint->nO
15600 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62  rig : pPager->db
15610 4f 72 69 67 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20  OrigSize;..  /* 
15620 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  Use pPager->jour
15630 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66  nalOff as the ef
15640 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20  fective size of 
15650 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
15660 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20  k.  ** journal. 
15670 20 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   The actual file
15680 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72   might be larger
15690 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20   than this in.  
156a0 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ** PAGER_JOURNAL
156b0 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72  MODE_TRUNCATE or
156c0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
156d0 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74  DE_PERSIST.  But
156e0 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70   anything.  ** p
156f0 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ast pPager->jour
15700 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69  nalOff is off-li
15710 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f  mits to us..  */
15720 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d  .  szJ = pPager-
15730 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
15740 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c  /* Begin by roll
15750 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73  ing back records
15760 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
15770 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
15780 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76  at.  ** PagerSav
15790 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61  epoint.iOffset a
157a0 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
157b0 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
157c0 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54  l header..  ** T
157d0 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 72 65  here might be re
157e0 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69  cords in the mai
157f0 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68  n journal that h
15800 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ave a page numbe
15810 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74  r.  ** greater t
15820 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
15830 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 28 70  database size (p
15840 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62  Pager->dbSize) b
15850 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69  ut those.  ** wi
15860 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61 75  ll be skipped au
15870 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61  tomatically.  Pa
15880 67 65 73 20 61 72 65 20 61 64 64 65 64 20 74 6f  ges are added to
15890 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20   pDone as they. 
158a0 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62   ** are played b
158b0 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ack..  */.  if( 
158c0 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
158d0 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76    iHdrOff = pSav
158e0 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
158f0 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d  et ? pSavepoint-
15900 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a  >iHdrOffset : sz
15910 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  J;.    pPager->j
15920 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76  ournalOff = pSav
15930 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b  epoint->iOffset;
15940 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
15950 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
15960 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
15970 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20  iHdrOff ){.     
15980 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
15990 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
159a0 61 67 65 72 2c 20 31 2c 20 30 2c 20 26 70 50 61  ager, 1, 0, &pPa
159b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
159c0 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20 20   1, pDone);.    
159d0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
159e0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
159f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
15a00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15a10 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
15a20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67  Continue rolling
15a30 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75   back records ou
15a40 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
15a50 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
15a60 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  t.  ** the first
15a70 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
15a80 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75  seen and continu
15a90 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66  ing until the ef
15aa0 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a  fective end.  **
15ab0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
15ac0 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74  rnal file.  Cont
15ad0 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74  inue to skip out
15ae0 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
15af0 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75  and.  ** continu
15b00 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20 72  e adding pages r
15b10 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44  olled back to pD
15b20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  one..  */.  whil
15b30 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
15b40 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
15b50 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20  nalOff<szJ ){.  
15b60 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
15b70 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
15b80 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20  nter */.    u32 
15b90 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f  nJRec = 0;     /
15ba0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72  * Number of Jour
15bb0 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20  nal Records */. 
15bc0 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
15bd0 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
15be0 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c  alHdr(pPager, 0,
15bf0 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64   szJ, &nJRec, &d
15c00 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72  ummy);.    asser
15c10 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
15c20 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  NE );..    /*.  
15c30 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72    ** The "pPager
15c40 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
15c50 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
15c60 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
15c70 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20  rnalOff".    ** 
15c80 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20  test is related 
15c90 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  to ticket #2565.
15ca0 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73    See the discus
15cb0 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  sion in the.    
15cc0 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  ** pager_playbac
15cd0 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  k() function for
15ce0 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
15cf0 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  rmation..    */.
15d00 20 20 20 20 61 73 73 65 72 74 28 20 21 28 6e 4a      assert( !(nJ
15d10 52 65 63 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  Rec==0.         
15d20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
15d30 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
15d40 52 5f 53 5a 28 70 50 61 67 65 72 29 21 3d 70 50  R_SZ(pPager)!=pP
15d50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15d60 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28 73  .         && ((s
15d70 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
15d80 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e  rnalOff) / JOURN
15d90 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
15da0 29 3e 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  )>0.         && 
15db0 70 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c  pagerNextJournal
15dc0 50 61 67 65 49 73 56 61 6c 69 64 28 70 50 61 67  PageIsValid(pPag
15dd0 65 72 29 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  er)).    );.    
15de0 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20  if( nJRec==0 .  
15df0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
15e00 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
15e10 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
15e20 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
15e30 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Off.    ){.     
15e40 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28   nJRec = (u32)((
15e50 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
15e60 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41  urnalOff)/JOURNA
15e70 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
15e80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
15e90 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ii=0; rc==SQLITE
15ea0 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20  _OK && ii<nJRec 
15eb0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
15ec0 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29  alOff<szJ; ii++)
15ed0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
15ee0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
15ef0 70 61 67 65 28 70 50 61 67 65 72 2c 20 31 2c 20  page(pPager, 1, 
15f00 30 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  0, &pPager->jour
15f10 6e 61 6c 4f 66 66 2c 20 31 2c 20 70 44 6f 6e 65  nalOff, 1, pDone
15f20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
15f30 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
15f40 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73  DONE );.  }.  as
15f50 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
15f60 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  _OK || pPager->j
15f70 6f 75 72 6e 61 6c 4f 66 66 3d 3d 73 7a 4a 20 29  ournalOff==szJ )
15f80 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c  ;..  /* Finally,
15f90 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73    rollback pages
15fa0 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
15fb0 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61  urnal.  Page tha
15fc0 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76  t were.  ** prev
15fd0 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61  iously rolled ba
15fe0 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ck out of the ma
15ff0 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  in journal (and 
16000 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f  are hence in pDo
16010 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ne).  ** will be
16020 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f   skipped.  Out-o
16030 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 72  f-range pages ar
16040 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a  e also skipped..
16050 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65    */.  if( pSave
16060 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32  point ){.    u32
16070 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
16080 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
16090 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  */.    i64 offse
160a0 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t = pSavepoint->
160b0 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65  iSubRec*(4+pPage
160c0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
160d0 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
160e0 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
160f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
16100 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  i<pPager->nSubRe
16110 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
16120 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d  assert( offset==
16130 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ii*(4+pPager->pa
16140 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20  geSize) );.     
16150 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
16160 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
16170 61 67 65 72 2c 20 30 2c 20 30 2c 20 26 6f 66 66  ager, 0, 0, &off
16180 73 65 74 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a  set, 1, pDone);.
16190 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
161a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
161b0 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  E );.  }..  sqli
161c0 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
161d0 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72  (pDone);.  if( r
161e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
161f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
16200 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
16210 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
16220 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
16230 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
16240 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
16250 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c  ages that are al
16260 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lowed..*/.void s
16270 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
16280 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  chesize(Pager *p
16290 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
162a0 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  e){.  sqlite3Pca
162b0 63 68 65 53 65 74 43 61 63 68 65 73 69 7a 65 28  cheSetCachesize(
162c0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
162d0 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a   mxPage);.}../*.
162e0 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f  ** Adjust the ro
162f0 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20  bustness of the 
16300 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61  database to dama
16310 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
16320 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72  shes.** or power
16330 20 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61   failures by cha
16340 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nging the number
16350 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65   of syncs()s whe
16360 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  n writing.** the
16370 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
16380 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68  l.  There are th
16390 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a  ree levels:.**.*
163a0 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73  *    OFF       s
163b0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69  qlite3OsSync() i
163c0 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20  s never called. 
163d0 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
163e0 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ault.**         
163f0 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61       for tempora
16400 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74  ry and transient
16410 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
16420 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a   NORMAL    The j
16430 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
16440 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69   once before wri
16450 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
16460 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16470 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
16480 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65   is normally ade
16490 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e  quate protection
164a0 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  , but.**        
164b0 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f        it is theo
164c0 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62  retically possib
164d0 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20  le, though very 
164e0 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20  unlikely,.**    
164f0 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61            that a
16500 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77  n inopertune pow
16510 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
16520 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e   leave the journ
16530 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
16540 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68     in a state wh
16550 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20  ich would cause 
16560 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
16570 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20  tabase.**       
16580 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69         when it i
16590 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
165a0 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20  *.**    FULL    
165b0 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
165c0 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65   synced twice be
165d0 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
165e0 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
165f0 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
16600 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64  e (with some add
16610 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
16620 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66  ion - the nRec f
16630 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  ield.**         
16640 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72       of the jour
16650 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69  nal header - bei
16660 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65  ng written in be
16670 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a  tween the two.**
16680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79                sy
16690 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73  ncs).  If we ass
166a0 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67  ume that writing
166b0 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   a.**           
166c0 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73     single disk s
166d0 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c  ector is atomic,
166e0 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20   then this mode 
166f0 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20  provides.**     
16700 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e           assuran
16710 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ce that the jour
16720 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nal will not be 
16730 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65  corrupted to the
16740 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16750 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e   point of causin
16760 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  g damage to the 
16770 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
16780 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
16790 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61  Numeric values a
167a0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
167b0 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20  hese states are 
167c0 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32  OFF==1, NORMAL=2
167d0 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e  ,.** and FULL=3.
167e0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
167f0 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
16800 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74  AGMAS.void sqlit
16810 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79  e3PagerSetSafety
16820 4c 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61  Level(Pager *pPa
16830 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20  ger, int level, 
16840 69 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63 29 7b  int bFullFsync){
16850 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
16860 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c  c =  (level==1 |
16870 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
16880 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67  le) ?1:0;.  pPag
16890 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28  er->fullSync = (
168a0 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61  level==3 && !pPa
168b0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f  ger->tempFile) ?
168c0 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  1:0;.  pPager->s
168d0 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28 62 46 75  ync_flags = (bFu
168e0 6c 6c 46 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53  llFsync?SQLITE_S
168f0 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f  YNC_FULL:SQLITE_
16900 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20  SYNC_NORMAL);.  
16910 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
16920 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65  nc ) pPager->nee
16930 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e  dSync = 0;.}.#en
16940 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
16950 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
16960 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72  variable is incr
16970 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72  emented whenever
16980 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20   the library.** 
16990 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
169a0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
169b0 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  e.  This informa
169c0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
169d0 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
169e0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20  analysis only.  
169f0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
16a00 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
16a10 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
16a20 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
16a30 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
16a40 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  orary file..**.*
16a50 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
16a60 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
16a70 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20   *pFile. Return 
16a80 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
16a90 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65  cess .** or some
16aa0 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
16ab0 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68  e if we fail. Th
16ac0 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
16ad0 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65  tically .** dele
16ae0 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
16af0 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
16b00 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
16b10 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  he flags passed 
16b20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72  to the VFS layer
16b30 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72   xOpen() call ar
16b40 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  e those specifie
16b50 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65  d.** by paramete
16b60 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20  r vfsFlags ORed 
16b70 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
16b80 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  ng:.**.**     SQ
16b90 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
16ba0 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ITE.**     SQLIT
16bb0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a  E_OPEN_CREATE.**
16bc0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
16bd0 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20  _EXCLUSIVE.**   
16be0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45    SQLITE_OPEN_DE
16bf0 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73  LETEONCLOSE.*/.s
16c00 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f  tatic int pagerO
16c10 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72  pentemp(.  Pager
16c20 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
16c30 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62   /* The pager ob
16c40 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
16c50 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
16c60 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  /* Write the fil
16c70 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72  e descriptor her
16c80 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
16c90 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ags          /* 
16ca0 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
16cb0 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20  ough to the VFS 
16cc0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
16cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16ce0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
16cf0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
16d00 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  EST.  sqlite3_op
16d10 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
16d20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
16d30 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
16d40 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66  s only */.#endif
16d50 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20  ..  vfsFlags |= 
16d60 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
16d70 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
16d80 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
16d90 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
16da0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
16db0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  | SQLITE_OPEN_DE
16dc0 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72  LETEONCLOSE;.  r
16dd0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
16de0 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  n(pPager->pVfs, 
16df0 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61  0, pFile, vfsFla
16e00 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  gs, 0);.  assert
16e10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16e20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29  || isOpen(pFile)
16e30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
16e40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
16e50 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
16e60 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  unction..**.** T
16e70 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73  he pager invokes
16e80 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
16e90 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f  r if sqlite3OsLo
16ea0 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a  ck() returns .**
16eb0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65   SQLITE_BUSY whe
16ec0 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72  n trying to upgr
16ed0 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b  ade from no-lock
16ee0 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63   to a SHARED loc
16ef0 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72  k,.** or when tr
16f00 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20  ying to upgrade 
16f10 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20  from a RESERVED 
16f20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55  lock to an EXCLU
16f30 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49  SIVE .** lock. I
16f40 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76  t does *not* inv
16f50 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
16f60 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64  dler when upgrad
16f70 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52  ing from.** SHAR
16f80 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20  ED to RESERVED, 
16f90 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  or when upgradin
16fa0 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f  g from SHARED to
16fb0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77   EXCLUSIVE.** (w
16fc0 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69  hich occurs duri
16fd0 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ng hot-journal r
16fe0 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72  ollback). Summar
16ff0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73  y:.**.**   Trans
17000 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20  ition           
17010 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49               | I
17020 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64  nvokes xBusyHand
17030 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ler.**   -------
17040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17070 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20  -.**   NO_LOCK  
17080 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c       -> SHARED_L
17090 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a  OCK      | Yes.*
170a0 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  *   SHARED_LOCK 
170b0 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f    -> RESERVED_LO
170c0 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20  CK    | No.**   
170d0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e  SHARED_LOCK   ->
170e0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
170f0 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45    | No.**   RESE
17100 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43  RVED_LOCK -> EXC
17110 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20  LUSIVE_LOCK   | 
17120 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  Yes.**.** If the
17130 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
17140 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e  llback returns n
17150 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63  on-zero, the loc
17160 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64  k is .** retried
17170 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20  . If it returns 
17180 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53  zero, then the S
17190 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
171a0 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
171b0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66  to the caller of
171c0 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66   the pager API f
171d0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
171e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
171f0 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50  Busyhandler(.  P
17200 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
17210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17220 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
17230 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ect */.  int (*x
17240 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69  BusyHandler)(voi
17250 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a  d *),         /*
17260 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79   Pointer to busy
17270 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f  -handler functio
17280 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  n */.  void *pBu
17290 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20  syHandlerArg    
172a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
172b0 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20  rgument to pass 
172c0 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  to xBusyHandler 
172d0 2a 2f 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72  */.){  .  pPager
172e0 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->xBusyHandler =
172f0 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20   xBusyHandler;. 
17300 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
17310 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79  ndlerArg = pBusy
17320 48 61 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f  HandlerArg;.}../
17330 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20  *.** Report the 
17340 63 75 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a  current page siz
17350 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20  e and number of 
17360 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 62  reserved bytes b
17370 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f  ack.** to the co
17380 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  dec..*/.#ifdef S
17390 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
173a0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
173b0 72 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65  rReportSize(Page
173c0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
173d0 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ( pPager->xCodec
173e0 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20  SizeChng ){.    
173f0 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
17400 7a 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70  zeChng(pPager->p
17410 43 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70  Codec, pPager->p
17420 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
17430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17440 20 20 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d      (int)pPager-
17450 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a  >nReserve);.  }.
17460 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
17470 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
17480 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70  (X)     /* No-op
17490 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75   if we do not su
174a0 70 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f  pport a codec */
174b0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
174c0 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73  hange the page s
174d0 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
174e0 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68  Pager object. Th
174f0 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  e new page size 
17500 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e  .** is passed in
17510 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a   *pPageSize..**.
17520 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
17530 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
17540 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
17550 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
17560 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e  ed, it.** is a n
17570 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20  o-op. The value 
17580 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
17590 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f  error state erro
175a0 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a  r code (i.e. .**
175b0 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49   one of SQLITE_I
175c0 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
175d0 52 55 50 54 20 6f 72 20 53 51 4c 49 54 45 5f 46  RUPT or SQLITE_F
175e0 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ULL)..**.** Othe
175f0 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66  rwise, if all of
17600 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
17610 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
17620 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 20   * the new page 
17630 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a  size (value of *
17640 70 50 61 67 65 53 69 7a 65 29 20 69 73 20 76 61  pPageSize) is va
17650 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a  lid (a power .**
17660 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77       of two betw
17670 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49  een 512 and SQLI
17680 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
17690 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e  , inclusive), an
176a0 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72  d.**.**   * ther
176b0 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
176c0 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65  ding page refere
176d0 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  nces, and.**.** 
176e0 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65    * the database
176f0 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61   is either not a
17700 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
17710 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a  base or it is.**
17720 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72       an in-memor
17730 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  y database that 
17740 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73  currently consis
17750 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73  ts of zero pages
17760 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ..**.** then the
17770 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61   pager object pa
17780 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74  ge size is set t
17790 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a  o *pPageSize..**
177a0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
177b0 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c  size is changed,
177c0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
177d0 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33  ion uses sqlite3
177e0 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a  PagerMalloc() .*
177f0 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65  * to obtain a ne
17800 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  w Pager.pTmpSpac
17810 65 20 62 75 66 66 65 72 2e 20 49 66 20 74 68 69  e buffer. If thi
17820 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74  s allocation att
17830 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20  empt .** fails, 
17840 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
17850 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
17860 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69   page size remai
17870 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a  ns unchanged. .*
17880 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63  * In all other c
17890 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ases, SQLITE_OK 
178a0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
178b0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73  ** If the page s
178c0 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67  ize is not chang
178d0 65 64 2c 20 65 69 74 68 65 72 20 62 65 63 61 75  ed, either becau
178e0 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e  se one of the en
178f0 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64  umerated.** cond
17900 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20  itions above is 
17910 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70 61  not true, the pa
17920 67 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72  ger was in error
17930 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
17940 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  .** function was
17950 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61   called, or beca
17960 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  use the memory a
17970 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
17980 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68  t failed, .** th
17990 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73  en *pPageSize is
179a0 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c   set to the old,
179b0 20 72 65 74 61 69 6e 65 64 20 70 61 67 65 20 73   retained page s
179c0 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ize before retur
179d0 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
179e0 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
179f0 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
17a00 65 72 2c 20 75 31 36 20 2a 70 50 61 67 65 53 69  er, u16 *pPageSi
17a10 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
17a20 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50  ){.  int rc = pP
17a30 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a  ager->errCode;..
17a40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17a50 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 70  _OK ){.    u16 p
17a60 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65  ageSize = *pPage
17a70 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74  Size;.    assert
17a80 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c  ( pageSize==0 ||
17a90 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20   (pageSize>=512 
17aa0 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
17ab0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
17ac0 45 29 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  E) );.    if( (p
17ad0 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20  Pager->memDb==0 
17ae0 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
17af0 65 3d 3d 30 29 0a 20 20 20 20 20 26 26 20 73 71  e==0).     && sq
17b00 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
17b10 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
17b20 63 68 65 29 3d 3d 30 20 0a 20 20 20 20 20 26 26  che)==0 .     &&
17b30 20 70 61 67 65 53 69 7a 65 20 26 26 20 70 61 67   pageSize && pag
17b40 65 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70  eSize!=pPager->p
17b50 61 67 65 53 69 7a 65 20 0a 20 20 20 20 29 7b 0a  ageSize .    ){.
17b60 20 20 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77        char *pNew
17b70 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
17b80 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67  e3PageMalloc(pag
17b90 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  eSize);.      if
17ba0 28 20 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  ( !pNew ){.     
17bb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
17bc0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  OMEM;.      }els
17bd0 65 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  e{.        pager
17be0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
17bf0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
17c00 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
17c10 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ize;.        sql
17c20 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61  ite3PageFree(pPa
17c30 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
17c40 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
17c50 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65  >pTmpSpace = pNe
17c60 77 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  w;.        sqlit
17c70 65 33 50 63 61 63 68 65 53 65 74 50 61 67 65 53  e3PcacheSetPageS
17c80 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
17c90 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a  che, pageSize);.
17ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17cb0 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 28    *pPageSize = (
17cc0 75 31 36 29 70 50 61 67 65 72 2d 3e 70 61 67 65  u16)pPager->page
17cd0 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 6e 52  Size;.    if( nR
17ce0 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65  eserve<0 ) nRese
17cf0 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  rve = pPager->nR
17d00 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65  eserve;.    asse
17d10 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20  rt( nReserve>=0 
17d20 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30  && nReserve<1000
17d30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
17d40 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31 36 29  nReserve = (i16)
17d50 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61  nReserve;.    pa
17d60 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50  gerReportSize(pP
17d70 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
17d80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17d90 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
17da0 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72  r to the "tempor
17db0 61 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72  ary page" buffer
17dc0 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79   held internally
17dd0 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72  .** by the pager
17de0 2e 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66  .  This is a buf
17df0 66 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20  fer that is big 
17e00 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
17e10 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e  he.** entire con
17e20 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61  tent of a databa
17e30 73 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62  se page.  This b
17e40 75 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e  uffer is used in
17e50 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69  ternally.** duri
17e60 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20  ng rollback and 
17e70 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74  will be overwrit
17e80 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72  ten whenever a r
17e90 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72  ollback.** occur
17ea0 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f  s.  But other mo
17eb0 64 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74  dules are free t
17ec0 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73  o use it too, as
17ed0 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72   long as.** no r
17ee0 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70  ollbacks are hap
17ef0 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20  pening..*/.void 
17f00 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d  *sqlite3PagerTem
17f10 70 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50  pSpace(Pager *pP
17f20 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
17f30 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
17f40 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  e;.}../*.** Atte
17f50 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d  mpt to set the m
17f60 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20  aximum database 
17f70 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78  page count if mx
17f80 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
17f90 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68  . .** Make no ch
17fa0 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20  anges if mxPage 
17fb0 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74  is zero or negat
17fc0 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20  ive.  And never 
17fd0 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61  reduce the.** ma
17fe0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
17ff0 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65   below the curre
18000 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
18010 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52  atabase..**.** R
18020 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50  egardless of mxP
18030 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
18040 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20  current maximum 
18050 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69  page count..*/.i
18060 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  nt sqlite3PagerM
18070 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65  axPageCount(Page
18080 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
18090 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78  xPage){.  if( mx
180a0 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50  Page>0 ){.    pP
180b0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d  ager->mxPgno = m
180c0 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c  xPage;.  }.  sql
180d0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
180e0 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  nt(pPager, 0);. 
180f0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
18100 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
18110 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
18120 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
18130 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
18140 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
18150 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
18160 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
18170 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
18180 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
18190 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
181a0 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
181b0 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
181c0 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
181d0 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
181e0 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
181f0 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
18200 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
18210 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
18220 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
18230 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
18240 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
18250 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
18260 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
18270 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
18280 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
18290 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
182a0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
182b0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
182c0 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
182d0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
182e0 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
182f0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
18300 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
18310 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
18320 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
18330 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
18340 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
18350 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
18360 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
18370 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
18380 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
18390 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
183a0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
183b0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
183c0 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
183d0 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
183e0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
183f0 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
18400 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
18410 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
18420 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77  * If the pager w
18430 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74  as opened on a t
18440 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a  ransient file (z
18450 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f  Filename==""), o
18460 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r.** opened on a
18470 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20   file less than 
18480 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  N bytes in size,
18490 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
184a0 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20  er is.** zeroed 
184b0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
184c0 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69  turned. The rati
184d0 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69  onale for this i
184e0 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20  s that this .** 
184f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
18500 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73   to read databas
18510 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61  e headers, and a
18520 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f   new transient o
18530 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20  r.** zero sized 
18540 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68  database has a h
18550 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69  eader than consi
18560 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
18570 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  zeroes..**.** If
18580 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70   any IO error ap
18590 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  art from SQLITE_
185a0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
185b0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
185c0 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f  .** the error co
185d0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
185e0 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64  o the caller and
185f0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
18600 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62   the.** output b
18610 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e  uffer undefined.
18620 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
18630 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
18640 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
18650 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
18660 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
18670 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
18680 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
18690 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61  Dest, 0, N);.  a
186a0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
186b0 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
186c0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
186d0 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
186e0 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
186f0 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52   IOTRACE(("DBHDR
18700 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61   %p 0 %d\n", pPa
18710 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20  ger, N)).    rc 
18720 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
18730 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73  pPager->fd, pDes
18740 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, N, 0);.    if
18750 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
18760 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
18770 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
18780 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
18790 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
187a0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
187b0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
187c0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
187d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 73 73  atabase file ass
187e0 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68  ociated .** with
187f0 20 70 50 61 67 65 72 2e 20 4e 6f 72 6d 61 6c 6c   pPager. Normall
18800 79 2c 20 74 68 69 73 20 69 73 20 63 61 6c 63 75  y, this is calcu
18810 6c 61 74 65 64 20 61 73 20 28 3c 64 62 20 66 69  lated as (<db fi
18820 6c 65 20 73 69 7a 65 3e 2f 3c 70 61 67 65 2d 73  le size>/<page-s
18830 69 7a 65 3e 29 2e 0a 2a 2a 20 48 6f 77 65 76 65  ize>)..** Howeve
18840 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20 69  r, if the file i
18850 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  s between 1 and 
18860 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65  <page-size> byte
18870 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
18880 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73  .** this is cons
18890 69 64 65 72 65 64 20 61 20 31 20 70 61 67 65 20  idered a 1 page 
188a0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  file..**.** If t
188b0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
188c0 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20  rror state when 
188d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
188e0 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68   called, then th
188f0 65 0a 2a 2a 20 65 72 72 6f 72 20 73 74 61 74 65  e.** error state
18900 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
18910 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50  eturned and *pnP
18920 61 67 65 20 6c 65 66 74 20 75 6e 63 68 61 6e 67  age left unchang
18930 65 64 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20 74 68  ed. Or,.** if th
18940 65 20 66 69 6c 65 20 73 79 73 74 65 6d 20 68 61  e file system ha
18950 73 20 74 6f 20 62 65 20 71 75 65 72 69 65 64 20  s to be queried 
18960 66 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20  for the size of 
18970 74 68 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20  the file and.** 
18980 74 68 65 20 71 75 65 72 79 20 61 74 74 65 6d 70  the query attemp
18990 74 20 72 65 74 75 72 6e 73 20 61 6e 20 49 4f 20  t returns an IO 
189a0 65 72 72 6f 72 2c 20 74 68 65 20 49 4f 20 65 72  error, the IO er
189b0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
189c0 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50  rned.** and *pnP
189d0 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
189e0 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  anged..**.** Oth
189f0 65 72 77 69 73 65 2c 20 69 66 20 65 76 65 72 79  erwise, if every
18a00 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
18a10 66 75 6c 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ful, then SQLITE
18a20 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
18a30 2a 2a 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69  ** and *pnPage i
18a40 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
18a50 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
18a60 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
18a70 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
18a80 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
18a90 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70   *pPager, int *p
18aa0 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e  nPage){.  Pgno n
18ab0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
18ac0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
18ad0 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61  return via *pnPa
18ae0 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  ge */..  /* If t
18af0 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 72 65  he pager is alre
18b00 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ady in the error
18b10 20 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20 74   state, return t
18b20 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 2a  he error code. *
18b30 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
18b40 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
18b50 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
18b60 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rCode;.  }..  /*
18b70 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e   Determine the n
18b80 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
18b90 6e 20 74 68 65 20 66 69 6c 65 2e 20 53 74 6f 72  n the file. Stor
18ba0 65 20 74 68 69 73 20 69 6e 20 6e 50 61 67 65 2e  e this in nPage.
18bb0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
18bc0 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 7b  ->dbSizeValid ){
18bd0 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 70 50 61  .    nPage = pPa
18be0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d  ger->dbSize;.  }
18bf0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63  else{.    int rc
18c00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18c10 20 20 2f 2a 20 45 72 72 6f 72 20 72 65 74 75 72    /* Error retur
18c20 6e 65 64 20 62 79 20 4f 73 46 69 6c 65 53 69 7a  ned by OsFileSiz
18c30 65 28 29 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e  e() */.    i64 n
18c40 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
18c50 20 20 20 2f 2a 20 46 69 6c 65 20 73 69 7a 65 20     /* File size 
18c60 69 6e 20 62 79 74 65 73 20 72 65 74 75 72 6e 65  in bytes returne
18c70 64 20 62 79 20 4f 73 46 69 6c 65 53 69 7a 65 28  d by OsFileSize(
18c80 29 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  ) */..    assert
18c90 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
18ca0 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
18cb0 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
18cc0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
18cd0 72 2d 3e 66 64 29 20 26 26 20 28 30 20 21 3d 20  r->fd) && (0 != 
18ce0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
18cf0 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
18d00 66 64 2c 20 26 6e 29 29 29 20 29 7b 0a 20 20 20  fd, &n))) ){.   
18d10 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
18d20 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
18d30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
18d40 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26   }.    if( n>0 &
18d50 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65  & n<pPager->page
18d60 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 50  Size ){.      nP
18d70 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  age = 1;.    }el
18d80 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20  se{.      nPage 
18d90 3d 20 28 50 67 6e 6f 29 28 6e 20 2f 20 70 50 61  = (Pgno)(n / pPa
18da0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
18db0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
18dc0 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
18dd0 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  ER_UNLOCK ){.   
18de0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
18df0 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
18e00 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
18e10 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
18e20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
18e30 65 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20  eValid = 1;.    
18e40 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
18e50 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65  he current numbe
18e60 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
18e70 65 20 66 69 6c 65 20 69 73 20 67 72 65 61 74 65  e file is greate
18e80 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a  r than the .  **
18e90 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69   configured maxi
18ea0 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72  mum pager number
18eb0 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 61  , increase the a
18ec0 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a  llowed limit so.
18ed0 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69    ** that the fi
18ee0 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a  le can be read..
18ef0 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65    */.  if( nPage
18f00 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
18f10 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
18f20 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50  xPgno = (Pgno)nP
18f30 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  age;.  }..  /* S
18f40 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  et the output va
18f50 72 69 61 62 6c 65 20 61 6e 64 20 72 65 74 75 72  riable and retur
18f60 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 2a 2f 0a 20  n SQLITE_OK */. 
18f70 20 69 66 28 20 70 6e 50 61 67 65 20 29 7b 0a 20   if( pnPage ){. 
18f80 20 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61     *pnPage = nPa
18f90 67 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ge;.  }.  return
18fa0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
18fb0 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74  /*.** Try to obt
18fc0 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79  ain a lock of ty
18fd0 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74  pe locktype on t
18fe0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18ff0 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61  . If.** a simila
19000 72 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  r or greater loc
19010 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
19020 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
19030 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28   is a no-op.** (
19040 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
19050 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79 29  _OK immediately)
19060 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
19070 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62  e, attempt to ob
19080 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73  tain the lock us
19090 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  ing sqlite3OsLoc
190a0 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20  k(). Invoke .** 
190b0 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
190c0 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  k if the lock is
190d0 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61   currently not a
190e0 76 61 69 6c 61 62 6c 65 2e 20 52 65 70 65 61 74  vailable. Repeat
190f0 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 62   .** until the b
19100 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  usy callback ret
19110 75 72 6e 73 20 66 61 6c 73 65 20 6f 72 20 75 6e  urns false or un
19120 74 69 6c 20 74 68 65 20 61 74 74 65 6d 70 74 20  til the attempt 
19130 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68  to .** obtain th
19140 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e  e lock succeeds.
19150 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
19160 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
19170 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ss and an error 
19180 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f  code if we canno
19190 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20  t obtain.** the 
191a0 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63  lock. If the loc
191b0 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 73 75  k is obtained su
191c0 63 63 65 73 73 66 75 6c 6c 79 2c 20 73 65 74 20  ccessfully, set 
191d0 74 68 65 20 50 61 67 65 72 2e 73 74 61 74 65 20  the Pager.state 
191e0 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20  .** variable to 
191f0 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f 72 65 20  locktype before 
19200 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
19210 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
19220 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65  ait_on_lock(Page
19230 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
19240 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20  ocktype){.  int 
19250 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
19260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19270 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
19280 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20  */..  /* The OS 
19290 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74  lock values must
192a0 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
192b0 74 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76  the Pager lock v
192c0 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  alues */.  asser
192d0 74 28 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d  t( PAGER_SHARED=
192e0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
192f0 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
19300 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56  RESERVED==RESERV
19310 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
19320 65 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55  ert( PAGER_EXCLU
19330 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f  SIVE==EXCLUSIVE_
19340 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  LOCK );..  /* If
19350 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 75 72   the file is cur
19360 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20  rently unlocked 
19370 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75  then the size mu
19380 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f  st be unknown */
19390 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
193a0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
193b0 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72  SHARED || pPager
193c0 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30  ->dbSizeValid==0
193d0 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
193e0 74 68 61 74 20 74 68 69 73 20 69 73 20 65 69 74  that this is eit
193f0 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63  her a no-op (bec
19400 61 75 73 65 20 74 68 65 20 72 65 71 75 65 73 74  ause the request
19410 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a  ed lock is .  **
19420 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f   already held, o
19430 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 72 61  r one of the tra
19440 6e 73 69 73 74 69 6f 6e 73 20 74 68 61 74 20 74  nsistions that t
19450 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a  he busy-handler.
19460 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f    ** may be invo
19470 6b 65 64 20 64 75 72 69 6e 67 2c 20 61 63 63 6f  ked during, acco
19480 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d  rding to the com
19490 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20  ment above.  ** 
194a0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
194b0 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20  usyhandler()..  
194c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  */.  assert( (pP
194d0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63  ager->state>=loc
194e0 6b 74 79 70 65 29 0a 20 20 20 20 20 20 20 7c 7c  ktype).       ||
194f0 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d   (pPager->state=
19500 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 26 26  =PAGER_UNLOCK &&
19510 20 6c 6f 63 6b 74 79 70 65 3d 3d 50 41 47 45 52   locktype==PAGER
19520 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
19530 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74  || (pPager->stat
19540 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
19550 44 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50  D && locktype==P
19560 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 29 0a  AGER_EXCLUSIVE).
19570 20 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67    );..  if( pPag
19580 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74  er->state>=lockt
19590 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ype ){.    rc = 
195a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
195b0 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20  se{.    do {.   
195c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
195d0 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
195e0 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20  , locktype);.   
195f0 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
19600 49 54 45 5f 42 55 53 59 20 26 26 20 70 50 61 67  ITE_BUSY && pPag
19610 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
19620 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61  (pPager->pBusyHa
19630 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 20  ndlerArg) );.   
19640 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19650 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OK ){.      pPag
19660 65 72 2d 3e 73 74 61 74 65 20 3d 20 28 75 38 29  er->state = (u8)
19670 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20  locktype;.      
19680 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25  IOTRACE(("LOCK %
19690 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
196a0 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20   locktype)).    
196b0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
196c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  c;.}../*.** Trun
196d0 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
196e0 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
196f0 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20   image to nPage 
19700 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20  pages. This .** 
19710 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
19720 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66  t actually modif
19730 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  y the database f
19740 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20  ile on disk. It 
19750 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68  .** just sets th
19760 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
19770 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62   of the pager ob
19780 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65  ject so that the
19790 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20   .** truncation 
197a0 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65  will be done whe
197b0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
197c0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
197d0 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  mitted..*/.void 
197e0 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
197f0 63 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20  cateImage(Pager 
19800 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
19810 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
19820 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
19830 6c 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28  lid );.  assert(
19840 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
19850 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  =nPage );.  asse
19860 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
19870 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
19880 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  D );.  pPager->d
19890 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 7d  bSize = nPage;.}
198a0 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  ../*.** Shutdown
198b0 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
198c0 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72    Free all memor
198d0 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20  y and close all 
198e0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
198f0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
19900 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68  s in progress wh
19910 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
19920 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a  is called, that.
19930 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
19940 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  s rolled back.  
19950 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  All outstanding 
19960 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
19970 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  dated.** and the
19980 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65  ir memory is fre
19990 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  ed.  Any attempt
199a0 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61   to use a page a
199b0 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
199c0 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68  h this page cach
199d0 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  e after this fun
199e0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
199f0 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
19a00 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
19a10 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
19a20 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75  nction always su
19a30 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61  cceeds. If a tra
19a40 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
19a50 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a  ve an attempt.**
19a60 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c   is made to roll
19a70 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20   it back. If an 
19a80 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
19a90 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
19aa0 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e   .** a hot journ
19ab0 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69  al may be left i
19ac0 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
19ad0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73   but no error is
19ae0 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20   returned.** to 
19af0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69  the caller..*/.i
19b00 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
19b10 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67  lose(Pager *pPag
19b20 65 72 29 7b 0a 20 20 64 69 73 61 62 6c 65 5f 73  er){.  disable_s
19b30 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
19b40 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  rs();.  sqlite3B
19b50 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
19b60 28 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72  ();.  pPager->er
19b70 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61  rCode = 0;.  pPa
19b80 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
19b90 64 65 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f  de = 0;.  pager_
19ba0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
19bb0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
19bc0 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
19bd0 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
19be0 0a 20 20 20 20 2f 2a 20 53 65 74 20 50 61 67 65  .    /* Set Page
19bf0 72 2e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20  r.journalHdr to 
19c00 2d 31 20 66 6f 72 20 74 68 65 20 62 65 6e 65 66  -1 for the benef
19c10 69 74 20 6f 66 20 74 68 65 20 70 61 67 65 72 5f  it of the pager_
19c20 70 6c 61 79 62 61 63 6b 28 29 20 0a 20 20 20 20  playback() .    
19c30 2a 2a 20 63 61 6c 6c 20 77 68 69 63 68 20 6d 61  ** call which ma
19c40 79 20 62 65 20 6d 61 64 65 20 66 72 6f 6d 20 77  y be made from w
19c50 69 74 68 69 6e 20 70 61 67 65 72 55 6e 6c 6f 63  ithin pagerUnloc
19c60 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 29 2e 20  kAndRollback(). 
19c70 49 66 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20  If it.    ** is 
19c80 6e 6f 74 20 2d 31 2c 20 74 68 65 6e 20 74 68 65  not -1, then the
19c90 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f   unsynced portio
19ca0 6e 20 6f 66 20 61 6e 20 6f 70 65 6e 20 6a 6f 75  n of an open jou
19cb0 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 0a 20 20  rnal file may.  
19cc0 20 20 2a 2a 20 62 65 20 70 6c 61 79 65 64 20 62    ** be played b
19cd0 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
19ce0 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65  abase. If a powe
19cf0 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
19d00 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68   while.    ** th
19d10 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c  is is happening,
19d20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61   the database ma
19d30 79 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74  y become corrupt
19d40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
19d50 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
19d60 3d 20 2d 31 3b 0a 20 20 20 20 70 61 67 65 72 55  = -1;.    pagerU
19d70 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
19d80 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
19d90 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
19da0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62  Malloc();.  enab
19db0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
19dc0 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45  errors();.  PAGE
19dd0 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  RTRACE(("CLOSE %
19de0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
19df0 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41  ager)));.  IOTRA
19e00 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22  CE(("CLOSE %p\n"
19e10 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c  , pPager)).  sql
19e20 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
19e30 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74  er->fd);.  sqlit
19e40 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65  e3PageFree(pPage
19e50 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
19e60 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
19e70 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ose(pPager->pPCa
19e80 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  che);..#ifdef SQ
19e90 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
19ea0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f   if( pPager->xCo
19eb0 64 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72  decFree ) pPager
19ec0 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61  ->xCodecFree(pPa
19ed0 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65  ger->pCodec);.#e
19ee0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
19ef0 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  !pPager->aSavepo
19f00 69 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e  int && !pPager->
19f10 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  pInJournal );.  
19f20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
19f30 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
19f40 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
19f50 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69  sjfd) );..  sqli
19f60 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29  te3_free(pPager)
19f70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
19f80 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  E_OK;.}..#if !de
19f90 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c  fined(NDEBUG) ||
19fa0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
19fb0 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  TEST)./*.** Retu
19fc0 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  rn the page numb
19fd0 65 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e  er for page pPg.
19fe0 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33  .*/.Pgno sqlite3
19ff0 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
1a000 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
1a010 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f  return pPg->pgno
1a020 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1a030 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
1a040 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
1a050 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f  for page pPg..*/
1a060 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
1a070 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50  erRef(DbPage *pP
1a080 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  g){.  sqlite3Pca
1a090 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a  cheRef(pPg);.}..
1a0a0 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a  /*.** Sync the j
1a0b0 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72  ournal. In other
1a0c0 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72   words, make sur
1a0d0 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20  e all the pages 
1a0e0 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65  that have.** bee
1a0f0 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
1a100 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63   journal have ac
1a110 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74  tually reached t
1a120 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68  he surface of th
1a130 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61  e.** disk and ca
1a140 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e  n be restored in
1a150 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20   the event of a 
1a160 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
1a170 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
1a180 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e  he Pager.needSyn
1a190 63 20 66 6c 61 67 20 69 73 20 6e 6f 74 20 73 65  c flag is not se
1a1a0 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  t, then this fun
1a1b0 63 74 69 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f  ction is a.** no
1a1c0 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
1a1d0 74 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75  the actions requ
1a1e0 69 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74  ired depend on t
1a1f0 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 0a  he journal-mode.
1a200 2a 2a 20 61 6e 64 20 74 68 65 20 64 65 76 69 63  ** and the devic
1a210 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
1a220 73 20 6f 66 20 74 68 65 20 74 68 65 20 66 69 6c  s of the the fil
1a230 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c  e-system, as fol
1a240 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
1a250 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
1a260 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  ile is an in-mem
1a270 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
1a280 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64  , no action need
1a290 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e  .**     be taken
1a2a0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65  ..**.**   * Othe
1a2b0 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 64 65  rwise, if the de
1a2c0 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75  vice does not su
1a2d0 70 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41  pport the SAFE_A
1a2e0 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a  PPEND property,.
1a2f0 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65 20  **     then the 
1a300 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68  nRec field of th
1a310 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
1a320 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20  written journal 
1a330 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73  header.**     is
1a340 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74   updated to cont
1a350 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ain the number o
1a360 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  f journal record
1a370 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20  s that have.**  
1a380 20 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20     been written 
1a390 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66  following it. If
1a3a0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 70   the pager is op
1a3b0 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d  erating in full-
1a3c0 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65  sync.**     mode
1a3d0 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
1a3e0 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  al file is synce
1a3f0 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 69  d before this fi
1a400 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a  eld is updated..
1a410 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  **.**   * If the
1a420 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74   device does not
1a430 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 45 51   support the SEQ
1a440 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79  UENTIAL property
1a450 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a  , then .**     j
1a460 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73  ournal file is s
1a470 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  ynced..**.** Or,
1a480 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a   in pseudo-code:
1a490 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54  .**.**   if( NOT
1a4a0 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72   <in-memory jour
1a4b0 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69  nal> ){.**     i
1a4c0 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45  f( NOT SAFE_APPE
1a4d0 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69  ND ){.**       i
1a4e0 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f  f( <full-sync mo
1a4f0 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75  de> ) xSync(<jou
1a500 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20  rnal file>);.** 
1a510 20 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52        <update nR
1a520 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20  ec field>.**    
1a530 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e   } .**     if( N
1a540 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20  OT SEQUENTIAL ) 
1a550 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66  xSync(<journal f
1a560 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a  ile>);.**   }.**
1a570 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 6e 65  .** The Pager.ne
1a580 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 6e  edSync flag is n
1a590 65 76 65 72 20 62 65 20 73 65 74 20 66 6f 72 20  ever be set for 
1a5a0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c  temporary files,
1a5b0 20 6f 72 20 61 6e 79 0a 2a 2a 20 66 69 6c 65 20   or any.** file 
1a5c0 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 6e 6f 2d  operating in no-
1a5d0 73 79 6e 63 20 6d 6f 64 65 20 28 50 61 67 65 72  sync mode (Pager
1a5e0 2e 6e 6f 53 79 6e 63 20 73 65 74 20 74 6f 20 6e  .noSync set to n
1a5f0 6f 6e 2d 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20  on-zero)..**.** 
1a600 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
1a610 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61  his routine clea
1a620 72 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  rs the PGHDR_NEE
1a630 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65  D_SYNC flag of e
1a640 76 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75  very .** page cu
1a650 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20  rrently held in 
1a660 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65  memory before re
1a670 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f  turning SQLITE_O
1a680 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65  K. If an IO.** e
1a690 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
1a6a0 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  red, then the IO
1a6b0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1a6c0 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
1a6d0 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aller..*/.static
1a6e0 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
1a6f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1a700 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
1a710 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 61  eedSync ){.    a
1a720 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
1a730 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
1a740 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
1a750 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
1a760 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
1a770 59 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  Y ){.      int r
1a780 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1a790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7a0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1a7b0 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  /.      const in
1a7c0 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
1a7d0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
1a7e0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
1a7f0 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  d);.      assert
1a800 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1a810 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20  >jfd) );..      
1a820 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
1a830 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
1a840 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20  PEND) ){.       
1a850 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64   /* This block d
1a860 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73  eals with an obs
1a870 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66  cure problem. If
1a880 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63   the last connec
1a890 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tion.        ** 
1a8a0 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68  that wrote to th
1a8b0 69 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20  is database was 
1a8c0 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72  operating in per
1a8d0 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a  sistent-journal.
1a8e0 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c          ** mode,
1a8f0 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
1a900 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68  l file may at th
1a910 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c  is point actuall
1a920 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20  y be larger.    
1a930 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
1a940 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74  r.journalOff byt
1a950 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20  es. If the next 
1a960 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75  thing in the jou
1a970 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
1a980 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20  file happens to 
1a990 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  be a journal-hea
1a9a0 64 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20  der (written as 
1a9b0 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20  part of the.    
1a9c0 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
1a9d0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 72 61 6e  connections tran
1a9e0 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20  saction), and a 
1a9f0 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66  crash or power-f
1aa00 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20  ailure .        
1aa10 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20  ** occurs after 
1aa20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
1aa30 62 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20  but before this 
1aa40 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65  connection write
1aa50 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  s .        ** an
1aa60 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74  ything else to t
1aa70 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1aa80 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c  (or commits/roll
1aa90 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20  s back its .    
1aaa0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1aab0 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65  on), then SQLite
1aac0 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66   may become conf
1aad0 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20  used when doing 
1aae0 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
1aaf0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
1ab00 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72  back following r
1ab10 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20  ecovery. It may 
1ab20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20  roll back all.  
1ab30 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73        ** of this
1ab40 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74   connections dat
1ab50 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20  a, then proceed 
1ab60 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  to rolling back 
1ab70 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20  the old,.       
1ab80 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20   ** out-of-date 
1ab90 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77  data that follow
1aba0 73 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63  s it. Database c
1abb0 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20  orruption..     
1abc0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
1abd0 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
1abe0 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75  this, if the jou
1abf0 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61  rnal file does a
1ac00 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e  ppear to contain
1ac10 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61  .        ** a va
1ac20 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f  lid header follo
1ac30 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e  wing Pager.journ
1ac40 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74  alOff, then writ
1ac50 65 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20  e a 0x00.       
1ac60 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20   ** byte to the 
1ac70 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70  start of it to p
1ac80 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62  revent it from b
1ac90 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e  eing recognized.
1aca0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1acb0 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20      ** Variable 
1acc0 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69  iNextHdrOffset i
1acd0 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66  s set to the off
1ace0 73 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69  set at which thi
1acf0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  s.        ** pro
1ad00 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20  blematic header 
1ad10 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69  will occur, if i
1ad20 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63  t exists. aMagic
1ad30 20 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20   is used .      
1ad40 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72    ** as a tempor
1ad50 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e  ary buffer to in
1ad60 73 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20  spect the first 
1ad70 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20  couple of bytes 
1ad80 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  of.        ** th
1ad90 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72  e potential jour
1ada0 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20  nal header..    
1adb0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1adc0 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  64 iNextHdrOffse
1add0 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d  t;.        u8 aM
1ade0 61 67 69 63 5b 38 5d 3b 0a 09 75 38 20 7a 48 65  agic[8];..u8 zHe
1adf0 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
1ae00 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a  rnalMagic)+4];..
1ae10 09 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c  .memcpy(zHeader,
1ae20 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
1ae30 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
1ae40 61 67 69 63 29 29 3b 0a 09 70 75 74 33 32 62 69  agic));..put32bi
1ae50 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
1ae60 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
1ae70 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  )], pPager->nRec
1ae80 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78  );..        iNex
1ae90 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75  tHdrOffset = jou
1aea0 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
1aeb0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72  ager);.        r
1aec0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
1aed0 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
1aee0 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48  Magic, 8, iNextH
1aef0 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  drOffset);.     
1af00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1af10 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  E_OK && 0==memcm
1af20 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
1af30 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20  alMagic, 8) ){. 
1af40 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
1af50 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74  const u8 zerobyt
1af60 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
1af70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
1af80 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
1af90 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20  , &zerobyte, 1, 
1afa0 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b  iNextHdrOffset);
1afb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1afc0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1afd0 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
1afe0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
1aff0 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
1b000 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b010 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
1b020 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
1b030 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20   value into the 
1b040 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61  journal file hea
1b050 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20  der. If in.     
1b060 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68     ** full-synch
1b070 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e  ronous mode, syn
1b080 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
1b090 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65  rst. This ensure
1b0a0 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
1b0b0 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72  * all data has r
1b0c0 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69  eally hit the di
1b0d0 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69  sk before nRec i
1b0e0 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72  s updated to mar
1b0f0 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  k.        ** it 
1b100 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  as a candidate f
1b110 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20  or rollback..   
1b120 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1b130 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  ** This is not r
1b140 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70  equired if the p
1b150 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20  ersistent media 
1b160 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20  supports the.   
1b170 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50       ** SAFE_APP
1b180 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65  END property. Be
1b190 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61  cause in this ca
1b1a0 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  se it is not pos
1b1b0 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a  sible .        *
1b1c0 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61  * for garbage da
1b1d0 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65  ta to be appende
1b1e0 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74  d to the file, t
1b1f0 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20  he nRec field.  
1b200 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75        ** is popu
1b210 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46  lated with 0xFFF
1b220 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a  FFFFF when the j
1b230 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
1b240 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20   written.       
1b250 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65   ** and never ne
1b260 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
1b270 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
1b280 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1b290 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d  ->fullSync && 0=
1b2a0 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
1b2b0 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29  AP_SEQUENTIAL) )
1b2c0 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  {.          PAGE
1b2d0 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f  RTRACE(("SYNC jo
1b2e0 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
1b2f0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1b300 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54  );.          IOT
1b310 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
1b320 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
1b330 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1b340 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
1b350 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
1b360 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20  ync_flags);.    
1b370 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1b380 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1b390 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
1b3a0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
1b3b0 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22  "JHDR %p %lld\n"
1b3c0 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
1b3d0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a  ->journalHdr));.
1b3e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1b3f0 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20  ite3OsWrite(.   
1b400 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1b410 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73  >jfd, zHeader, s
1b420 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20  izeof(zHeader), 
1b430 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
1b440 64 72 0a 09 29 3b 0a 20 20 20 20 20 20 20 20 69  dr..);.        i
1b450 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b460 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1b470 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1b480 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
1b490 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
1b4a0 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45   ){.        PAGE
1b4b0 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f  RTRACE(("SYNC jo
1b4c0 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
1b4d0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1b4e0 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  );.        IOTRA
1b4f0 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22  CE(("JSYNC %p\n"
1b500 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
1b510 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1b520 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
1b530 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
1b540 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20  flags| .        
1b550 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f    (pPager->sync_
1b560 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59  flags==SQLITE_SY
1b570 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53  NC_FULL?SQLITE_S
1b580 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a  YNC_DATAONLY:0).
1b590 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
1b5a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b5b0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1b5c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b5d0 0a 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72  .    /* The jour
1b5e0 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73  nal file was jus
1b5f0 74 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73  t successfully s
1b600 79 6e 63 65 64 2e 20 53 65 74 20 50 61 67 65 72  ynced. Set Pager
1b610 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 2a  .needSync .    *
1b620 2a 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 63 6c  * to zero and cl
1b630 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45  ear the PGHDR_NE
1b640 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20  ED_SYNC flag on 
1b650 61 6c 6c 20 70 61 67 65 73 73 2e 0a 20 20 20 20  all pagess..    
1b660 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
1b670 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
1b680 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1b690 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20  Started = 1;.   
1b6a0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
1b6b0 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61  earSyncFlags(pPa
1b6c0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
1b6d0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
1b6e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1b6f0 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
1b700 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20   the first in a 
1b710 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64  linked list of d
1b720 69 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65  irty pages conne
1b730 63 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50  cted.** by the P
1b740 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e  gHdr.pDirty poin
1b750 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ter. This functi
1b760 6f 6e 20 77 72 69 74 65 73 20 65 61 63 68 20 6f  on writes each o
1b770 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d  ne of the.** in-
1b780 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20  memory pages in 
1b790 74 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20  the list to the 
1b7a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
1b7b0 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a  he argument may.
1b7c0 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72  ** be NULL, repr
1b7d0 65 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74  esenting an empt
1b7e0 79 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20  y list. In this 
1b7f0 63 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69  case this functi
1b800 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70  on is.** a no-op
1b810 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
1b820 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c  r must hold at l
1b830 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20  east a RESERVED 
1b840 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66  lock when this f
1b850 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61  unction.** is ca
1b860 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69  lled. Before wri
1b870 74 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f  ting anything to
1b880 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b890 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a  le, this lock.**
1b8a0 20 69 73 20 75 70 67 72 61 64 65 64 20 74 6f 20   is upgraded to 
1b8b0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
1b8c0 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63  k. If the lock c
1b8d0 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  annot be obtaine
1b8e0 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  d,.** SQLITE_BUS
1b8f0 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  Y is returned an
1b900 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69  d no data is wri
1b910 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
1b920 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
1b930 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
1b940 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61  s a temp-file pa
1b950 67 65 72 20 61 6e 64 20 74 68 65 20 61 63 74 75  ger and the actu
1b960 61 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  al file-system f
1b970 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65  ile.** is not ye
1b980 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72  t open, it is cr
1b990 65 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64  eated and opened
1b9a0 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61   before any data
1b9b0 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20   is .** written 
1b9c0 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  out..**.** Once 
1b9d0 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65  the lock has bee
1b9e0 6e 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20  n upgraded and, 
1b9f0 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68  if necessary, th
1ba00 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a  e file opened,.*
1ba10 2a 20 74 68 65 20 70 61 67 65 73 20 61 72 65 20  * the pages are 
1ba20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74  written out to t
1ba30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1ba40 20 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20   in list order. 
1ba50 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67  Writing.** a pag
1ba60 65 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  e is skipped if 
1ba70 69 74 20 6d 65 65 74 73 20 65 69 74 68 65 72 20  it meets either 
1ba80 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1ba90 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a   criteria:.**.**
1baa0 20 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75     * The page nu
1bab0 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20  mber is greater 
1bac0 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
1bad0 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65  e, or.**   * The
1bae0 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54   PGHDR_DONT_WRIT
1baf0 45 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e  E flag is set on
1bb00 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   the page..**.**
1bb10 20 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20   If writing out 
1bb20 61 20 70 61 67 65 20 63 61 75 73 65 73 20 74 68  a page causes th
1bb30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1bb40 74 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64  to grow, Pager.d
1bb50 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20  bFileSize.** is 
1bb60 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e  updated accordin
1bb70 67 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20 69  gly. If page 1 i
1bb80 73 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74  s written out, t
1bb90 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61  hen the value ca
1bba0 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72  ched.** in Pager
1bbb0 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73  .dbFileVers[] is
1bbc0 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63   updated to matc
1bbd0 68 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20  h the new value 
1bbe0 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65  stored in.** the
1bbf0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1bc00 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
1bc10 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
1bc20 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
1bc30 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
1bc40 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  IO error .** occ
1bc50 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72  urs, an IO error
1bc60 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1bc70 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58  d. Or, if the EX
1bc80 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e  CLUSIVE lock can
1bc90 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e  not.** be obtain
1bca0 65 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ed, SQLITE_BUSY 
1bcb0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1bcc0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1bcd0 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
1bce0 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20  PgHdr *pList){. 
1bcf0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20   Pager *pPager; 
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd10 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
1bd20 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  bject */.  int r
1bd30 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1bd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd50 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1bd60 2f 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  /..  if( NEVER(p
1bd70 4c 69 73 74 3d 3d 30 29 20 29 20 72 65 74 75 72  List==0) ) retur
1bd80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
1bd90 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70  Pager = pList->p
1bda0 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20  Pager;..  /* At 
1bdb0 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65  this point there
1bdc0 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61   may be either a
1bdd0 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
1bde0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
1bdf0 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
1be00 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
1be10 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58  is already an EX
1be20 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68  CLUSIVE lock, th
1be30 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a  e following.  **
1be40 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
1be50 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69  ..  **.  ** Movi
1be60 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d  ng the lock from
1be70 20 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43   RESERVED to EXC
1be80 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20  LUSIVE actually 
1be90 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20  involves going. 
1bea0 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69   ** through an i
1beb0 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
1bec0 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50  e PENDING.   A P
1bed0 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76  ENDING lock prev
1bee0 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65  ents new.  ** re
1bef0 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63  aders from attac
1bf00 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
1bf10 62 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75  base but is unsu
1bf20 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20  fficient for us 
1bf30 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20  to.  ** write.  
1bf40 54 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45  The idea of a PE
1bf50 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f  NDING lock is to
1bf60 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61   prevent new rea
1bf70 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ders from.  ** c
1bf80 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77  oming in while w
1bf90 65 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74  e wait for exist
1bfa0 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63  ing readers to c
1bfb0 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lear..  **.  ** 
1bfc0 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
1bfd0 69 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56  is in the RESERV
1bfe0 45 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72  ED state, the or
1bff0 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
1c000 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63  file.  ** is unc
1c010 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61  hanged and we ca
1c020 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f  n rollback witho
1c030 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61  ut having to pla
1c040 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a  yback the.  ** j
1c050 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20  ournal into the 
1c060 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
1c070 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65  e file.  Once we
1c080 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20   transition to. 
1c090 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69   ** EXCLUSIVE, i
1c0a0 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  t means the data
1c0b0 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65  base file has be
1c0c0 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61  en changed and a
1c0d0 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  ny rollback.  **
1c0e0 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
1c0f0 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
1c100 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1c110 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
1c120 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
1c130 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77  ;.  rc = pager_w
1c140 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
1c150 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
1c160 43 4b 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  CK);..  /* If th
1c170 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70  e file is a temp
1c180 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65  -file has not ye
1c190 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
1c1a0 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20  pen it now. It. 
1c1b0 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   ** is not possi
1c1c0 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65  ble for rc to be
1c1d0 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
1c1e0 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72  TE_OK if this br
1c1f0 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b  anch.  ** is tak
1c200 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69  en, as pager_wai
1c210 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61  t_on_lock() is a
1c220 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d   no-op for temp-
1c230 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  files..  */.  if
1c240 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
1c250 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  ->fd) ){.    ass
1c260 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d  ert( pPager->tem
1c270 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c  pFile && rc==SQL
1c280 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63  ITE_OK );.    rc
1c290 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70   = pagerOpentemp
1c2a0 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
1c2b0 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73  >fd, pPager->vfs
1c2c0 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 77  Flags);.  }..  w
1c2d0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
1c2e0 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a  _OK && pList ){.
1c2f0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20      Pgno pgno = 
1c300 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pList->pgno;..  
1c310 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
1c320 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e  e dirty pages in
1c330 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
1c340 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
1c350 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a  s greater.    **
1c360 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69   than Pager.dbSi
1c370 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73  ze, this means s
1c380 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
1c390 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63  ateImage() was c
1c3a0 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  alled to.    ** 
1c3b0 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d  make the file sm
1c3c0 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c  aller (presumabl
1c3d0 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  y by auto-vacuum
1c3e0 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77   code). Do not w
1c3f0 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20  rite.    ** any 
1c400 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68  such pages to th
1c410 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
1c420 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e     ** Also, do n
1c430 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79  ot write out any
1c440 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74   page that has t
1c450 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  he PGHDR_DONT_WR
1c460 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20  ITE flag.    ** 
1c470 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69  set (set by sqli
1c480 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
1c490 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  e())..    */.   
1c4a0 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65   if( pgno<=pPage
1c4b0 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d  r->dbSize && 0==
1c4c0 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47  (pList->flags&PG
1c4d0 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20  HDR_DONT_WRITE) 
1c4e0 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  ){.      i64 off
1c4f0 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
1c500 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
1c510 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65  Size;   /* Offse
1c520 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  t to write */.  
1c530 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b      char *pData;
1c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c560 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72     /* Data to wr
1c570 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20  ite */    ..    
1c580 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20    /* Encode the 
1c590 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
1c5a0 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
1c5b0 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70   pList->pData, p
1c5c0 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53  gno, 6, return S
1c5d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61  QLITE_NOMEM, pDa
1c5e0 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  ta);..      /* W
1c5f0 72 69 74 65 20 6f 75 74 20 74 68 65 20 70 61 67  rite out the pag
1c600 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20  e data. */.     
1c610 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
1c620 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
1c630 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
1c640 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
1c650 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
1c660 70 61 67 65 20 31 20 77 61 73 20 6a 75 73 74 20  page 1 was just 
1c670 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20  written, update 
1c680 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
1c690 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20   to match.      
1c6a0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77  ** the value now
1c6b0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64   stored in the d
1c6c0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
1c6d0 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20   writing this . 
1c6e0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75       ** page cau
1c6f0 73 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  sed the database
1c700 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75   file to grow, u
1c710 70 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65  pdate dbFileSize
1c720 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
1c730 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
1c740 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1c750 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
1c760 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c  ers, &pData[24],
1c770 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
1c780 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
1c790 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1c7a0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46  pgno>pPager->dbF
1c7b0 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ileSize ){.     
1c7c0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
1c7d0 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20  eSize = pgno;.  
1c7e0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1c7f0 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75  Update any backu
1c800 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e  p objects copyin
1c810 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
1c820 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f  f this pager. */
1c830 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
1c840 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
1c850 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
1c860 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44  , (u8*)pList->pD
1c870 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47  ata);..      PAG
1c880 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45 20  ERTRACE(("STORE 
1c890 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
1c8a0 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
1c8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
1c8c0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
1c8d0 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
1c8e0 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20  sh(pList)));.   
1c8f0 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f     IOTRACE(("PGO
1c900 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  UT %p %d\n", pPa
1c910 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
1c920 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
1c930 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
1c940 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  edb_count);.    
1c950 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
1c960 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20  ger->nWrite);.  
1c970 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50    }else{.      P
1c980 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54  AGERTRACE(("NOST
1c990 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ORE %d page %d\n
1c9a0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1c9b0 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  r), pgno));.    
1c9c0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
1c9d0 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
1c9e0 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20  pList->pageHash 
1c9f0 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
1ca00 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a  (pList);.#endif.
1ca10 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
1ca20 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a  t->pDirty;.  }..
1ca30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ca40 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72  /*.** Append a r
1ca50 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72  ecord of the cur
1ca60 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61  rent state of pa
1ca70 67 65 20 70 50 67 20 74 6f 20 74 68 65 20 73 75  ge pPg to the su
1ca80 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49  b-journal. .** I
1ca90 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73  t is the callers
1caa0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
1cab0 74 6f 20 75 73 65 20 73 75 62 6a 52 65 71 75 69  to use subjRequi
1cac0 72 65 73 50 61 67 65 28 29 20 74 6f 20 63 68 65  resPage() to che
1cad0 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74 20 69  ck .** that it i
1cae0 73 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65  s really require
1caf0 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  d before calling
1cb00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
1cb10 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
1cb20 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74  ful, set the bit
1cb30 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1cb40 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74  o pPg->pgno in t
1cb50 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f  he bitvecs.** fo
1cb60 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70  r all open savep
1cb70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74  oints before ret
1cb80 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  urning..**.** Th
1cb90 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
1cba0 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  rns SQLITE_OK if
1cbb0 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
1cbc0 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f  uccessful, an IO
1cbd0 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
1cbe0 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  f the attempt to
1cbf0 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 73 75   write to the su
1cc00 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c  b-journal fails,
1cc10 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e   or .** SQLITE_N
1cc20 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63  OMEM if a malloc
1cc30 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74   fails while set
1cc40 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20  ting a bit in a 
1cc50 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74  savepoint.** bit
1cc60 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vec..*/.static i
1cc70 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67  nt subjournalPag
1cc80 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
1cc90 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1cca0 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
1ccb0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1ccc0 65 72 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  er;.  if( isOpen
1ccd0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
1cce0 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74  {.    void *pDat
1ccf0 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
1cd00 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
1cd10 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63   pPager->nSubRec
1cd20 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
1cd30 53 69 7a 65 29 3b 0a 20 20 20 20 63 68 61 72 20  Size);.    char 
1cd40 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20 20 43 4f  *pData2;..    CO
1cd50 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
1cd60 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
1cd70 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
1cd80 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a  NOMEM, pData2);.
1cd90 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
1cda0 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
1cdb0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
1cdc0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1cdd0 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 0a 20 20  g->pgno));.  .  
1cde0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 49 6e    assert( pageIn
1cdf0 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20  Journal(pPg) || 
1ce00 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
1ce10 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a  ->dbOrigSize );.
1ce20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
1ce30 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66  bits(pPager->sjf
1ce40 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e  d, offset, pPg->
1ce50 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
1ce60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ce70 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1ce80 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
1ce90 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  ->sjfd, pData2, 
1cea0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1ceb0 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20  , offset+4);.   
1cec0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
1ced0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1cee0 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
1cef0 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  c++;.    assert(
1cf00 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
1cf10 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20  int>0 );.    rc 
1cf20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  = addToSavepoint
1cf30 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
1cf40 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  pPg->pgno);.  }.
1cf50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1cf60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1cf70 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
1cf80 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79  y the pcache lay
1cf90 65 72 20 77 68 65 6e 20 69 74 20 68 61 73 20 72  er when it has r
1cfa0 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73  eached some.** s
1cfb0 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74  oft memory limit
1cfc0 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
1cfd0 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
1cfe0 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a  r to a Pager obj
1cff0 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20  ect.** (cast as 
1d000 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61  a void*). The pa
1d010 67 65 72 20 69 73 20 61 6c 77 61 79 73 20 27 70  ger is always 'p
1d020 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61  urgeable' (not a
1d030 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64  n in-memory.** d
1d040 61 74 61 62 61 73 65 29 2e 20 54 68 65 20 73 65  atabase). The se
1d050 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
1d060 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
1d070 61 20 70 61 67 65 20 74 68 61 74 20 69 73 20 0a  a page that is .
1d080 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72  ** currently dir
1d090 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75  ty but has no ou
1d0a0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
1d0b0 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a  nces. The page.*
1d0c0 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f  * is always asso
1d0d0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
1d0e0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73  Pager object pas
1d0f0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
1d100 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a   .** argument..*
1d110 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20  *.** The job of 
1d120 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1d130 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65   to make pPg cle
1d140 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69 74  an by writing it
1d150 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75  s contents.** ou
1d160 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
1d170 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69  e file, if possi
1d180 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e  ble. This may in
1d190 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68  volve syncing th
1d1a0 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
1d1b0 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  e. .**.** If suc
1d1c0 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33  cessful, sqlite3
1d1d0 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
1d1e0 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
1d1f0 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53  he page and.** S
1d200 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
1d210 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
1d220 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
1d230 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68  rying to make th
1d240 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c  e.** page clean,
1d250 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
1d260 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
1d270 49 66 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e  If the page cann
1d280 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c  ot be.** made cl
1d290 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  ean for some oth
1d2a0 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e  er reason, but n
1d2b0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
1d2c0 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  then SQLITE_OK.*
1d2d0 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79  * is returned by
1d2e0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
1d2f0 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74  keClean() is not
1d300 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
1d310 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65  ic int pagerStre
1d320 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64  ss(void *p, PgHd
1d330 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
1d340 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
1d350 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20  r *)p;.  int rc 
1d360 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1d370 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
1d380 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
1d390 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c   assert( pPg->fl
1d3a0 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20  ags&PGHDR_DIRTY 
1d3b0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e  );..  /* The doN
1d3c0 6f 74 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73  otSync flag is s
1d3d0 65 74 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  et by the sqlite
1d3e0 33 50 61 67 65 72 57 72 69 74 65 28 29 20 66 75  3PagerWrite() fu
1d3f0 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 69 74 0a  nction while it.
1d400 20 20 2a 2a 20 69 73 20 6a 6f 75 72 6e 61 6c 6c    ** is journall
1d410 69 6e 67 20 61 20 73 65 74 20 6f 66 20 74 77 6f  ing a set of two
1d420 20 6f 72 20 6d 6f 72 65 20 64 61 74 61 62 61 73   or more databas
1d430 65 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  e pages that are
1d440 20 73 74 6f 72 65 64 0a 20 20 2a 2a 20 6f 6e 20   stored.  ** on 
1d450 74 68 65 20 73 61 6d 65 20 64 69 73 6b 20 73 65  the same disk se
1d460 63 74 6f 72 2e 20 53 79 6e 63 69 6e 67 20 74 68  ctor. Syncing th
1d470 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  e journal is not
1d480 20 61 6c 6c 6f 77 65 64 20 77 68 69 6c 65 0a 20   allowed while. 
1d490 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70   ** this is happ
1d4a0 65 6e 69 6e 67 20 61 73 20 69 74 20 69 73 20 69  ening as it is i
1d4b0 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c  mportant that al
1d4c0 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20 73 75 63  l members of suc
1d4d0 68 20 61 0a 20 20 2a 2a 20 73 65 74 20 6f 66 20  h a.  ** set of 
1d4e0 70 61 67 65 73 20 61 72 65 20 73 79 6e 63 65 64  pages are synced
1d4f0 20 74 6f 20 64 69 73 6b 20 74 6f 67 65 74 68 65   to disk togethe
1d500 72 2e 20 53 6f 2c 20 69 66 20 74 68 65 20 70 61  r. So, if the pa
1d510 67 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ge this function
1d520 0a 20 20 2a 2a 20 69 73 20 74 72 79 69 6e 67 20  .  ** is trying 
1d530 74 6f 20 6d 61 6b 65 20 63 6c 65 61 6e 20 77 69  to make clean wi
1d540 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75  ll require a jou
1d550 72 6e 61 6c 20 73 79 6e 63 20 61 6e 64 20 74 68  rnal sync and th
1d560 65 20 64 6f 4e 6f 74 53 79 6e 63 0a 20 20 2a 2a  e doNotSync.  **
1d570 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 72 65   flag is set, re
1d580 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69  turn without doi
1d590 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 54 68 65  ng anything. The
1d5a0 20 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 69   pcache layer wi
1d5b0 6c 6c 0a 20 20 2a 2a 20 6a 75 73 74 20 68 61 76  ll.  ** just hav
1d5c0 65 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e  e to go ahead an
1d5d0 64 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  d allocate a new
1d5e0 20 70 61 67 65 20 62 75 66 66 65 72 20 69 6e 73   page buffer ins
1d5f0 74 65 61 64 20 6f 66 0a 20 20 2a 2a 20 72 65 75  tead of.  ** reu
1d600 73 69 6e 67 20 70 50 67 2e 0a 20 20 2a 2a 0a 20  sing pPg..  **. 
1d610 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69   ** Similarly, i
1d620 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  f the pager has 
1d630 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20  already entered 
1d640 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
1d650 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 74 72 79   do not.  ** try
1d660 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 6f   to write the co
1d670 6e 74 65 6e 74 73 20 6f 66 20 70 50 67 20 74 6f  ntents of pPg to
1d680 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   disk..  */.  if
1d690 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1d6a0 65 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 64 6f  e || (pPager->do
1d6b0 4e 6f 74 53 79 6e 63 20 26 26 20 70 50 67 2d 3e  NotSync && pPg->
1d6c0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
1d6d0 5f 53 59 4e 43 29 20 29 7b 0a 20 20 20 20 72 65  _SYNC) ){.    re
1d6e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d6f0 20 20 7d 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74    }..  /* Sync t
1d700 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1d710 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
1d720 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73    if( pPg->flags
1d730 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
1d740 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 79 6e   ){.    rc = syn
1d750 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
1d760 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1d770 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
1d780 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 0a  r->fullSync && .
1d790 20 20 20 20 20 20 21 28 70 50 61 67 65 72 2d 3e        !(pPager->
1d7a0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
1d7b0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
1d7c0 45 4d 4f 52 59 29 20 26 26 0a 20 20 20 20 20 20  EMORY) &&.      
1d7d0 21 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  !(sqlite3OsDevic
1d7e0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1d7f0 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c  (pPager->fd)&SQL
1d800 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
1d810 50 50 45 4e 44 29 0a 20 20 20 20 29 7b 0a 20 20  PPEND).    ){.  
1d820 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
1d830 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
1d840 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
1d850 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
1d860 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
1d870 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1d880 74 68 69 73 20 70 61 67 65 20 69 73 20 6c 61 72  this page is lar
1d890 67 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ger than the cur
1d8a0 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20 2a  rent size of.  *
1d8b0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
1d8c0 6d 61 67 65 2c 20 69 74 20 6d 61 79 20 6e 65 65  mage, it may nee
1d8d0 64 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  d to be written 
1d8e0 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
1d8f0 61 6c 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69 73  al..  ** This is
1d900 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c   because the cal
1d910 6c 20 74 6f 20 70 61 67 65 72 5f 77 72 69 74 65  l to pager_write
1d920 5f 70 61 67 65 6c 69 73 74 28 29 20 62 65 6c 6f  _pagelist() belo
1d930 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20  w will not.  ** 
1d940 61 63 74 75 61 6c 6c 79 20 77 72 69 74 65 20 64  actually write d
1d950 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 20  ata to the file 
1d960 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
1d970 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 73 69 64 65 72  **.  ** Consider
1d980 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
1d990 65 71 75 65 6e 63 65 20 6f 66 20 65 76 65 6e 74  equence of event
1d9a0 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 42  s:.  **.  **   B
1d9b0 45 47 49 4e 3b 0a 20 20 2a 2a 20 20 20 20 20 3c  EGIN;.  **     <
1d9c0 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a  journal page X>.
1d9d0 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79    **     <modify
1d9e0 20 70 61 67 65 20 58 3e 0a 20 20 2a 2a 20 20 20   page X>.  **   
1d9f0 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a    SAVEPOINT sp;.
1da00 20 20 2a 2a 20 20 20 20 20 20 20 3c 73 68 72 69    **       <shri
1da10 6e 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  nk database file
1da20 20 74 6f 20 59 20 70 61 67 65 73 3e 0a 20 20 2a   to Y pages>.  *
1da30 2a 20 20 20 20 20 20 20 70 61 67 65 72 53 74 72  *       pagerStr
1da40 65 73 73 28 70 61 67 65 20 58 29 0a 20 20 2a 2a  ess(page X).  **
1da50 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f       ROLLBACK TO
1da60 20 73 70 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49   sp;.  **.  ** I
1da70 66 20 28 58 3e 59 29 2c 20 74 68 65 6e 20 77 68  f (X>Y), then wh
1da80 65 6e 20 70 61 67 65 72 53 74 72 65 73 73 20 69  en pagerStress i
1da90 73 20 63 61 6c 6c 65 64 20 70 61 67 65 20 58 20  s called page X 
1daa0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74  will not be writ
1dab0 74 65 6e 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20  ten.  ** out to 
1dac0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1dad0 65 2c 20 62 75 74 20 77 69 6c 6c 20 62 65 20 64  e, but will be d
1dae0 72 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  ropped from the 
1daf0 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20 2a  cache. Then,.  *
1db00 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
1db10 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22  "ROLLBACK TO sp"
1db20 20 73 74 61 74 65 6d 65 6e 74 2c 20 72 65 61 64   statement, read
1db30 69 6e 67 20 70 61 67 65 20 58 20 77 69 6c 6c 20  ing page X will 
1db40 72 65 61 64 0a 20 20 2a 2a 20 64 61 74 61 20 66  read.  ** data f
1db50 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1db60 20 66 69 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c   file. This will
1db70 20 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20   be the copy of 
1db80 70 61 67 65 20 58 20 61 73 20 69 74 0a 20 20 2a  page X as it.  *
1db90 2a 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 74  * was when the t
1dba0 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74  ransaction start
1dbb0 65 64 2c 20 6e 6f 74 20 61 73 20 69 74 20 77 61  ed, not as it wa
1dbc0 73 20 77 68 65 6e 20 22 53 41 56 45 50 4f 49 4e  s when "SAVEPOIN
1dbd0 54 20 73 70 22 0a 20 20 2a 2a 20 77 61 73 20 65  T sp".  ** was e
1dbe0 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a 0a 20 20  xecuted..  **.  
1dbf0 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  ** The solution 
1dc00 69 73 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  is to write the 
1dc10 63 75 72 72 65 6e 74 20 64 61 74 61 20 66 6f 72  current data for
1dc20 20 70 61 67 65 20 58 20 69 6e 74 6f 20 74 68 65   page X into the
1dc30 20 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e   .  ** sub-journ
1dc40 61 6c 20 66 69 6c 65 20 6e 6f 77 20 28 69 66 20  al file now (if 
1dc50 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
1dc60 79 20 74 68 65 72 65 29 2c 20 73 6f 20 74 68 61  y there), so tha
1dc70 74 20 69 74 20 77 69 6c 6c 0a 20 20 2a 2a 20 62  t it will.  ** b
1dc80 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
1dc90 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  s current value 
1dca0 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41  when the "ROLLBA
1dcb0 43 4b 20 54 4f 20 73 70 22 20 69 73 20 0a 20 20  CK TO sp" is .  
1dcc0 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a  ** executed..  *
1dcd0 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
1dce0 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67  TE_OK && pPg->pg
1dcf0 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  no>pPager->dbSiz
1dd00 65 20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65  e && subjRequire
1dd10 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 61 73  sPage(pPg) ){.as
1dd20 73 65 72 74 28 30 29 3b 0a 20 20 20 20 72 63 20  sert(0);.    rc 
1dd30 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  = subjournalPage
1dd40 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  (pPg);.  }..  /*
1dd50 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65   Write the conte
1dd60 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
1dd70 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
1dd80 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 69  ase file. */.  i
1dd90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1dda0 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69   ){.    pPg->pDi
1ddb0 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  rty = 0;.    rc 
1ddc0 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
1ddd0 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 7d  gelist(pPg);.  }
1dde0 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
1ddf0 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a  page as clean. *
1de00 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
1de10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47  TE_OK ){.    PAG
1de20 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53 53  ERTRACE(("STRESS
1de30 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
1de40 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1de50 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
1de60 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
1de70 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
1de80 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67   }..  return pag
1de90 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
1dea0 20 72 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   rc);.}.../*.** 
1deb0 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
1dec0 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61  tialize a new Pa
1ded0 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70  ger object and p
1dee0 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
1def0 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65  it.** in *ppPage
1df00 72 2e 20 54 68 65 20 70 61 67 65 72 20 73 68 6f  r. The pager sho
1df10 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62  uld eventually b
1df20 65 20 66 72 65 65 64 20 62 79 20 70 61 73 73 69  e freed by passi
1df30 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69  ng it.** to sqli
1df40 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e  te3PagerClose().
1df50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65  .**.** The zFile
1df60 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73  name argument is
1df70 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65   the path to the
1df80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1df90 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46  o open..** If zF
1dfa0 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
1dfb0 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
1dfc0 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
1dfd0 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
1dfe0 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
1dff0 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
1e000 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20  ched. Temporary 
1e010 66 69 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c  files are be del
1e020 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69  eted.** automati
1e030 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20  cally when they 
1e040 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a  are closed. If z
1e050 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
1e060 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20  mory:" then .** 
1e070 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
1e080 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65  is held in cache
1e090 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72  . It is never wr
1e0a0 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a  itten to disk. .
1e0b0 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  ** This can be u
1e0c0 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
1e0d0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
1e0e0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
1e0f0 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74  e nExtra paramet
1e100 65 72 20 73 70 65 63 69 66 69 65 73 20 74 68 65  er specifies the
1e110 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1e120 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
1e130 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74  ted.** along wit
1e140 68 20 65 61 63 68 20 70 61 67 65 20 72 65 66 65  h each page refe
1e150 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63  rence. This spac
1e160 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74  e is available t
1e170 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69  o the user.** vi
1e180 61 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  a the sqlite3Pag
1e190 65 72 47 65 74 45 78 74 72 61 28 29 20 41 50 49  erGetExtra() API
1e1a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
1e1b0 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73  s argument is us
1e1c0 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70 72  ed to specify pr
1e1d0 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61 66  operties that af
1e1e0 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72  fect the.** oper
1e1f0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67  ation of the pag
1e200 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65  er. It should be
1e210 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74   passed some bit
1e220 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wise combination
1e230 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52  .** of the PAGER
1e240 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e  _OMIT_JOURNAL an
1e250 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c  d PAGER_NO_READL
1e260 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a  OCK flags..**.**
1e270 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70 61   The vfsFlags pa
1e280 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74  rameter is a bit
1e290 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20  mask to pass to 
1e2a0 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
1e2b0 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f  ter.** of the xO
1e2c0 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20  pen() method of 
1e2d0 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46 53  the supplied VFS
1e2e0 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69   when opening fi
1e2f0 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  les. .**.** If t
1e300 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
1e310 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
1e320 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
1e330 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73  ile opened .** s
1e340 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c  uccessfully, SQL
1e350 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1e360 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20  ed and *ppPager 
1e370 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a  set to point to.
1e380 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 72  ** the new pager
1e390 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65   object. If an e
1e3a0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70  rror occurs, *pp
1e3b0 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f 20  Pager is set to 
1e3c0 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f  NULL.** and erro
1e3d0 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e  r code returned.
1e3e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
1e3f0 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
1e400 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74  _NOMEM.** (sqlit
1e410 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73  e3Malloc() is us
1e420 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  ed to allocate m
1e430 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43  emory), SQLITE_C
1e440 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76  ANTOPEN or .** v
1e450 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f  arious SQLITE_IO
1e460 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a  _XXX errors..*/.
1e470 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1e480 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
1e490 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
1e4a0 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
1e4b0 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75  file system to u
1e4c0 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a  se */.  Pager **
1e4d0 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  ppPager,        
1e4e0 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20   /* OUT: Return 
1e4f0 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
1e500 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
1e510 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1e520 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame,   /* Name o
1e530 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1e540 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ile to open */. 
1e550 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20   int nExtra,    
1e560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
1e570 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20  ra bytes append 
1e580 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
1e590 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  y page */.  int 
1e5a0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
1e5b0 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f       /* flags co
1e5c0 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66  ntrolling this f
1e5d0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ile */.  int vfs
1e5e0 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
1e5f0 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65    /* flags passe
1e600 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c  d through to sql
1e610 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
1e620 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65   */.  void (*xRe
1e630 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f  init)(DbPage*) /
1e640 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65  * Function to re
1e650 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73  initialize pages
1e660 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74   */.){.  u8 *pPt
1e670 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r;.  Pager *pPag
1e680 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
1e690 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f   Pager object to
1e6a0 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   allocate and re
1e6b0 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  turn */.  int rc
1e6c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
1e6d0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1e6e0 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46  e */.  int tempF
1e6f0 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ile = 0;        
1e700 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70  /* True for temp
1e710 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e   files (incl. in
1e720 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a  -memory files) *
1e730 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20  /.  int memDb = 
1e740 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1e750 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
1e760 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  an in-memory fil
1e770 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f  e */.  int readO
1e780 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nly = 0;        
1e790 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
1e7a0 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66  is a read-only f
1e7b0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75  ile */.  int jou
1e7c0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20  rnalFileSize;   
1e7d0 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
1e7e0 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68 20  locate for each 
1e7f0 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20  journal fd */.  
1e800 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20  char *zPathname 
1e810 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c  = 0;     /* Full
1e820 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61 73   path to databas
1e830 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
1e840 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20  nPathname = 0;  
1e850 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1e860 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68  f bytes in zPath
1e870 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73  name */.  int us
1e880 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67  eJournal = (flag
1e890 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  s & PAGER_OMIT_J
1e8a0 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46  OURNAL)==0; /* F
1e8b0 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75  alse to omit jou
1e8c0 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  rnal */.  int no
1e8d0 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67  Readlock = (flag
1e8e0 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41  s & PAGER_NO_REA
1e8f0 44 4c 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a 20 54  DLOCK)!=0;  /* T
1e900 72 75 65 20 74 6f 20 6f 6d 69 74 20 72 65 61 64  rue to omit read
1e910 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70  -lock */.  int p
1e920 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69  cacheSize = sqli
1e930 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b  te3PcacheSize();
1e940 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
1e950 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
1e960 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 31 36 20  PCache */.  u16 
1e970 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
1e980 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
1e990 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75  _SIZE;  /* Defau
1e9a0 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  lt page size */.
1e9b0 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
1e9c0 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20   how much space 
1e9d0 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
1e9e0 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  each journal fil
1e9f0 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74  e-handle.  ** (t
1ea00 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20  here are two of 
1ea10 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a  them, the main j
1ea20 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73  ournal and the s
1ea30 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69  ub-journal). Thi
1ea40 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6d 61  s.  ** is the ma
1ea50 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75  ximum space requ
1ea60 69 72 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  ired for an in-m
1ea70 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
1ea80 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20  le handle .  ** 
1ea90 61 6e 64 20 61 20 72 65 67 75 6c 61 72 20 6a 6f  and a regular jo
1eaa0 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c  urnal file-handl
1eab0 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20 22  e. Note that a "
1eac0 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d  regular journal-
1ead0 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79  handle".  ** may
1eae0 20 62 65 20 61 20 77 72 61 70 70 65 72 20 63 61   be a wrapper ca
1eaf0 70 61 62 6c 65 20 6f 66 20 63 61 63 68 69 6e 67  pable of caching
1eb00 20 74 68 65 20 66 69 72 73 74 20 70 6f 72 74 69   the first porti
1eb10 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  on of the journa
1eb20 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d  l.  ** file in m
1eb30 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65  emory to impleme
1eb40 6e 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  nt the atomic-wr
1eb50 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
1eb60 20 28 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72   (see .  ** sour
1eb70 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e  ce file journal.
1eb80 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  c)..  */.  if( s
1eb90 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a  qlite3JournalSiz
1eba0 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65 33 4d  e(pVfs)>sqlite3M
1ebb0 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20  emJournalSize() 
1ebc0 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  ){.    journalFi
1ebd0 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28  leSize = ROUND8(
1ebe0 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69  sqlite3JournalSi
1ebf0 7a 65 28 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c  ze(pVfs));.  }el
1ec00 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46  se{.    journalF
1ec10 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38  ileSize = ROUND8
1ec20 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e  (sqlite3MemJourn
1ec30 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a  alSize());.  }..
1ec40 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74    /* Set the out
1ec50 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20  put variable to 
1ec60 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20  NULL in case an 
1ec70 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f  error occurs. */
1ec80 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b  .  *ppPager = 0;
1ec90 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61  ..  /* Compute a
1eca0 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c  nd store the ful
1ecb0 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e  l pathname in an
1ecc0 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65   allocated buffe
1ecd0 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74  r pointed.  ** t
1ece0 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20  o by zPathname, 
1ecf0 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65  length nPathname
1ed00 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73  . Or, if this is
1ed10 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
1ed20 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f  e,.  ** leave bo
1ed30 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64  th nPathname and
1ed40 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74   zPathname set t
1ed50 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  o 0..  */.  if( 
1ed60 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
1ed70 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
1ed80 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66   nPathname = pVf
1ed90 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
1eda0 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d  .    zPathname =
1edb0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e   sqlite3Malloc(n
1edc0 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20  Pathname*2);.   
1edd0 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d   if( zPathname==
1ede0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
1edf0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1ee00 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1ee10 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
1ee20 44 42 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  DB.    if( strcm
1ee30 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65  p(zFilename,":me
1ee40 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  mory:")==0 ){.  
1ee50 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20      memDb = 1;. 
1ee60 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30       zPathname[0
1ee70 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  ] = 0;.    }else
1ee80 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
1ee90 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d      zPathname[0]
1eea0 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75   = 0; /* Make su
1eeb0 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65  re initialized e
1eec0 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e  ven if FullPathn
1eed0 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20  ame() fails */. 
1eee0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1eef0 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
1ef00 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
1ef10 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74   nPathname, zPat
1ef20 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  hname);.    }.. 
1ef30 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73     nPathname = s
1ef40 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1ef50 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Pathname);.    i
1ef60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ef70 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e   && nPathname+8>
1ef80 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1ef90 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
1efa0 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
1efb0 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  n when the journ
1efc0 61 6c 20 70 61 74 68 20 72 65 71 75 69 72 65 64  al path required
1efd0 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   by.      ** the
1efe0 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20   database being 
1eff0 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d  opened will be m
1f000 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d  ore than pVfs->m
1f010 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20  xPathname.      
1f020 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67  ** bytes in leng
1f030 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  th. This means t
1f040 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
1f050 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20  ot be opened,.  
1f060 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c      ** as it wil
1f070 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c  l not be possibl
1f080 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f  e to open the jo
1f090 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76  urnal file or ev
1f0a0 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63  en.      ** chec
1f0b0 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  k for a hot-jour
1f0c0 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69  nal before readi
1f0d0 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ng..      */.   
1f0e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
1f0f0 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a 20  ANTOPEN;.    }. 
1f100 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f110 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
1f120 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68  lite3_free(zPath
1f130 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  name);.      ret
1f140 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1f150 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
1f160 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20   memory for the 
1f170 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  Pager structure,
1f180 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20   PCache object, 
1f190 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66  the.  ** three f
1f1a0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c  ile descriptors,
1f1b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f1c0 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
1f1d0 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
1f1e0 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79  le name. The lay
1f1f0 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73  out in memory is
1f200 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
1f210 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72  *.  **     Pager
1f220 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
1f230 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65             (size
1f240 6f 66 28 50 61 67 65 72 29 20 62 79 74 65 73 29  of(Pager) bytes)
1f250 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65  .  **     PCache
1f260 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
1f270 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
1f280 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 20 62  e3PcacheSize() b
1f290 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44  ytes).  **     D
1f2a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e  atabase file han
1f2b0 64 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 28  dle            (
1f2c0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62  pVfs->szOsFile b
1f2d0 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53  ytes).  **     S
1f2e0 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
1f2f0 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28  handle         (
1f300 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
1f310 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
1f320 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  Main journal fil
1f330 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
1f340 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
1f350 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
1f360 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   Database file n
1f370 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
1f380 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79   (nPathname+1 by
1f390 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f  tes).  **     Jo
1f3a0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
1f3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
1f3c0 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74  Pathname+8+1 byt
1f3d0 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20  es).  */.  pPtr 
1f3e0 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d  = (u8 *)sqlite3M
1f3f0 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52  allocZero(.    R
1f400 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50  OUND8(sizeof(*pP
1f410 61 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a  ager)) +      /*
1f420 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
1f430 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
1f440 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20  cacheSize) +    
1f450 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65         /* PCache
1f460 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52   object */.    R
1f470 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73  OUND8(pVfs->szOs
1f480 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a  File) +       /*
1f490 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c   The main db fil
1f4a0 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  e */.    journal
1f4b0 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20  FileSize * 2 +  
1f4c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1f4d0 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  wo journal files
1f4e0 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61   */ .    nPathna
1f4f0 6d 65 20 2b 20 31 20 2b 20 20 20 20 20 20 20 20  me + 1 +        
1f500 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65          /* zFile
1f510 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74  name */.    nPat
1f520 68 6e 61 6d 65 20 2b 20 38 20 2b 20 31 20 20 20  hname + 8 + 1   
1f530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a             /* zJ
1f540 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 29 3b 0a 20  ournal */.  );. 
1f550 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
1f560 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51  YTE_ALIGNMENT(SQ
1f570 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
1f580 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
1f590 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72  ) );.  if( !pPtr
1f5a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1f5b0 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
1f5c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1f5d0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
1f5e0 70 50 61 67 65 72 20 3d 20 20 20 20 20 20 20 20  pPager =        
1f5f0 20 20 20 20 20 20 28 50 61 67 65 72 2a 29 28 70        (Pager*)(p
1f600 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Ptr);.  pPager->
1f610 70 50 43 61 63 68 65 20 3d 20 20 20 20 28 50 43  pPCache =    (PC
1f620 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  ache*)(pPtr += R
1f630 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50  OUND8(sizeof(*pP
1f640 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67 65  ager)));.  pPage
1f650 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69 74  r->fd =   (sqlit
1f660 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
1f670 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53  = ROUND8(pcacheS
1f680 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  ize));.  pPager-
1f690 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33  >sjfd = (sqlite3
1f6a0 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20  _file*)(pPtr += 
1f6b0 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f  ROUND8(pVfs->szO
1f6c0 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67 65  sFile));.  pPage
1f6d0 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69 74  r->jfd =  (sqlit
1f6e0 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
1f6f0 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  = journalFileSiz
1f700 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46  e);.  pPager->zF
1f710 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63 68  ilename =    (ch
1f720 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75  ar*)(pPtr += jou
1f730 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20  rnalFileSize);. 
1f740 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
1f750 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50  YTE_ALIGNMENT(pP
1f760 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20  ager->jfd) );.. 
1f770 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
1f780 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20  Pager.zFilename 
1f790 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e  and Pager.zJourn
1f7a0 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20 72  al buffers, if r
1f7b0 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66  equired. */.  if
1f7c0 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ( zPathname ){. 
1f7d0 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72     pPager->zJour
1f7e0 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28  nal =   (char*)(
1f7f0 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d  pPtr += nPathnam
1f800 65 20 2b 20 31 29 3b 0a 20 20 20 20 6d 65 6d 63  e + 1);.    memc
1f810 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
1f820 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  name, zPathname,
1f830 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
1f840 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
1f850 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e  zJournal, zPathn
1f860 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b  ame, nPathname);
1f870 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61  .    memcpy(&pPa
1f880 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50  ger->zJournal[nP
1f890 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72  athname], "-jour
1f8a0 6e 61 6c 22 2c 20 38 29 3b 0a 20 20 20 20 69 66  nal", 8);.    if
1f8b0 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  ( pPager->zFilen
1f8c0 61 6d 65 5b 30 5d 3d 3d 30 20 29 20 70 50 61 67  ame[0]==0 ) pPag
1f8d0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 30 5d 20  er->zJournal[0] 
1f8e0 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
1f8f0 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
1f900 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1f910 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70  pVfs = pVfs;.  p
1f920 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20  Pager->vfsFlags 
1f930 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f  = vfsFlags;..  /
1f940 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72  * Open the pager
1f950 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
1f960 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
1f970 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21  Filename[0] && !
1f980 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 6e 74  memDb ){.    int
1f990 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20   fout = 0;      
1f9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f9b0 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72   VFS flags retur
1f9c0 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a  ned by xOpen() *
1f9d0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1f9e0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
1f9f0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
1fa00 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66  , pPager->fd, vf
1fa10 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a  sFlags, &fout);.
1fa20 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
1fa30 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
1fa40 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20  _READONLY);..   
1fa50 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
1fa60 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
1fa70 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64   opened for read
1fa80 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20  /write access,. 
1fa90 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64     ** choose a d
1faa0 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
1fab0 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65   in case we have
1fac0 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20   to create the. 
1fad0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1fae0 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74  ile. The default
1faf0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68   page size is th
1fb00 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20  e maximum of:.  
1fb10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b    **.    **    +
1fb20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1fb30 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a  PAGE_SIZE,.    *
1fb40 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65  *    + The value
1fb50 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
1fb60 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
1fb70 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  ().    **    + T
1fb80 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20  he largest page 
1fb90 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65  size that can be
1fba0 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
1fbb0 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lly..    */.    
1fbc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1fbd0 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29  K && !readOnly )
1fbe0 7b 0a 20 20 20 20 20 20 73 65 74 53 65 63 74 6f  {.      setSecto
1fbf0 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
1fc00 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
1fc10 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
1fc20 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  SIZE<=SQLITE_MAX
1fc30 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
1fc40 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ZE);.      if( s
1fc50 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72  zPageDflt<pPager
1fc60 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a  ->sectorSize ){.
1fc70 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1fc80 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53  er->sectorSize>S
1fc90 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
1fca0 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20  T_PAGE_SIZE ){. 
1fcb0 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
1fcc0 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  flt = SQLITE_MAX
1fcd0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
1fce0 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ZE;.        }els
1fcf0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  e{.          szP
1fd00 61 67 65 44 66 6c 74 20 3d 20 28 75 31 36 29 70  ageDflt = (u16)p
1fd10 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
1fd20 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
1fd30 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
1fd40 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
1fd50 5f 57 52 49 54 45 0a 20 20 20 20 20 20 7b 0a 20  _WRITE.      {. 
1fd60 20 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d         int iDc =
1fd70 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
1fd80 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1fd90 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
1fda0 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
1fdb0 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
1fdc0 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
1fdd0 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
1fde0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
1fdf0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
1fe00 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
1fe10 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1fe20 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  t(SQLITE_MAX_DEF
1fe30 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
1fe40 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20  65536);.        
1fe50 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c  for(ii=szPageDfl
1fe60 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41  t; ii<=SQLITE_MA
1fe70 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
1fe80 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20  IZE; ii=ii*2){. 
1fe90 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63           if( iDc
1fea0 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
1feb0 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29  TOMIC|(ii>>8)) )
1fec0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a  {.            sz
1fed0 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20  PageDflt = ii;. 
1fee0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1fef0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
1ff00 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  dif.    }.  }els
1ff10 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74  e{.    /* If a t
1ff20 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
1ff30 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69   requested, it i
1ff40 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d  s not opened imm
1ff50 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a  ediately..    **
1ff60 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65   In this case we
1ff70 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61   accept the defa
1ff80 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ult page size an
1ff90 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79  d delay actually
1ffa0 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20  .    ** opening 
1ffb0 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74  the file until t
1ffc0 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
1ffd0 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20   OsWrite()..    
1ffe0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  **.    ** This b
1fff0 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75  ranch is also ru
20000 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  n for an in-memo
20010 72 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20  ry database. An 
20020 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a  in-memory.    **
20030 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65   database is the
20040 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d   same as a temp-
20050 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76  file that is nev
20060 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  er written out t
20070 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e  o.    ** disk an
20080 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d  d uses an in-mem
20090 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ory rollback jou
200a0 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20  rnal..    */ .  
200b0 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a    tempFile = 1;.
200c0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
200d0 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
200e0 49 56 45 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c  IVE;.    readOnl
200f0 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53 51  y = (vfsFlags&SQ
20100 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
20110 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  LY);.  }..  /* T
20120 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  he following cal
20130 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50 61 67  l to PagerSetPag
20140 65 73 69 7a 65 28 29 20 73 65 72 76 65 73 20 74  esize() serves t
20150 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20  o set the value 
20160 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70  of .  ** Pager.p
20170 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61  ageSize and to a
20180 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65  llocate the Page
20190 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66  r.pTmpSpace buff
201a0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  er..  */.  if( r
201b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
201c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
201d0 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a  er->memDb==0 );.
201e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
201f0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
20200 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65  (pPager, &szPage
20210 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74  Dflt, -1);.    t
20220 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
20230 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20  ITE_OK );.  }.. 
20240 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
20250 6f 63 63 75 72 72 65 64 20 69 6e 20 65 69 74 68  occurred in eith
20260 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73  er of the blocks
20270 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65   above, free the
20280 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 73 74 72   .  ** Pager str
20290 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65  ucture and close
202a0 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a   the file..  */.
202b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
202c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
202d0 74 28 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70  t( !pPager->pTmp
202e0 53 70 61 63 65 20 29 3b 0a 20 20 20 20 73 71 6c  Space );.    sql
202f0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
20300 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c  er->fd);.    sql
20310 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
20320 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
20330 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
20340 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68  ialize the PCach
20350 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 61  e object. */.  a
20360 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c 31 30  ssert( nExtra<10
20370 30 30 20 29 3b 0a 20 20 6e 45 78 74 72 61 20 3d  00 );.  nExtra =
20380 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b   ROUND8(nExtra);
20390 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
203a0 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c  Open(szPageDflt,
203b0 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c   nExtra, !memDb,
203c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
203d0 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65       !memDb?page
203e0 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64  rStress:0, (void
203f0 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67 65   *)pPager, pPage
20400 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20  r->pPCache);..  
20410 50 41 47 45 52 54 52 41 43 45 28 28 22 4f 50 45  PAGERTRACE(("OPE
20420 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45  N %d %s\n", FILE
20430 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d  HANDLEID(pPager-
20440 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46  >fd), pPager->zF
20450 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54  ilename));.  IOT
20460 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25  RACE(("OPEN %p %
20470 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  s\n", pPager, pP
20480 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
20490 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65  )..  pPager->use
204a0 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73  Journal = (u8)us
204b0 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67  eJournal;.  pPag
204c0 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  er->noReadlock =
204d0 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20   (noReadlock && 
204e0 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a 30 3b 0a  readOnly) ?1:0;.
204f0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
20500 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20  tOpen = 0; */.  
20510 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  /* pPager->stmtI
20520 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nUse = 0; */.  /
20530 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d  * pPager->nRef =
20540 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
20550 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 28  >dbSizeValid = (
20560 75 38 29 6d 65 6d 44 62 3b 0a 20 20 2f 2a 20 70  u8)memDb;.  /* p
20570 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
20580 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
20590 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
205a0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
205b0 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a  er->nPage = 0; *
205c0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  /.  pPager->mxPg
205d0 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  no = SQLITE_MAX_
205e0 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a  PAGE_COUNT;.  /*
205f0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
20600 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a   PAGER_UNLOCK; *
20610 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
20620 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74 65  er->state == (te
20630 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f 45  mpFile ? PAGER_E
20640 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45 52  XCLUSIVE : PAGER
20650 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a  _UNLOCK) );.  /*
20660 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
20670 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
20680 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75  r->tempFile = (u
20690 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73  8)tempFile;.  as
206a0 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d  sert( tempFile==
206b0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
206c0 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20  E_NORMAL .      
206d0 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d      || tempFile=
206e0 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
206f0 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  DE_EXCLUSIVE );.
20700 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
20710 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
20720 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50  USIVE==1 );.  pP
20730 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
20740 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69  ode = (u8)tempFi
20750 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63  le; .  pPager->c
20760 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
20770 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
20780 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d  e;.  pPager->mem
20790 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a  Db = (u8)memDb;.
207a0 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e    pPager->readOn
207b0 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c  ly = (u8)readOnl
207c0 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  y;.  /* pPager->
207d0 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f  needSync = 0; */
207e0 0a 20 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f  .  assert( useJo
207f0 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d  urnal || pPager-
20800 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70  >tempFile );.  p
20810 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
20820 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
20830 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
20840 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e  Sync = pPager->n
20850 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20 20 70 50  oSync ?0:1;.  pP
20860 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
20870 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
20880 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67  ORMAL;.  /* pPag
20890 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20  er->pFirst = 0; 
208a0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
208b0 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
208c0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
208d0 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a  ->pLast = 0; */.
208e0 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
208f0 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a   = (u16)nExtra;.
20900 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
20910 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c  lSizeLimit = SQL
20920 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52  ITE_DEFAULT_JOUR
20930 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a  NAL_SIZE_LIMIT;.
20940 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
20950 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
20960 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65  tempFile );.  se
20970 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
20980 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a  er);.  if( !useJ
20990 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50  ournal ){.    pP
209a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
209b0 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
209c0 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c  LMODE_OFF;.  }el
209d0 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a  se if( memDb ){.
209e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
209f0 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
20a00 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
20a10 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61  RY;.  }.  /* pPa
20a20 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
20a30 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  r = 0; */.  /* p
20a40 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
20a50 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20  lerArg = 0; */. 
20a60 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
20a70 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20  er = xReinit;.  
20a80 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  /* memset(pPager
20a90 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
20aa0 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
20ab0 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  )); */.  *ppPage
20ac0 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65  r = pPager;.  re
20ad0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20ae0 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }..../*.** This 
20af0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
20b00 65 64 20 61 66 74 65 72 20 74 72 61 6e 73 69 74  ed after transit
20b10 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45  ioning from PAGE
20b20 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50  R_UNLOCK to.** P
20b30 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74  AGER_SHARED stat
20b40 65 2e 20 49 74 20 74 65 73 74 73 20 69 66 20 74  e. It tests if t
20b50 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
20b60 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e  urnal present in
20b70 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73  .** the file-sys
20b80 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65  tem for the give
20b90 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a  n pager. A hot j
20ba0 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68  ournal is one th
20bb0 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  at .** needs to 
20bc0 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  be played back. 
20bd0 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69  According to thi
20be0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f  s function, a ho
20bf0 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  t-journal.** fil
20c00 65 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20  e exists if the 
20c10 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
20c20 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a  ia are met:.**.*
20c30 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61  *   * The journa
20c40 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e  l file exists in
20c50 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d   the file system
20c60 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20  , and.**   * No 
20c70 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20  process holds a 
20c80 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
20c90 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
20ca0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61  database file, a
20cb0 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61  nd.**   * The da
20cc0 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65  tabase file itse
20cd0 6c 66 20 69 73 20 67 72 65 61 74 65 72 20 74 68  lf is greater th
20ce0 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73 69  an 0 bytes in si
20cf0 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  ze, and.**   * T
20d00 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
20d10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
20d20 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20  e exists and is 
20d30 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20  not 0x00..**.** 
20d40 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  If the current s
20d50 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
20d60 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75  ase file is 0 bu
20d70 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  t a journal file
20d80 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74  .** exists, that
20d90 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20   is probably an 
20da0 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74  old journal left
20db0 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69   over from a pri
20dc0 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77  or.** database w
20dd0 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
20de0 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
20df0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
20e00 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65   is.** just dele
20e10 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65  ted using OsDele
20e20 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20  te, *pExists is 
20e30 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
20e40 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
20e50 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urned..**.** Thi
20e60 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  s routine does n
20e70 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68 65 72  ot check if ther
20e80 65 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f  e is a master jo
20e90 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a  urnal filename.*
20ea0 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
20eb0 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
20ec0 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20  re is, and that 
20ed0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
20ee0 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  ile.** does not 
20ef0 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20  exist, then the 
20f00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
20f10 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20  not really hot. 
20f20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20  In this.** case 
20f30 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
20f40 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65  l return a false
20f50 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70  -positive. The p
20f60 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a  ager_playback().
20f70 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  ** routine will 
20f80 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74 68  discover that th
20f90 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
20fa0 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74  s not really hot
20fb0 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f   and .** will no
20fc0 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  t roll it back. 
20fd0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d  .**.** If a hot-
20fe0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
20ff0 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20  found to exist, 
21000 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20  *pExists is set 
21010 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c  to 1 and .** SQL
21020 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
21030 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e   If no hot-journ
21040 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65  al file is prese
21050 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a  nt, *pExists is.
21060 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  ** set to 0 and 
21070 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
21080 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
21090 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
210a0 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74  trying.** to det
210b0 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
210c0 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72  r not a hot-jour
210d0 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
210e0 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a   the IO error.**
210f0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
21100 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
21110 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73 20 75  of *pExists is u
21120 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
21130 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f  tic int hasHotJo
21140 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
21150 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74  ger, int *pExist
21160 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  s){.  sqlite3_vf
21170 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
21180 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
21190 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
211a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
211b0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
211c0 0a 20 20 69 6e 74 20 65 78 69 73 74 73 3b 20 20  .  int exists;  
211d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211e0 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f   /* True if a jo
211f0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72  urnal file is pr
21200 65 73 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65  esent */..  asse
21210 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
21220 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
21230 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
21240 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
21250 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
21260 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70  .  assert( !isOp
21270 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
21280 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
21290 67 65 72 2d 3e 73 74 61 74 65 20 3c 3d 20 50 41  ger->state <= PA
212a0 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20  GER_SHARED );.. 
212b0 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20   *pExists = 0;. 
212c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
212d0 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67  ccess(pVfs, pPag
212e0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  er->zJournal, SQ
212f0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
21300 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20  TS, &exists);.  
21310 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21320 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20  K && exists ){. 
21330 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 3b 20 20     int locked;  
21340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21350 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70  * True if some p
21360 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52  rocess holds a R
21370 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a  ESERVED lock */.
21380 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e  .    /* Race con
21390 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e  dition here:  An
213a0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69  other process mi
213b0 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f  ght have been ho
213c0 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  lding the.    **
213d0 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
213e0 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f  ck and have a jo
213f0 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68  urnal open at th
21400 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  e sqlite3OsAcces
21410 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  s() .    ** call
21420 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e   above, but then
21430 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
21440 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65  nal and drop the
21450 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20   lock before.   
21460 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68   ** we get to th
21470 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69  e following sqli
21480 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
21490 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20  edLock() call.  
214a0 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69  If that.    ** i
214b0 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 69 73  s the case, this
214c0 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74   routine might t
214d0 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20  hink there is a 
214e0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  hot journal when
214f0 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20  .    ** in fact 
21500 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20  there is none.  
21510 54 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20  This results in 
21520 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
21530 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20   which will.    
21540 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68  ** be dealt with
21550 20 62 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b   by the playback
21560 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65   routine.  Ticke
21570 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a  t #3883..    */.
21580 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21590 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
215a0 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
215b0 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66  &locked);.    if
215c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
215d0 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20  && !locked ){.  
215e0 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a      int nPage;..
215f0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
21600 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
21610 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
21620 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20   it consists of 
21630 30 20 70 61 67 65 73 2c 0a 20 20 20 20 20 20 2a  0 pages,.      *
21640 2a 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68  * then delete th
21650 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
21660 53 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63  See the header c
21670 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 66 6f 72  omment above for
21680 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72   .      ** the r
21690 65 61 73 6f 6e 69 6e 67 20 68 65 72 65 2e 20 20  easoning here.  
216a0 44 65 6c 65 74 65 20 74 68 65 20 6f 62 73 6f 6c  Delete the obsol
216b0 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
216c0 20 75 6e 64 65 72 0a 20 20 20 20 20 20 2a 2a 20   under.      ** 
216d0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
216e0 74 6f 20 61 76 6f 69 64 20 72 61 63 65 20 63 6f  to avoid race co
216f0 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20 74 6f 20  nditions and to 
21700 61 76 6f 69 64 20 76 69 6f 6c 61 74 69 6e 67 0a  avoid violating.
21710 20 20 20 20 20 20 2a 2a 20 5b 48 33 33 30 32 30        ** [H33020
21720 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ]..      */.    
21730 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
21740 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
21750 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
21760 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21770 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
21780 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
21790 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
217a0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
217b0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20  loc();.         
217c0 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 4c 6f   if( sqlite3OsLo
217d0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52  ck(pPager->fd, R
217e0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53  ESERVED_LOCK)==S
217f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21800 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
21810 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50  sDelete(pVfs, pP
21820 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
21830 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
21840 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
21850 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52  pPager->fd, SHAR
21860 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
21870 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21880 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
21890 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
218a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
218b0 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61     /* The journa
218c0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
218d0 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  d no other conne
218e0 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65  ction has a rese
218f0 72 76 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  rved.          *
21900 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  * or greater loc
21910 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
21920 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63  e file. Now chec
21930 6b 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  k that there is.
21940 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20            ** at 
21950 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65  least one non-ze
21960 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65 20  ro bytes at the 
21970 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
21980 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
21990 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65       ** If there
219a0 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e   is, then we con
219b0 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e  sider this journ
219c0 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66  al to be hot. If
219d0 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20   not, .         
219e0 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67   ** it can be ig
219f0 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20  nored..         
21a00 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e   */.          in
21a10 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  t f = SQLITE_OPE
21a20 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
21a30 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
21a40 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 72  NAL;.          r
21a50 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
21a60 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
21a70 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
21a80 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20  ->jfd, f, &f);. 
21a90 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
21aa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21ab0 20 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72            u8 fir
21ac0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
21ad0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21ae0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
21af0 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72  fd, (void *)&fir
21b00 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  st, 1, 0);.     
21b10 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
21b20 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
21b30 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
21b40 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
21b50 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
21b60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21b70 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
21b80 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
21b90 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
21ba0 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29  sts = (first!=0)
21bb0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
21bc0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
21bd0 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20  _CANTOPEN ){.   
21be0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
21bf0 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68  e cannot open th
21c00 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
21c10 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  al file in order
21c20 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20   to see if.     
21c30 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20 68 61         ** its ha
21c40 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c  s a zero header,
21c50 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 64   that might be d
21c60 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72  ue to an I/O err
21c70 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20  or, or.         
21c80 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62     ** it might b
21c90 65 20 64 75 65 20 74 6f 20 74 68 65 20 72 61 63  e due to the rac
21ca0 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
21cb0 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20  ribed above and 
21cc0 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  in.            *
21cd0 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20  * ticket #3883. 
21ce0 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 73 73   Either way, ass
21cf0 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ume that the jou
21d00 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20  rnal is hot..   
21d10 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73           ** This
21d20 20 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c 73   might be a fals
21d30 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74  e positive.  But
21d40 20 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   if it is, then 
21d50 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
21d60 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75  ** automatic jou
21d70 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e  rnal playback an
21d80 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61  d recovery mecha
21d90 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20  nism will deal. 
21da0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69             ** wi
21db0 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45  th it under an E
21dc0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68  XCLUSIVE lock wh
21dd0 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  ere we do not ne
21de0 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ed to.          
21df0 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75    ** worry so mu
21e00 63 68 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e  ch with race con
21e10 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20  ditions..       
21e20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
21e30 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31      *pExists = 1
21e40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
21e50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
21e60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21e70 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
21e80 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
21e90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
21ea0 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f  d the content fo
21eb0 72 20 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f  r page pPg out o
21ec0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
21ed0 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a  ile and into .**
21ee0 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73   pPg->pData. A s
21ef0 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72  hared lock or gr
21f00 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65  eater must be he
21f10 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
21f20 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72  se.** file befor
21f30 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
21f40 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
21f50 20 49 66 20 70 61 67 65 20 31 20 69 73 20 72 65   If page 1 is re
21f60 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ad, then the val
21f70 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69  ue of Pager.dbFi
21f80 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20  leVers[] is set 
21f90 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  to.** the value 
21fa0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
21fb0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
21fc0 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
21fd0 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74  r occurs, then t
21fe0 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72  he IO error is r
21ff0 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
22000 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77  aller..** Otherw
22010 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ise, SQLITE_OK i
22020 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
22030 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62  tatic int readDb
22040 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
22050 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
22060 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
22070 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
22080 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
22090 20 70 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50   page pPg */.  P
220a0 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e  gno pgno = pPg->
220b0 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50  pgno;       /* P
220c0 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65  age number to re
220d0 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ad */.  int rc; 
220e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220f0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
22100 6f 64 65 20 2a 2f 0a 20 20 69 36 34 20 69 4f 66  ode */.  i64 iOf
22110 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
22120 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
22130 66 73 65 74 20 6f 66 20 66 69 6c 65 20 74 6f 20  fset of file to 
22140 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 0a 20 20  read from */..  
22150 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
22160 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
22170 52 45 44 20 26 26 20 21 4d 45 4d 44 42 20 29 3b  RED && !MEMDB );
22180 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
22190 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
221a0 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 21 69  ..  if( NEVER(!i
221b0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
221c0 29 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  )) ){.    assert
221d0 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
221e0 6c 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  le );.    memset
221f0 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20  (pPg->pData, 0, 
22200 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
22210 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
22220 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
22230 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  Offset = (pgno-1
22240 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
22250 61 67 65 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20  ageSize;.  rc = 
22260 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
22270 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70  ager->fd, pPg->p
22280 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
22290 67 65 53 69 7a 65 2c 20 69 4f 66 66 73 65 74 29  geSize, iOffset)
222a0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
222b0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
222c0 45 41 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  EAD ){.    rc = 
222d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
222e0 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
222f0 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65      u8 *dbFileVe
22300 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d  rs = &((u8*)pPg-
22310 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20  >pData)[24];.   
22320 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
22330 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46  >dbFileVers, dbF
22340 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
22350 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
22360 72 73 29 29 3b 0a 20 20 7d 0a 20 20 43 4f 44 45  rs));.  }.  CODE
22370 43 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  C1(pPager, pPg->
22380 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  pData, pgno, 3, 
22390 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
223a0 4d 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43  M);..  PAGER_INC
223b0 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
223c0 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  readdb_count);. 
223d0 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
223e0 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f  er->nRead);.  IO
223f0 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20  TRACE(("PGIN %p 
22400 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
22410 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52  gno));.  PAGERTR
22420 41 43 45 28 28 22 46 45 54 43 48 20 25 64 20 70  ACE(("FETCH %d p
22430 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
22440 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
22450 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
22460 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
22470 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
22480 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
22490 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
224a0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
224b0 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68  d to obtain a sh
224c0 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
224d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
224e0 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
224f0 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
22500 50 61 67 65 72 41 63 71 75 69 72 65 28 29 20 75  PagerAcquire() u
22510 6e 74 69 6c 20 61 66 74 65 72 20 74 68 69 73 20  ntil after this 
22520 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20  function.** has 
22530 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  been successfull
22540 79 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73  y called. If a s
22550 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c  hared-lock is al
22560 72 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a  ready held when.
22570 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
22580 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
22590 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
225a0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   The following o
225b0 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c  perations are al
225c0 73 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20  so performed by 
225d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
225e0 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65  *.**   1) If the
225f0 20 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e   pager is curren
22600 74 6c 79 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c  tly in PAGER_UNL
22610 4f 43 4b 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f  OCK state (no lo
22620 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20  ck held.**      
22630 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
22640 66 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 61  file), then an a
22650 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
22660 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20  o obtain a.**   
22670 20 20 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f     SHARED lock o
22680 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
22690 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79  ile. Immediately
226a0 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67   after obtaining
226b0 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 53 48 41  .**      the SHA
226c0 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69  RED lock, the fi
226d0 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 63 68 65  le-system is che
226e0 63 6b 65 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a  cked for a hot-j
226f0 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20  ournal,.**      
22700 77 68 69 63 68 20 69 73 20 70 6c 61 79 65 64 20  which is played 
22710 62 61 63 6b 20 69 66 20 70 72 65 73 65 6e 74 2e  back if present.
22720 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68   Following any h
22730 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20  ot-journal .**  
22740 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68      rollback, th
22750 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
22760 65 20 63 61 63 68 65 20 61 72 65 20 76 61 6c 69  e cache are vali
22770 64 61 74 65 64 20 62 79 20 63 68 65 63 6b 69 6e  dated by checkin
22780 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 27 63  g.**      the 'c
22790 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20 66  hange-counter' f
227a0 69 65 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61  ield of the data
227b0 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72  base file header
227c0 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69 73   and.**      dis
227d0 63 61 72 64 65 64 20 69 66 20 74 68 65 79 20 61  carded if they a
227e0 72 65 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69  re found to be i
227f0 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  nvalid..**.**   
22800 32 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20  2) If the pager 
22810 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
22820 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e  clusive-mode, an
22830 64 20 74 68 65 72 65 20 61 72 65 20 63 75 72 72  d there are curr
22840 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f  ently.**      no
22850 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
22860 65 72 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70  erences to any p
22870 61 67 65 73 2c 20 61 6e 64 20 69 73 20 69 6e 20  ages, and is in 
22880 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
22890 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e 20 61 6e  .**      then an
228a0 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
228b0 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72   to clear the er
228c0 72 6f 72 20 73 74 61 74 65 20 62 79 20 64 69 73  ror state by dis
228d0 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20  carding.**      
228e0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
228f0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61  the page cache a
22900 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  nd rolling back 
22910 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c  any open journal
22920 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a  .**      file..*
22930 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 65 72  *.** If the oper
22940 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ation described 
22950 62 79 20 28 32 29 20 61 62 6f 76 65 20 69 73 20  by (2) above is 
22960 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 61  not attempted, a
22970 6e 64 20 69 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd if the.** pag
22980 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f  er is in an erro
22990 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68  r state other th
229a0 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 77  an SQLITE_FULL w
229b0 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
229c0 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  ed,.** the error
229d0 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64   state error cod
229e0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  e is returned. I
229f0 74 20 69 73 20 70 65 72 6d 69 74 74 65 64 20 74  t is permitted t
22a00 6f 20 72 65 61 64 20 74 68 65 0a 2a 2a 20 64 61  o read the.** da
22a10 74 61 62 61 73 65 20 77 68 65 6e 20 69 6e 20 53  tabase when in S
22a20 51 4c 49 54 45 5f 46 55 4c 4c 20 65 72 72 6f 72  QLITE_FULL error
22a30 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74   state..**.** Ot
22a40 68 65 72 77 69 73 65 2c 20 69 66 20 65 76 65 72  herwise, if ever
22a50 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
22a60 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
22a70 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
22a80 61 6e 0a 2a 2a 20 49 4f 20 65 72 72 6f 72 20 6f  an.** IO error o
22a90 63 63 75 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b  ccurs while lock
22aa0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
22ab0 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61  , checking for a
22ac0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   hot-journal.** 
22ad0 66 69 6c 65 20 6f 72 20 72 6f 6c 6c 69 6e 67 20  file or rolling 
22ae0 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66  back a journal f
22af0 69 6c 65 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  ile, the IO erro
22b00 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
22b10 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
22b20 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  e3PagerSharedLoc
22b30 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
22b40 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
22b50 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
22b60 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
22b70 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
22b80 73 45 72 72 6f 72 52 65 73 65 74 20 3d 20 30 3b  sErrorReset = 0;
22b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22ba0 20 54 72 75 65 20 69 66 20 72 65 63 6f 76 65 72   True if recover
22bb0 69 6e 67 20 66 72 6f 6d 20 65 72 72 6f 72 20 73  ing from error s
22bc0 74 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  tate */..  /* Th
22bd0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
22be0 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62  ly called from b
22bf0 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77  -tree and only w
22c00 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
22c10 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e  .  ** outstandin
22c20 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 61 73 73  g pages */.  ass
22c30 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
22c40 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
22c50 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
22c60 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
22c70 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 61  database is in a
22c80 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 6e  n error-state, n
22c90 6f 77 20 69 73 20 61 20 63 68 61 6e 63 65 20 74  ow is a chance t
22ca0 6f 20 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65  o clear.  ** the
22cb0 20 65 72 72 6f 72 2e 20 44 69 73 63 61 72 64 20   error. Discard 
22cc0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
22cd0 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
22ce0 61 6e 64 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  and rollback.  *
22cf0 2a 20 61 6e 79 20 68 6f 74 20 6a 6f 75 72 6e 61  * any hot journa
22d00 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  l in the file-sy
22d10 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  stem..  */.  if(
22d20 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
22d30 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
22d40 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
22d50 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61  ger->jfd) || pPa
22d60 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 29 7b  ger->zJournal ){
22d70 0a 20 20 20 20 20 20 69 73 45 72 72 6f 72 52 65  .      isErrorRe
22d80 73 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  set = 1;.    }. 
22d90 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
22da0 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  de = SQLITE_OK;.
22db0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
22dc0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
22dd0 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
22de0 69 73 20 73 74 69 6c 6c 20 69 6e 20 61 6e 20 65  is still in an e
22df0 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e  rror state, do n
22e00 6f 74 20 70 72 6f 63 65 65 64 2e 20 54 68 65 20  ot proceed. The 
22e10 65 72 72 6f 72 20 0a 20 20 2a 2a 20 73 74 61 74  error .  ** stat
22e20 65 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65  e will be cleare
22e30 64 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20  d at some point 
22e40 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 68  in the future wh
22e50 65 6e 20 61 6c 6c 20 70 61 67 65 20 0a 20 20 2a  en all page .  *
22e60 2a 20 72 65 66 65 72 65 6e 63 65 73 20 61 72 65  * references are
22e70 20 64 72 6f 70 70 65 64 20 61 6e 64 20 74 68 65   dropped and the
22e80 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64 69   cache can be di
22e90 73 63 61 72 64 65 64 2e 0a 20 20 2a 2f 0a 20 20  scarded..  */.  
22ea0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
22eb0 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
22ec0 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
22ed0 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULL ){.    retur
22ee0 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
22ef0 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  e;.  }..  if( pP
22f00 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
22f10 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73 45  ER_UNLOCK || isE
22f20 72 72 6f 72 52 65 73 65 74 20 29 7b 0a 20 20 20  rrorReset ){.   
22f30 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
22f40 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
22f50 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e  er->pVfs;.    in
22f60 74 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d  t isHotJournal =
22f70 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
22f80 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73  !MEMDB );.    as
22f90 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
22fa0 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
22fb0 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
22fc0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
22fd0 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29  er->noReadlock )
22fe0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
22ff0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
23000 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
23010 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
23020 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23030 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
23040 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
23050 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
23060 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
23070 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
23080 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  r, rc);.      }.
23090 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
230a0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
230b0 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  ER_UNLOCK ){.   
230c0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
230d0 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
230e0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
230f0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
23100 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
23110 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f  ..    /* If a jo
23120 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
23130 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  s, and there is 
23140 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  no RESERVED lock
23150 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
23160 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
23170 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65  en it either nee
23180 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
23190 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e  back or deleted.
231a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
231b0 21 69 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b  !isErrorReset ){
231c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
231d0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3c 3d 20  Pager->state <= 
231e0 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
231f0 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f        rc = hasHo
23200 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  tJournal(pPager,
23210 20 26 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b   &isHotJournal);
23220 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
23230 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23240 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
23250 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
23260 20 20 20 69 66 28 20 69 73 45 72 72 6f 72 52 65     if( isErrorRe
23270 73 65 74 20 7c 7c 20 69 73 48 6f 74 4a 6f 75 72  set || isHotJour
23280 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  nal ){.      /* 
23290 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  Get an EXCLUSIVE
232a0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
232b0 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74  abase file. At t
232c0 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a  his point it is.
232d0 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61        ** importa
232e0 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56  nt that a RESERV
232f0 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f  ED lock is not o
23300 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77  btained on the w
23310 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ay to the.      
23320 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
23330 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61  k. If it were, a
23340 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
23350 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20  ight open the.  
23360 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
23370 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65  file, detect the
23380 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
23390 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61  and conclude tha
233a0 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  t the.      ** d
233b0 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20  atabase is safe 
233c0 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68  to read while th
233d0 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  is process is st
233e0 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20  ill rolling the 
233f0 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f  .      ** hot-jo
23400 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20  urnal back..    
23410 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42    ** .      ** B
23420 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72  ecause the inter
23430 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44  mediate RESERVED
23440 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71   lock is not req
23450 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20  uested, any.    
23460 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65    ** other proce
23470 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  ss attempting to
23480 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
23490 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67  base file will g
234a0 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  et to .      ** 
234b0 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68  this point in th
234c0 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20  e code and fail 
234d0 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77  to obtain its ow
234e0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
234f0 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68   .      ** on th
23500 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
23510 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
23520 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
23530 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  e<EXCLUSIVE_LOCK
23540 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
23550 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
23560 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55  Pager->fd, EXCLU
23570 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
23580 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
23590 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
235a0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
235b0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
235c0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
235d0 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
235e0 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
235f0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
23600 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20  EXCLUSIVE;.     
23610 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4f 70   }. .      /* Op
23620 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
23630 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
23640 63 65 73 73 2e 20 54 68 69 73 20 69 73 20 62 65  cess. This is be
23650 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20  cause in .      
23660 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  ** exclusive-acc
23670 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c  ess mode the fil
23680 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
23690 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61  l be kept open a
236a0 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  nd.      ** poss
236b0 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20  ibly used for a 
236c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65  transaction late
236d0 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79  r on. On some sy
236e0 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20 20 20  stems, the.     
236f0 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65 28 29   ** OsTruncate()
23700 20 63 61 6c 6c 20 75 73 65 64 20 69 6e 20 65 78   call used in ex
23710 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
23720 6f 64 65 20 61 6c 73 6f 20 72 65 71 75 69 72 65  ode also require
23730 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 72 65 61  s.      ** a rea
23740 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68 61 6e  d/write file han
23750 64 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  dle..      */.  
23760 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
23770 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
23780 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b          int res;
23790 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
237a0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
237b0 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  fs,pPager->zJour
237c0 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43 43 45 53  nal,SQLITE_ACCES
237d0 53 5f 45 58 49 53 54 53 2c 26 72 65 73 29 3b 0a  S_EXISTS,&res);.
237e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
237f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23800 20 20 20 20 20 20 20 69 66 28 20 72 65 73 20 29         if( res )
23810 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
23820 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
23830 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
23840 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
23850 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
23860 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
23870 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
23880 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
23890 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20  pFile );.       
238a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
238b0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
238c0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
238d0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20  pPager->jfd, f, 
238e0 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  &fout);.        
238f0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
23900 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
23910 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
23920 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
23930 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23940 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45  K && fout&SQLITE
23950 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29  _OPEN_READONLY )
23960 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
23970 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
23980 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  OPEN;.          
23990 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
239a0 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
239b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
239c0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
239d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
239e0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f  f the journal do
239f0 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74  es not exist, it
23a00 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74   usually means t
23a10 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20  hat some .      
23a20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63        ** other c
23a30 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65  onnection manage
23a40 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64 20  d to get in and 
23a50 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65 66  roll it back bef
23a60 6f 72 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  ore .           
23a70 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   ** this connect
23a80 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65  ion obtained the
23a90 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
23aa0 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20  above. Or, it . 
23ab0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 61             ** ma
23ac0 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20  y mean that the 
23ad0 70 61 67 65 72 20 77 61 73 20 69 6e 20 74 68 65  pager was in the
23ae0 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65   error-state whe
23af0 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  n this.         
23b00 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77     ** function w
23b10 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68  as called and th
23b20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
23b30 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 20  oes not exist.  
23b40 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  */.            r
23b50 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
23b60 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
23b70 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
23b80 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
23b90 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
23ba0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
23bb0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
23bc0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
23bd0 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 79 20     /* TODO: Why 
23be0 61 72 65 20 74 68 65 73 65 20 63 6c 65 61 72 65  are these cleare
23bf0 64 20 68 65 72 65 3f 20 49 73 20 69 74 20 6e 65  d here? Is it ne
23c00 63 65 73 73 61 72 79 3f 20 2a 2f 0a 20 20 20 20  cessary? */.    
23c10 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
23c20 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
23c30 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
23c40 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
23c50 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
23c60 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ter = 0;.      p
23c70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
23c80 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20 2f  r = 0;. .      /
23c90 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64  * Playback and d
23ca0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
23cb0 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74  l.  Drop the dat
23cc0 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20  abase write.    
23cd0 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65    ** lock and re
23ce0 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
23cf0 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65   lock. Purge the
23d00 20 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20   cache before.  
23d10 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62      ** playing b
23d20 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72  ack the hot-jour
23d30 6e 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64  nal so that we d
23d40 6f 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74 68  on't end up with
23d50 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63  .      ** an inc
23d60 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e  onsistent cache.
23d70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
23d80 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
23d90 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
23da0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
23db0 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31  ayback(pPager, 1
23dc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
23dd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
23de0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
23df0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
23e00 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
23e10 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
23e20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23e30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
23e40 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
23e50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20  AGER_SHARED).   
23e60 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67          || (pPag
23e70 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
23e80 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61  e && pPager->sta
23e90 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29  te>PAGER_SHARED)
23ea0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
23eb0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
23ec0 3e 70 42 61 63 6b 75 70 20 7c 7c 20 73 71 6c 69  >pBackup || sqli
23ed0 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
23ee0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
23ef0 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f  he)>0 ){.      /
23f00 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63  * The shared-loc
23f10 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  k has just been 
23f20 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20  acquired on the 
23f30 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
23f40 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65      ** and there
23f50 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67   are already pag
23f60 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  es in the cache 
23f70 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73  (from a previous
23f80 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f  .      ** read o
23f90 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
23fa0 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20  ion).  Check to 
23fb0 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62  see if the datab
23fc0 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ase.      ** has
23fd0 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
23fe0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
23ff0 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c   has changed, fl
24000 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ush the.      **
24010 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a   cache..      **
24020 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61  .      ** Databa
24030 73 65 20 63 68 61 6e 67 65 73 20 69 73 20 64 65  se changes is de
24040 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e  tected by lookin
24050 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65  g at 15 bytes be
24060 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a  ginning.      **
24070 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e   at offset 24 in
24080 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  to the file.  Th
24090 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65  e first 4 of the
240a0 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a  se 16 bytes are.
240b0 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69        ** a 32-bi
240c0 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69  t counter that i
240d0 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69  s incremented wi
240e0 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20  th each change. 
240f0 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74   The.      ** ot
24100 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65  her bytes change
24110 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65   randomly with e
24120 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20  ach file change 
24130 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20  when.      ** a 
24140 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e  codec is in use.
24150 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
24160 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76   ** There is a v
24170 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c  anishingly small
24180 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63   chance that a c
24190 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62  hange will not b
241a0 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65  e .      ** dete
241b0 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63  cted.  The chanc
241c0 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74  e of an undetect
241d0 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20  ed change is so 
241e0 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20  small that.     
241f0 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65   ** it can be ne
24200 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a  glected..      *
24210 2f 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46  /.      char dbF
24220 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70  ileVers[sizeof(p
24230 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
24240 73 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  s)];.      sqlit
24250 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
24260 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 0a 20 20  (pPager, 0);..  
24270 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
24280 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20  errCode ){.     
24290 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
242a0 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 20  errCode;.       
242b0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
242c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
242d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
242e0 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 20 20  izeValid );.    
242f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
24300 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Size>0 ){.      
24310 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45    IOTRACE(("CKVE
24320 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RS %p %d\n", pPa
24330 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ger, sizeof(dbFi
24340 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20  leVers)));.     
24350 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
24360 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
24370 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73  , &dbFileVers, s
24380 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
24390 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20  ), 24);.        
243a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
243b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
243c0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
243d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
243e0 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
243f0 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c  t(dbFileVers, 0,
24400 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
24410 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  rs));.      }.. 
24420 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28       if( memcmp(
24430 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
24440 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
24450 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
24460 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  s))!=0 ){.      
24470 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
24480 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
24490 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
244a0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
244b0 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
244c0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
244d0 48 41 52 45 44 20 29 3b 0a 20 20 7d 0a 0a 20 66  HARED );.  }.. f
244e0 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21  ailed:.  if( rc!
244f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24500 20 20 2f 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63    /* pager_unloc
24510 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  k() is a no-op f
24520 6f 72 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  or exclusive mod
24530 65 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20  e and in-memory 
24540 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20  databases. */.  
24550 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
24560 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  Pager);.  }.  re
24570 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
24580 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e  * If the referen
24590 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61  ce count has rea
245a0 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62  ched zero, rollb
245b0 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a  ack any active.*
245c0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
245d0 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67  d unlock the pag
245e0 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  er..**.** Except
245f0 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  , in locking_mod
24600 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e  e=EXCLUSIVE when
24610 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e   there is nothin
24620 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72  g to in.** the r
24630 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
24640 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e   the unlock is n
24650 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64  ot performed and
24660 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74   there is.** not
24670 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  hing to rollback
24680 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  , so this routin
24690 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
246a0 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61   .static void pa
246b0 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
246c0 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  d(Pager *pPager)
246d0 7b 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65 33  {.  if( (sqlite3
246e0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
246f0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
24700 3d 30 29 0a 20 20 20 26 26 20 28 21 70 50 61 67  =0).   && (!pPag
24710 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
24720 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e || pPager->jou
24730 72 6e 61 6c 4f 66 66 3e 30 29 20 0a 20 20 29 7b  rnalOff>0) .  ){
24740 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
24750 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
24760 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
24770 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 66 65  * Acquire a refe
24780 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75  rence to page nu
24790 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67  mber pgno in pag
247a0 65 72 20 70 50 61 67 65 72 20 28 61 20 70 61 67  er pPager (a pag
247b0 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68  e.** reference h
247c0 61 73 20 74 79 70 65 20 44 62 50 61 67 65 2a 29  as type DbPage*)
247d0 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
247e0 65 64 20 72 65 66 65 72 65 6e 63 65 20 69 73 20  ed reference is 
247f0 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79  .** successfully
24800 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73   obtained, it is
24810 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61   copied to *ppPa
24820 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ge and SQLITE_OK
24830 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
24840 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
24850 64 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  d page is alread
24860 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  y in the cache, 
24870 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  it is returned. 
24880 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
24890 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74   new page object
248a0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
248b0 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
248c0 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72   data.** read fr
248d0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
248e0 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61  file. In some ca
248f0 73 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20  ses, the pcache 
24900 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68  module may.** ch
24910 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f  oose not to allo
24920 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
24930 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72  object and may r
24940 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  euse an existing
24950 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20  .** object with 
24960 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
24970 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a  eferences..**.**
24980 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20   The extra data 
24990 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61  appended to a pa
249a0 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69  ge is always ini
249b0 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f  tialized to zero
249c0 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20  s the .** first 
249d0 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c  time a page is l
249e0 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72  oaded into memor
249f0 79 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72  y. If the page r
24a00 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20  equested is .** 
24a10 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
24a20 61 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66  ache when this f
24a30 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
24a40 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72  d, then the extr
24a50 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66  a.** data is lef
24a60 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e  t as it was when
24a70 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74   the page object
24a80 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a   was last used..
24a90 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
24aa0 61 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73  abase image is s
24ab0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
24ac0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f  requested page o
24ad0 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a  r if a .** non-z
24ae0 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73  ero value is pas
24af0 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e  sed as the noCon
24b00 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61  tent parameter a
24b10 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65  nd the .** reque
24b20 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
24b30 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20   already stored 
24b40 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68  in the cache, th
24b50 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c  en no .** actual
24b60 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72   disk read occur
24b70 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
24b80 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
24b90 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   of the .** page
24ba0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
24bb0 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a  to all zeros. .*
24bc0 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  *.** If noConten
24bd0 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65  t is true, it me
24be0 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
24bf0 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ot care about th
24c00 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66  e contents.** of
24c10 20 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20   the page. This 
24c20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73 65  occurs in two se
24c30 70 65 72 61 74 65 20 73 63 65 6e 61 72 69 6f 73  perate scenarios
24c40 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65  :.**.**   a) Whe
24c50 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72 65 65  n reading a free
24c60 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
24c70 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
24c80 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62  e, and.**.**   b
24c90 29 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69  ) When a savepoi
24ca0 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  nt is being roll
24cb0 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e  ed back and we n
24cc0 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20  eed to load.**  
24cd0 20 20 20 20 61 20 6e 65 77 20 70 61 67 65 20 69      a new page i
24ce0 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f  nto the cache to
24cf0 20 70 6f 70 75 6c 61 74 65 20 77 69 74 68 20 74   populate with t
24d00 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20  he data read.** 
24d10 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61       from the sa
24d20 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e  vepoint journal.
24d30 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  .**.** If noCont
24d40 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  ent is true, the
24d50 6e 20 74 68 65 20 64 61 74 61 20 72 65 74 75 72  n the data retur
24d60 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e  ned is zeroed in
24d70 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e  stead of.** bein
24d80 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  g read from the 
24d90 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69  database. Additi
24da0 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73  onally, the bits
24db0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
24dc0 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67  * to pgno in Pag
24dd0 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62  er.pInJournal (b
24de0 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61  itvec of pages a
24df0 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e 20 74  lready written t
24e00 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  o the.** journal
24e10 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50   file) and the P
24e20 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
24e30 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65  nSavepoint bitve
24e40 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a  cs of any open.*
24e50 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  * savepoints are
24e60 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73   set. This means
24e70 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
24e80 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 61 74  made writable at
24e90 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e   any.** point in
24ea0 20 74 68 65 20 66 75 74 75 72 65 2c 20 75 73 69   the future, usi
24eb0 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  ng a call to sql
24ec0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
24ed0 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  , its contents.*
24ee0 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f  * will not be jo
24ef0 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61  urnaled. This sa
24f00 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68  ves IO..**.** Th
24f10 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
24f20 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
24f30 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
24f40 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
24f50 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
24f60 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
24f70 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
24f80 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
24f90 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
24fa0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
24fb0 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69  kup().  Both thi
24fc0 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f  s routine and Lo
24fd0 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
24fe0 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
24ff0 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
25000 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
25010 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
25020 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
25030 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
25040 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
25050 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
25060 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28   whereas Lookup(
25070 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e  ).** just return
25080 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69  s 0.  This routi
25090 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65  ne acquires a re
250a0 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73  ad-lock the firs
250b0 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73  t time it.** has
250c0 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20   to go to disk, 
250d0 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70  and could also p
250e0 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a  layback an old j
250f0 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
25100 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f  ary..** Since Lo
25110 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65  okup() never goe
25120 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65  s to disk, it ne
25130 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20  ver has to deal 
25140 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72  with locks.** or
25150 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
25160 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
25170 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61  gerAcquire(.  Pa
25180 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
25190 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
251a0 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
251b0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
251c0 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
251d0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
251e0 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44   to fetch */.  D
251f0 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  bPage **ppPage, 
25200 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f     /* Write a po
25210 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
25220 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
25230 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20  noContent       
25240 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72  /* Do not bother
25250 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74   reading content
25260 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72   from disk if tr
25270 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ue */.){.  int r
25280 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
25290 0a 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ..  assert( asse
252a0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
252b0 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
252c0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
252d0 65 3e 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  e>PAGER_UNLOCK )
252e0 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  ;..  if( pgno==0
252f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
25300 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
25310 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  PT;.  }..  /* If
25320 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
25330 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
25340 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
25350 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a  r immediately. .
25360 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
25370 72 65 71 75 65 73 74 20 74 68 65 20 70 61 67 65  request the page
25380 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63 68 65   from the PCache
25390 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28   layer. */.  if(
253a0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
253b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  !=SQLITE_OK && p
253c0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
253d0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
253e0 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
253f0 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65  errCode;.  }else
25400 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
25410 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
25420 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
25430 67 6e 6f 2c 20 31 2c 20 70 70 50 61 67 65 29 3b  gno, 1, ppPage);
25440 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
25450 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25460 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 63   /* Either the c
25470 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63  all to sqlite3Pc
25480 61 63 68 65 46 65 74 63 68 28 29 20 72 65 74 75  acheFetch() retu
25490 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f 72  rned an error or
254a0 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
254b0 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 69 6e  r was already in
254c0 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65   the error-state
254d0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
254e0 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a  ion was called..
254f0 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20 74      ** Set pPg t
25500 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20  o 0 and jump to 
25510 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68 61  the exception ha
25520 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70  ndler.  */.    p
25530 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  Pg = 0;.    goto
25540 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
25550 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rr;.  }.  assert
25560 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e  ( (*ppPage)->pgn
25570 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  o==pgno );.  ass
25580 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e  ert( (*ppPage)->
25590 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c  pPager==pPager |
255a0 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61  | (*ppPage)->pPa
255b0 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  ger==0 );..  if(
255c0 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67   (*ppPage)->pPag
255d0 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  er ){.    /* In 
255e0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70 63  this case the pc
255f0 61 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e  ache already con
25600 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c  tains an initial
25610 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20  ized copy of.   
25620 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65   ** the page. Re
25630 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72  turn without fur
25640 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20  ther ado.  */.  
25650 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
25660 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26  PAGER_MAX_PGNO &
25670 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  & pgno!=PAGER_MJ
25680 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
25690 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28  .    PAGER_INCR(
256a0 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20  pPager->nHit);. 
256b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
256c0 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20  _OK;..  }else{. 
256d0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
256e0 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74 65  cache has create
256f0 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74  d a new page. It
25700 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20  s content needs 
25710 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e  to .    ** be in
25720 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 20  itialized.  */. 
25730 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 0a 20 20     int nMax;..  
25740 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
25750 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20  ger->nMiss);.   
25760 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65 3b 0a   pPg = *ppPage;.
25770 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20      pPg->pPager 
25780 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f  = pPager;..    /
25790 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  * The maximum pa
257a0 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33  ge number is 2^3
257b0 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  1. Return SQLITE
257c0 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61  _CORRUPT if a pa
257d0 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  ge.    ** number
257e0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
257f0 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75 73 65  is, or the unuse
25800 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20  d locking-page, 
25810 69 73 20 72 65 71 75 65 73 74 65 64 2e 20 2a 2f  is requested. */
25820 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41  .    if( pgno>PA
25830 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20  GER_MAX_PGNO || 
25840 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
25850 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
25860 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25870 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
25880 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
25890 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
258a0 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   }..    rc = sql
258b0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
258c0 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 4d 61 78  nt(pPager, &nMax
258d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
258e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
258f0 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
25900 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  uire_err;.    }.
25910 0a 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69  .    if( nMax<(i
25920 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42  nt)pgno || MEMDB
25930 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b   || noContent ){
25940 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  .      if( pgno>
25950 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
25960 7b 0a 09 72 63 20 3d 20 53 51 4c 49 54 45 5f 46  {..rc = SQLITE_F
25970 55 4c 4c 3b 0a 09 67 6f 74 6f 20 70 61 67 65 72  ULL;..goto pager
25980 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
25990 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
259a0 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
259b0 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20       /* Failure 
259c0 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20  to set the bits 
259d0 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c  in the InJournal
259e0 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20   bit-vectors is 
259f0 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20  benign..        
25a00 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61  ** It merely mea
25a10 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 68 74  ns that we might
25a20 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77   do some extra w
25a30 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61  ork to journal a
25a40 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67   .        ** pag
25a50 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
25a60 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e  need to be journ
25a70 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c  aled.  Neverthel
25a80 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20  ess, be sure .  
25a90 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74        ** to test
25aa0 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20   the case where 
25ab0 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  a malloc error o
25ac0 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
25ad0 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20  ng to set .     
25ae0 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61     ** a bit in a
25af0 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20   bit vector..   
25b00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
25b10 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
25b20 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
25b30 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50      if( pgno<=pP
25b40 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
25b50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45   ){.          TE
25b60 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73  STONLY( rc = ) s
25b70 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
25b80 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
25b90 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  al, pgno);.     
25ba0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
25bb0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
25bc0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
25bd0 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
25be0 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70  c = ) addToSavep
25bf0 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
25c00 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  er, pgno);.     
25c10 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
25c20 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
25c30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25c40 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
25c50 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
25c60 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
25c70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50  Pg->pData, 0, pP
25c80 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
25c90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 49  .      }.      I
25ca0 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70  OTRACE(("ZERO %p
25cb0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
25cc0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73  pgno));.    }els
25cd0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
25ce0 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
25cf0 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20 72 63  ager );.      rc
25d00 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50   = readDbPage(pP
25d10 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
25d20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
25d30 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
25d40 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
25d50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
25d60 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
25d70 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e  _PAGES.    pPg->
25d80 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
25d90 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
25da0 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65  #endif.  }..  re
25db0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
25dc0 0a 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65  .pager_acquire_e
25dd0 72 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63  rr:.  assert( rc
25de0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
25df0 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
25e00 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f  sqlite3PcacheDro
25e10 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61  p(pPg);.  }.  pa
25e20 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
25e30 64 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70  d(pPager);..  *p
25e40 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74  pPage = 0;.  ret
25e50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
25e60 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20   Acquire a page 
25e70 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
25e80 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
25e90 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20  y cache.  Do.** 
25ea0 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67  not read the pag
25eb0 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65  e from disk.  Re
25ec0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
25ed0 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f  o the page,.** o
25ee0 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20  r 0 if the page 
25ef0 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e  is not in cache.
25f00 20 41 6c 73 6f 2c 20 72 65 74 75 72 6e 20 30 20   Also, return 0 
25f10 69 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 72  if the .** pager
25f20 20 69 73 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c   is in PAGER_UNL
25f30 4f 43 4b 20 73 74 61 74 65 20 77 68 65 6e 20 74  OCK state when t
25f40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
25f50 63 61 6c 6c 65 64 2c 0a 2a 2a 20 6f 72 20 69 66  called,.** or if
25f60 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
25f70 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   an error state 
25f80 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
25f90 45 5f 46 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  E_FULL..**.** Se
25fa0 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
25fb0 67 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64  gerGet().  The d
25fc0 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
25fd0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
25fe0 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67  * and sqlite3Pag
25ff0 65 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20  erGet() is that 
26000 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74  _get() will go t
26010 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72  o the disk and r
26020 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61  ead.** in the pa
26030 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ge if the page i
26040 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e  s not already in
26050 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f   cache.  This ro
26060 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
26070 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67   NULL if the pag
26080 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
26090 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49  e or if a disk I
260a0 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73  /O error .** has
260b0 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a   ever happened..
260c0 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74  */.DbPage *sqlit
260d0 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61  e3PagerLookup(Pa
260e0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
260f0 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
26100 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 61 73 73   *pPg = 0;.  ass
26110 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
26120 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
26130 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
26140 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
26150 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
26160 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3e   pPager->state >
26170 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b   PAGER_UNLOCK );
26180 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
26190 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
261a0 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20  Cache, pgno, 0, 
261b0 26 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  &pPg);.  return 
261c0 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  pPg;.}../*.** Re
261d0 6c 65 61 73 65 20 61 20 70 61 67 65 20 72 65 66  lease a page ref
261e0 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  erence..**.** If
261f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
26200 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
26210 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65   page drop to ze
26220 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ro, then the.** 
26230 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f  page is added to
26240 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20   the LRU list.  
26250 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e  When all referen
26260 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73  ces to all pages
26270 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64  .** are released
26280 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  , a rollback occ
26290 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  urs and the lock
262a0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
262b0 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a   is.** removed..
262c0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
262d0 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65  agerUnref(DbPage
262e0 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
262f0 67 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a  g ){.    Pager *
26300 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
26310 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  ager;.    sqlite
26320 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70  3PcacheRelease(p
26330 50 67 29 3b 0a 20 20 20 20 70 61 67 65 72 55 6e  Pg);.    pagerUn
26340 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61  lockIfUnused(pPa
26350 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ger);.  }.}../*.
26360 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20 6a  ** If the main j
26370 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
26380 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
26390 6e 65 64 2c 20 65 6e 73 75 72 65 20 74 68 61 74  ned, ensure that
263a0 20 74 68 65 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72   the.** sub-jour
263b0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
263c0 20 74 6f 6f 2e 20 49 66 20 74 68 65 20 6d 61 69   too. If the mai
263d0 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  n journal is not
263e0 20 6f 70 65 6e 2c 0a 2a 2a 20 74 68 69 73 20 66   open,.** this f
263f0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
26400 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  op..**.** SQLITE
26410 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
26420 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f  if everything go
26430 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  es according to 
26440 70 6c 61 6e 2e 20 0a 2a 2a 20 41 6e 20 53 51 4c  plan. .** An SQL
26450 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72  ITE_IOERR_XXX er
26460 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
26470 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74  rned if a call t
26480 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 4f  o .** sqlite3OsO
26490 70 65 6e 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  pen() fails..*/.
264a0 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53  static int openS
264b0 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ubJournal(Pager 
264c0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
264d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
264e0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
264f0 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73  ger->jfd) && !is
26500 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
26510 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  d) ){.    if( pP
26520 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
26530 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
26540 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70  MODE_MEMORY || p
26550 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d  Pager->subjInMem
26560 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ory ){.      sql
26570 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70  ite3MemJournalOp
26580 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
26590 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
265a0 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65     rc = pagerOpe
265b0 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50  ntemp(pPager, pP
265c0 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49  ager->sjfd, SQLI
265d0 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
265e0 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  AL);.    }.  }. 
265f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
26600 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
26610 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20  on is called at 
26620 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 76 65  the start of eve
26630 72 79 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  ry write transac
26640 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d  tion..** There m
26650 75 73 74 20 61 6c 72 65 61 64 79 20 62 65 20 61  ust already be a
26660 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
26670 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
26680 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
26690 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  file when this r
266a0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
266b0 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ..**.** Open the
266c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
266d0 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20 61  r pager pPager a
266e0 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e  nd write a journ
266f0 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20  al header.** to 
26700 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e  the start of it.
26710 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63   If there are ac
26720 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c  tive savepoints,
26730 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f   open the sub-jo
26740 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c  urnal.** as well
26750 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
26760 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65  is only used whe
26770 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
26780 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20  le is being .** 
26790 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20  opened to write 
267a0 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66  a rollback log f
267b0 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
267c0 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64  . It is not used
267d0 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e   .** when openin
267e0 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  g a hot journal 
267f0 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  file to roll it 
26800 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
26810 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
26820 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  is already open 
26830 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e  (as it may be in
26840 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29   exclusive mode)
26850 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66  ,.** then this f
26860 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69  unction just wri
26870 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65  tes a journal he
26880 61 64 65 72 20 74 6f 20 74 68 65 20 73 74 61 72  ader to the star
26890 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65  t of the.** alre
268a0 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a  ady open file. .
268b0 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
268c0 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c   not the journal
268d0 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
268e0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
268f0 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70  , the.** Pager.p
26900 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
26910 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
26920 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52  located..**.** R
26930 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
26940 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
26950 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68   successful. Oth
26960 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a  erwise, return .
26970 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
26980 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  if the attempt t
26990 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72  o allocate Pager
269a0 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c  .pInJournal fail
269b0 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20  s, or .** an IO 
269c0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70  error code if op
269d0 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ening or writing
269e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
269f0 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  e fails..*/.stat
26a00 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65  ic int pager_ope
26a10 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  n_journal(Pager 
26a20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
26a30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
26a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a50 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
26a60 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
26a70 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
26a80 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
26a90 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  fs;   /* Local c
26aa0 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e  ache of vfs poin
26ab0 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
26ac0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
26ad0 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
26ae0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
26af0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
26b00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
26b10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
26b20 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
26b30 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20 61 73 73  ODE_OFF );.  ass
26b40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
26b50 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
26b60 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79  .  /* If already
26b70 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
26b80 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ate, this functi
26b90 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  on is a no-op.  
26ba0 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20  But on.  ** the 
26bb0 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73  other hand, this
26bc0 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
26bd0 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61  r called if we a
26be0 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20  re already in.  
26bf0 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  ** an error stat
26c00 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  e. */.  if( NEVE
26c10 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
26c20 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67  e) ) return pPag
26c30 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
26c40 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 72  /* TODO: Is it r
26c50 65 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 74  eally possible t
26c60 6f 20 67 65 74 20 68 65 72 65 20 77 69 74 68 20  o get here with 
26c70 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 3f 20  dbSizeValid==0? 
26c80 49 66 20 6e 6f 74 2c 0a 20 20 2a 2a 20 74 68 65  If not,.  ** the
26c90 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72 50 61   call to PagerPa
26ca0 67 65 63 6f 75 6e 74 28 29 20 63 61 6e 20 62 65  gecount() can be
26cb0 20 72 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20   removed..  */. 
26cc0 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
26cd0 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d  r->dbSizeValid==
26ce0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  0 );.  sqlite3Pa
26cf0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
26d00 67 65 72 2c 20 30 29 3b 0a 0a 20 20 70 50 61 67  ger, 0);..  pPag
26d10 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
26d20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
26d30 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53  eate(pPager->dbS
26d40 69 7a 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ize);.  if( pPag
26d50 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
26d60 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
26d70 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
26d80 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  }..  /* Open the
26d90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
26da0 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
26db0 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 69 66  dy open. */.  if
26dc0 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
26dd0 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66  ->jfd) ){.    if
26de0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
26df0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
26e00 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
26e10 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
26e20 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70  MemJournalOpen(p
26e30 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
26e40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
26e50 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
26e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e70 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 74    /* VFS flags t
26e80 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66  o open journal f
26e90 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  ile */.        S
26ea0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
26eb0 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
26ec0 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20  _CREATE|.       
26ed0 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   (pPager->tempFi
26ee0 6c 65 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20  le ? .          
26ef0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c  (SQLITE_OPEN_DEL
26f00 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54  ETEONCLOSE|SQLIT
26f10 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
26f20 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20 20 20 20  NAL):.          
26f30 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  (SQLITE_OPEN_MAI
26f40 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20  N_JOURNAL).     
26f50 20 20 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c     );.#ifdef SQL
26f60 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
26f70 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 72 63  C_WRITE.      rc
26f80 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61   = sqlite3Journa
26f90 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20 20  lOpen(.         
26fa0 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a   pVfs, pPager->z
26fb0 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
26fc0 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e  >jfd, flags, jrn
26fd0 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
26fe0 65 72 29 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c  er).      );.#el
26ff0 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  se.      rc = sq
27000 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
27010 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
27020 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
27030 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64   flags, 0);.#end
27040 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  if.    }.    ass
27050 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
27060 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
27070 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 7d  ger->jfd) );.  }
27080 0a 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  ...  /* Write th
27090 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
270a0 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f  header to the jo
270b0 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f  urnal file and o
270c0 70 65 6e 20 0a 20 20 2a 2a 20 74 68 65 20 73 75  pen .  ** the su
270d0 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  b-journal if nec
270e0 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69  essary..  */.  i
270f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27100 20 29 7b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a   ){.    /* TODO:
27110 20 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66   Check if all of
27120 20 74 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c   these are reall
27130 79 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  y required. */. 
27140 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69     pPager->dbOri
27150 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  gSize = pPager->
27160 64 62 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67  dbSize;.    pPag
27170 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
27180 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ed = 0;.    pPag
27190 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
271a0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
271b0 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ec = 0;.    pPag
271c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
271d0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
271e0 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
271f0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
27200 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 72  alHdr = 0;.    r
27210 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
27220 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  Hdr(pPager);.  }
27230 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
27240 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
27250 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  nSavepoint ){.  
27260 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f    rc = openSubJo
27270 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
27280 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51   }..  if( rc!=SQ
27290 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
272a0 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
272b0 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
272c0 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61  ournal);.    pPa
272d0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
272e0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
272f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  n rc;.}../*.** B
27300 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61  egin a write-tra
27310 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
27320 73 70 65 63 69 66 69 65 64 20 70 61 67 65 72 20  specified pager 
27330 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a  object. If a .**
27340 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
27350 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
27360 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73  een opened, this
27370 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
27380 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  o-op..**.** If t
27390 68 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65  he exFlag argume
273a0 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  nt is false, the
273b0 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61  n acquire at lea
273c0 73 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a  st a RESERVED.**
273d0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
273e0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65  abase file. If e
273f0 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74  xFlag is true, t
27400 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c  hen acquire at l
27410 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55  east.** an EXCLU
27420 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75  SIVE lock. If su
27430 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72  ch a lock is alr
27440 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f  eady held, no lo
27450 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69  cking .** functi
27460 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c  ons need be call
27470 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ed..**.** If thi
27480 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f  s is not a tempo
27490 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72  rary or in-memor
274a0 79 20 66 69 6c 65 20 61 6e 64 2c 20 74 68 65 20  y file and, the 
274b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
274c0 0a 2a 2a 20 6f 70 65 6e 65 64 20 69 66 20 69 74  .** opened if it
274d0 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
274e0 72 65 61 64 79 2e 20 46 6f 72 20 61 20 74 65 6d  ready. For a tem
274f0 70 6f 72 61 72 79 20 66 69 6c 65 2c 20 74 68 65  porary file, the
27500 20 6f 70 65 6e 69 6e 67 20 0a 2a 2a 20 6f 66 20   opening .** of 
27510 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
27520 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
27530 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e 20 61  il there is an a
27540 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 0a 2a  ctual need to .*
27550 2a 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  * write to the j
27560 6f 75 72 6e 61 6c 2e 20 54 4f 44 4f 3a 20 57 68  ournal. TODO: Wh
27570 79 20 68 61 6e 64 6c 65 20 74 65 6d 70 6f 72 61  y handle tempora
27580 72 79 20 66 69 6c 65 73 20 64 69 66 66 65 72 65  ry files differe
27590 6e 74 6c 79 3f 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ntly?.**.** If t
275a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
275b0 69 73 20 6f 70 65 6e 65 64 20 28 6f 72 20 69 66  is opened (or if
275c0 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f   it is already o
275d0 70 65 6e 29 2c 20 74 68 65 6e 20 61 0a 2a 2a 20  pen), then a.** 
275e0 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
275f0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
27600 20 73 74 61 72 74 20 6f 66 20 69 74 2e 0a 2a 2a   start of it..**
27610 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49  .** If the subjI
27620 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74  nMemory argument
27630 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
27640 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e  en any sub-journ
27650 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74  al opened.** wit
27660 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
27670 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65  tion will be ope
27680 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d  ned as an in-mem
27690 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a  ory file. This.*
276a0 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20  * has no effect 
276b0 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  if the sub-journ
276c0 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  al is already op
276d0 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79 20  ened (as it may 
276e0 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69  be when.** runni
276f0 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
27700 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65 20  mode) or if the 
27710 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73  transaction does
27720 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a   not require a.*
27730 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49  * sub-journal. I
27740 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f  f the subjInMemo
27750 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a  ry argument is z
27760 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65  ero, then any re
27770 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f  quired.** sub-jo
27780 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65  urnal is impleme
27790 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69  nted in-memory i
277a0 66 20 70 50 61 67 65 72 20 69 73 20 61 6e 20 69  f pPager is an i
277b0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
277c0 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20  e, .** or using 
277d0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
277e0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
277f0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42  nt sqlite3PagerB
27800 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  egin(Pager *pPag
27810 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20  er, int exFlag, 
27820 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  int subjInMemory
27830 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
27840 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
27850 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
27860 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
27870 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a  ;.  pPager->subj
27880 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73  InMemory = (u8)s
27890 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 20 20 69  ubjInMemory;.  i
278a0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
278b0 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  ==PAGER_SHARED )
278c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
278d0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
278e0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
278f0 74 28 20 21 4d 45 4d 44 42 20 26 26 20 21 70 50  t( !MEMDB && !pP
27900 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
27910 3b 0a 0a 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e  ;..    /* Obtain
27920 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
27930 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
27940 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78   file. If the ex
27950 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20  Flag parameter. 
27960 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74     ** is true, t
27970 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  hen immediately 
27980 75 70 67 72 61 64 65 20 74 68 69 73 20 74 6f 20  upgrade this to 
27990 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
279a0 6b 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 62 75  k. The.    ** bu
279b0 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
279c0 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20  ack can be used 
279d0 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74  when upgrading t
279e0 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a  o the EXCLUSIVE.
279f0 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74      ** lock, but
27a00 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e   not when obtain
27a10 69 6e 67 20 74 68 65 20 52 45 53 45 52 56 45 44  ing the RESERVED
27a20 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   lock..    */.  
27a30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
27a40 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
27a50 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b   RESERVED_LOCK);
27a60 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
27a70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27a80 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
27a90 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a  PAGER_RESERVED;.
27aa0 20 20 20 20 20 20 69 66 28 20 65 78 46 6c 61 67        if( exFlag
27ab0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
27ac0 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
27ad0 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
27ae0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
27af0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
27b00 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75 69 72  /* If the requir
27b10 65 64 20 6c 6f 63 6b 73 20 77 65 72 65 20 73 75  ed locks were su
27b20 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69  ccessfully obtai
27b30 6e 65 64 2c 20 6f 70 65 6e 20 74 68 65 20 6a 6f  ned, open the jo
27b40 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
27b50 65 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20  e and write the 
27b60 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
27b70 61 64 65 72 20 74 6f 20 69 74 2e 0a 20 20 20 20  ader to it..    
27b80 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
27b90 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
27ba0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
27bb0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
27bc0 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20  DE_OFF ){.      
27bd0 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
27be0 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
27bf0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
27c00 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
27c10 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72  ->jfd) && pPager
27c20 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
27c30 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
27c40 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68 65 20  appens when the 
27c50 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 78 63  pager was in exc
27c60 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
27c70 64 65 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20  de the last.    
27c80 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64 20  ** time a (read 
27c90 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73 61  or write) transa
27ca0 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73  ction was succes
27cb0 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64  sfully concluded
27cc0 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20  .    ** by this 
27cd0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74  connection. Inst
27ce0 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20  ead of deleting 
27cf0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
27d00 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20   it was .    ** 
27d10 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 65 69  kept open and ei
27d20 74 68 65 72 20 77 61 73 20 74 72 75 6e 63 61 74  ther was truncat
27d30 65 64 20 74 6f 20 30 20 62 79 74 65 73 20 6f 72  ed to 0 bytes or
27d40 20 69 74 73 20 68 65 61 64 65 72 20 77 61 73 0a   its header was.
27d50 20 20 20 20 2a 2a 20 6f 76 65 72 77 72 69 74 74      ** overwritt
27d60 65 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  en with zeros.. 
27d70 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
27d80 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d  ( pPager->nRec==
27d90 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
27da0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
27db0 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ize==0 );.    as
27dc0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
27dd0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
27de0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
27df0 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
27e00 72 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  r);.  }..  PAGER
27e10 54 52 41 43 45 28 28 22 54 52 41 4e 53 41 43 54  TRACE(("TRANSACT
27e20 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ION %d\n", PAGER
27e30 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
27e40 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
27e50 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20  pPager->jfd) || 
27e60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
27e70 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49  ff>0 || rc!=SQLI
27e80 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 72  TE_OK );.  if( r
27e90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
27ea0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
27eb0 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
27ec0 29 3b 0a 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65  );.    /* Ignore
27ed0 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 74 68   any IO error th
27ee0 61 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  at occurs within
27ef0 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
27f00 61 63 74 69 6f 6e 28 29 2e 20 54 68 65 0a 20 20  action(). The.  
27f10 20 20 2a 2a 20 70 75 72 70 6f 73 65 20 6f 66 20    ** purpose of 
27f20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20  this call is to 
27f30 72 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e  reset the intern
27f40 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  al state of the 
27f50 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 73 75 62  pager.    ** sub
27f60 2d 73 79 73 74 65 6d 2e 20 49 74 20 64 6f 65 73  -system. It does
27f70 6e 27 74 20 6d 61 74 74 65 72 20 69 66 20 74 68  n't matter if th
27f80 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69  e journal-file i
27f90 73 20 6e 6f 74 20 70 72 6f 70 65 72 6c 79 0a 20  s not properly. 
27fa0 20 20 20 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 20     ** finalized 
27fb0 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 28 73  at this point (s
27fc0 69 6e 63 65 20 69 74 20 69 73 20 6e 6f 74 20 61  ince it is not a
27fd0 20 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66   valid journal f
27fe0 69 6c 65 20 61 6e 79 77 61 79 29 2e 0a 20 20 20  ile anyway)..   
27ff0 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 65 6e   */.    pager_en
28000 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
28010 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  ager, 0);.  }.  
28020 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
28030 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c  .** Mark a singl
28040 65 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  e data page as w
28050 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61  riteable. The pa
28060 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
28070 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20  to the .** main 
28080 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a  journal or sub-j
28090 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72  ournal as requir
280a0 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ed. If the page 
280b0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  is written into.
280c0 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  ** one of the jo
280d0 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72  urnals, the corr
280e0 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
280f0 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20   set in the .** 
28100 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
28110 20 62 69 74 76 65 63 20 61 6e 64 20 74 68 65 20   bitvec and the 
28120 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
28130 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76  InSavepoint bitv
28140 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70  ecs.** of any op
28150 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73  en savepoints as
28160 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f   appropriate..*/
28170 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
28180 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70  r_write(PgHdr *p
28190 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61  Pg){.  void *pDa
281a0 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
281b0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
281c0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
281d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
281e0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  E_OK;..  /* If a
281f0 6e 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e  n error has been
28200 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65 74 65   previously dete
28210 63 74 65 64 2c 20 77 65 20 73 68 6f 75 6c 64 20  cted, we should 
28220 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 63 61 6c 6c  not be.  ** call
28230 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
28240 2e 20 20 52 65 70 65 61 74 20 74 68 65 20 65 72  .  Repeat the er
28250 72 6f 72 20 66 6f 72 20 72 6f 62 75 73 74 6e 65  ror for robustne
28260 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e  ss..  */.  if( N
28270 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
28280 43 6f 64 65 29 20 29 20 20 72 65 74 75 72 6e 20  Code) )  return 
28290 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
282a0 0a 0a 20 20 2f 2a 20 48 69 67 68 65 72 2d 6c 65  ..  /* Higher-le
282b0 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 6e 65 76  vel routines nev
282c0 65 72 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  er call this fun
282d0 63 74 69 6f 6e 20 69 66 20 64 61 74 61 62 61 73  ction if databas
282e0 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 77 72  e is not.  ** wr
282f0 69 74 61 62 6c 65 2e 20 20 42 75 74 20 63 68 65  itable.  But che
28300 63 6b 20 61 6e 79 77 61 79 2c 20 6a 75 73 74 20  ck anyway, just 
28310 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 2e 20  for robustness. 
28320 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
28330 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 29  Pager->readOnly)
28340 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
28350 5f 50 45 52 4d 3b 0a 0a 20 20 61 73 73 65 72 74  _PERM;..  assert
28360 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  ( !pPager->setMa
28370 73 74 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b  ster );..  CHECK
28380 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f  _PAGE(pPg);..  /
28390 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
283a0 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68  as dirty.  If th
283b0 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61  e page has alrea
283c0 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a  dy been written.
283d0 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72    ** to the jour
283e0 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  nal then we can 
283f0 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61  return right awa
28400 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  y..  */.  sqlite
28410 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
28420 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 61 67  (pPg);.  if( pag
28430 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20  eInJournal(pPg) 
28440 26 26 20 21 73 75 62 6a 52 65 71 75 69 72 65 73  && !subjRequires
28450 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20  Page(pPg) ){.   
28460 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
28470 69 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  ied = 1;.  }else
28480 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  {..    /* If we 
28490 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74  get this far, it
284a0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
284b0 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
284c0 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  .    ** written 
284d0 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  to the transacti
284e0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68  on journal or th
284f0 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e ckeckpoint jou
28500 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62  rnal.    ** or b
28510 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  oth..    **.    
28520 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74  ** First check t
28530 6f 20 73 65 65 20 74 68 61 74 20 74 68 65 20 74  o see that the t
28540 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
28550 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20  al exists and.  
28560 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69    ** create it i
28570 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20  f it does not.. 
28580 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
28590 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
285a0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
285b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
285c0 33 50 61 67 65 72 42 65 67 69 6e 28 70 50 61 67  3PagerBegin(pPag
285d0 65 72 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 73  er, 0, pPager->s
285e0 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 3b 0a 20 20  ubjInMemory);.  
285f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28600 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
28610 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
28620 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
28630 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
28640 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69  ESERVED );.    i
28650 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
28660 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65  r->jfd) && pPage
28670 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
28680 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
28690 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 61  E_OFF ){.      a
286a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
286b0 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  seJournal );.   
286c0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
286d0 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
286e0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
286f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
28700 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
28710 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64     pPager->dbMod
28720 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20  ified = 1;.  .  
28730 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
28740 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77  tion journal now
28750 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68   exists and we h
28760 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f  ave a RESERVED o
28770 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  r an.    ** EXCL
28780 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
28790 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
287a0 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
287b0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
287c0 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e  .    ** the tran
287d0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
287e0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
287f0 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
28800 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67 65  */.    if( !page
28810 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26  InJournal(pPg) &
28820 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
28830 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  >jfd) ){.      i
28840 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  f( pPg->pgno<=pP
28850 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
28860 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20   ){.        u32 
28870 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63  cksum;.        c
28880 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20  har *pData2;..  
28890 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75        /* We shou
288a0 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74  ld never write t
288b0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
288c0 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74  le the page that
288d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
288e0 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
288f0 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f  e locks.  The fo
28900 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76  llowing assert v
28910 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20  erifies.        
28920 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
28930 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  t. */.        as
28940 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21  sert( pPg->pgno!
28950 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
28960 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
28970 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
28980 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
28990 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 7, return SQL
289a0 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61  ITE_NOMEM, pData
289b0 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75  2);.        cksu
289c0 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  m = pager_cksum(
289d0 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61  pPager, (u8*)pDa
289e0 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ta2);.        rc
289f0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
28a00 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
28a10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
28a20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
28a30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28a40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28a50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
28a60 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
28a70 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
28a80 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  er->pageSize,.  
28a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28aa0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
28ab0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
28ac0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   4);.          p
28ad0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
28ae0 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  f += pPager->pag
28af0 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20  eSize+4;.       
28b00 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
28b10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28b20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
28b30 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
28b40 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
28b50 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75  journalOff, cksu
28b60 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  m);.          pP
28b70 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
28b80 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d   += 4;.        }
28b90 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
28ba0 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c  (("JOUT %p %d %l
28bb0 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
28bc0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20  , pPg->pgno, .  
28bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
28be0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
28bf0 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
28c00 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50  ize));.        P
28c10 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
28c20 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
28c30 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50  ount);.        P
28c40 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52  AGERTRACE(("JOUR
28c50 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e  NAL %d page %d n
28c60 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28  eedSync=%d hash(
28c70 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
28c80 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
28c90 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
28ca0 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  o, .            
28cb0 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47   ((pPg->flags&PG
28cc0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31  HDR_NEED_SYNC)?1
28cd0 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68  :0), pager_pageh
28ce0 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20  ash(pPg)));..   
28cf0 20 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20       /* Even if 
28d00 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c  an IO or diskful
28d10 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  l error occurred
28d20 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69   while journalli
28d30 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ng the.        *
28d40 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c  * page in the bl
28d50 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74  ock above, set t
28d60 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61  he need-sync fla
28d70 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  g for the page..
28d80 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72          ** Other
28d90 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74  wise, when the t
28da0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
28db0 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c  lled back, the l
28dc0 6f 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20  ogic in.        
28dd0 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  ** playback_one_
28de0 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e  page() will thin
28df0 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  k that the page 
28e00 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74  needs to be rest
28e10 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ored.        ** 
28e20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
28e30 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20  file. And if an 
28e40 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
28e50 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a  while doing so,.
28e60 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
28e70 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66  corruption may f
28e80 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a  ollow..        *
28e90 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  /.        if( !p
28ea0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
28eb0 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
28ec0 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
28ed0 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
28ee0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
28ef0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
28f00 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
28f10 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  An error has occ
28f20 75 72 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f  urred writing to
28f30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
28f40 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20  e. The .        
28f50 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
28f60 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ill be rolled ba
28f70 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72 20  ck by the layer 
28f80 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a  above..        *
28f90 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  /.        if( rc
28fa0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
28fb0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
28fc0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  rc;.        }.. 
28fd0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
28fe0 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Rec++;.        a
28ff0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
29000 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
29010 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
29020 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
29030 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
29040 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
29050 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
29060 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
29070 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
29080 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
29090 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
290a0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
290b0 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65   rc |= addToSave
290c0 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
290d0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
290e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
290f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29100 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
29110 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
29120 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   );.          re
29130 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
29140 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
29150 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
29160 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
29170 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ted && !pPager->
29180 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
29190 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
291a0 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
291b0 43 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  C;.          pPa
291c0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
291d0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
291e0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
291f0 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65  ("APPEND %d page
29200 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c   %d needSync=%d\
29210 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
29220 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
29230 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a  er), pPg->pgno,.
29240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
29250 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
29260 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
29270 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )));.      }.   
29280 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
29290 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
292a0 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e  urnal is open an
292b0 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
292c0 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20  t in it,.    ** 
292d0 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63  then write the c
292e0 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74  urrent page to t
292f0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
29300 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74  rnal.  Note that
29310 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74  .    ** the stat
29320 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f  ement journal fo
29330 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f  rmat differs fro
29340 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a  m the standard j
29350 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20  ournal format.  
29360 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20    ** in that it 
29370 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73  omits the checks
29380 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64  ums and the head
29390 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  er..    */.    i
293a0 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  f( subjRequiresP
293b0 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20  age(pPg) ){.    
293c0 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61    rc = subjourna
293d0 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  lPage(pPg);.    
293e0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  }.  }..  /* Upda
293f0 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
29400 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
29410 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
29420 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
29430 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
29440 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
29450 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  ize<pPg->pgno ){
29460 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
29470 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
29480 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
29490 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
294a0 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  a data page as w
294b0 72 69 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72  riteable. This r
294c0 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63  outine must be c
294d0 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a  alled before .**
294e0 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20   making changes 
294f0 74 6f 20 61 20 70 61 67 65 2e 20 54 68 65 20 63  to a page. The c
29500 61 6c 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b  aller must check
29510 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
29520 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75  e .** of this fu
29530 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61  nction and be ca
29540 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61  reful not to cha
29550 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74  nge any page dat
29560 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69  a unless .** thi
29570 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
29580 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
29590 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
295a0 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66  e between this f
295b0 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65  unction and page
295c0 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61  r_write() is tha
295d0 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  t this.** functi
295e0 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69  on also deals wi
295f0 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  th the special c
29600 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d  ase where 2 or m
29610 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74  ore pages.** fit
29620 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73   on a single dis
29630 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69  k sector. In thi
29640 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65  s case all co-re
29650 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20  sident pages.** 
29660 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77  must have been w
29670 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
29680 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
29690 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
296a0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
296b0 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  ccurs, SQLITE_NO
296c0 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  MEM or an IO err
296d0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
296e0 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70  ned.** as approp
296f0 72 69 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  riate. Otherwise
29700 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  , SQLITE_OK..*/.
29710 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
29720 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44  Write(DbPage *pD
29730 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  bPage){.  int rc
29740 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
29750 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44   PgHdr *pPg = pD
29760 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a  bPage;.  Pager *
29770 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
29780 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61  ager;.  Pgno nPa
29790 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70  gePerSector = (p
297a0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
297b0 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e/pPager->pageSi
297c0 7a 65 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67  ze);..  if( nPag
297d0 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a  ePerSector>1 ){.
297e0 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f      Pgno nPageCo
297f0 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  unt;          /*
29800 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
29810 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
29820 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50  se file */.    P
29830 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20  gno pg1;        
29840 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
29850 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
29860 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
29870 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  ted on. */.    i
29880 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
29890 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
298a0 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72  er of pages star
298b0 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a  ting at pg1 to j
298c0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e  ournal */.    in
298d0 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
298e0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
298f0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
29900 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  nt needSync = 0;
29910 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
29920 20 69 66 20 61 6e 79 20 70 61 67 65 20 68 61 73   if any page has
29930 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
29940 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20   */..    /* Set 
29950 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c  the doNotSync fl
29960 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73  ag to 1. This is
29970 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e   because we cann
29980 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e  ot allow a journ
29990 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72  al.    ** header
299a0 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62   to be written b
299b0 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73  etween the pages
299c0 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68   journaled by th
299d0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  is function..   
299e0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
299f0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73  !MEMDB );.    as
29a00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
29a10 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  NotSync==0 );.  
29a20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
29a30 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a  ync = 1;..    /*
29a40 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75   This trick assu
29a50 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68  mes that both th
29a60 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
29a70 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a  sector-size are.
29a80 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65      ** an intege
29a90 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74  r power of 2. It
29aa0 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70   sets variable p
29ab0 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69  g1 to the identi
29ac0 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  fier.    ** of t
29ad0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
29ae0 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
29af0 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20  is located on.. 
29b00 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20     */.    pg1 = 
29b10 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26  ((pPg->pgno-1) &
29b20 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f   ~(nPagePerSecto
29b30 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20  r-1)) + 1;..    
29b40 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
29b50 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 28 69  count(pPager, (i
29b60 6e 74 20 2a 29 26 6e 50 61 67 65 43 6f 75 6e 74  nt *)&nPageCount
29b70 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  );.    if( pPg->
29b80 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20  pgno>nPageCount 
29b90 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
29ba0 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67   (pPg->pgno - pg
29bb0 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20  1)+1;.    }else 
29bc0 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65  if( (pg1+nPagePe
29bd0 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65  rSector-1)>nPage
29be0 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
29bf0 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e  Page = nPageCoun
29c00 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c  t+1-pg1;.    }el
29c10 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20  se{.      nPage 
29c20 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  = nPagePerSector
29c30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
29c40 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20  rt(nPage>0);.   
29c50 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67   assert(pg1<=pPg
29c60 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73  ->pgno);.    ass
29c70 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e  ert((pg1+nPage)>
29c80 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20  pPg->pgno);..   
29c90 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50   for(ii=0; ii<nP
29ca0 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  age && rc==SQLIT
29cb0 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  E_OK; ii++){.   
29cc0 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31     Pgno pg = pg1
29cd0 2b 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72  +ii;.      PgHdr
29ce0 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69   *pPage;.      i
29cf0 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f  f( pg==pPg->pgno
29d00 20 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76   || !sqlite3Bitv
29d10 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
29d20 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29  InJournal, pg) )
29d30 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67  {.        if( pg
29d40 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
29d50 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
29d60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
29d70 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
29d80 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20  , pg, &pPage);. 
29d90 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
29da0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29db0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
29dc0 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
29dd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
29de0 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26  f( pPage->flags&
29df0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
29e00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
29e10 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
29e20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
29e30 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64  ert(pPager->need
29e40 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20  Sync);.         
29e50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
29e60 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
29e70 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
29e80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
29e90 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
29ea0 20 28 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f   (pPage = pager_
29eb0 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
29ec0 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  g))!=0 ){.      
29ed0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61    if( pPage->fla
29ee0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
29ef0 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NC ){.          
29f00 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
29f10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29f20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
29f30 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
29f40 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
29f50 49 66 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  If the PGHDR_NEE
29f60 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 73  D_SYNC flag is s
29f70 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68  et for any of th
29f80 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20  e nPage pages . 
29f90 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
29fa0 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e  t pg1, then it n
29fb0 65 65 64 73 20 74 6f 20 62 65 20 73 65 74 20 66  eeds to be set f
29fc0 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20  or all of them. 
29fd0 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77  Because.    ** w
29fe0 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66  riting to any of
29ff0 20 74 68 65 73 65 20 6e 50 61 67 65 20 70 61 67   these nPage pag
2a000 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68  es may damage th
2a010 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20  e others, the.  
2a020 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
2a030 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73  e must contain s
2a040 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f  ync()ed copies o
2a050 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20  f all of them.  
2a060 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20    ** before any 
2a070 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77  of them can be w
2a080 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
2a090 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2a0a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2a0b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2a0c0 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20   needSync ){.   
2a0d0 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
2a0e0 42 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53  B && pPager->noS
2a0f0 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ync==0 );.      
2a100 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61  for(ii=0; ii<nPa
2a110 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ge; ii++){.     
2a120 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 20     PgHdr *pPage 
2a130 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
2a140 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a  Pager, pg1+ii);.
2a150 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
2a160 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e ){.          p
2a170 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50  Page->flags |= P
2a180 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
2a190 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2a1a0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
2a1b0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
2a1c0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
2a1d0 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  rt(pPager->needS
2a1e0 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ync);.    }..   
2a1f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2a200 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b  >doNotSync==1 );
2a210 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
2a220 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65  otSync = 0;.  }e
2a230 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  lse{.    rc = pa
2a240 67 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67  ger_write(pDbPag
2a250 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
2a260 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
2a270 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
2a280 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74   page given in t
2a290 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  he argument was 
2a2a0 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65  previously passe
2a2b0 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  d.** to sqlite3P
2a2c0 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e  agerWrite().  In
2a2d0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
2a2e0 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
2a2f0 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e  is ok.** to chan
2a300 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ge the content o
2a310 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  f the page..*/.#
2a320 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e  ifndef NDEBUG.in
2a330 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
2a340 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65  writeable(DbPage
2a350 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
2a360 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
2a370 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69  R_DIRTY;.}.#endi
2a380 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  f../*.** A call 
2a390 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
2a3a0 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
2a3b0 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e  that it is not n
2a3c0 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77  ecessary to.** w
2a3d0 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61  rite the informa
2a3e0 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67  tion on page pPg
2a3f0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73   back to the dis
2a400 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a  k, even though.*
2a410 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68  * that page migh
2a420 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  t be marked as d
2a430 69 72 74 79 2e 20 20 54 68 69 73 20 68 61 70 70  irty.  This happ
2a440 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ens, for example
2a450 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61  , when.** the pa
2a460 67 65 20 68 61 73 20 62 65 65 6e 20 61 64 64 65  ge has been adde
2a470 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74  d as a leaf of t
2a480 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20  he freelist and 
2a490 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e  so its.** conten
2a4a0 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74  t no longer matt
2a4b0 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  ers..**.** The o
2a4c0 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72  verlying softwar
2a4d0 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68  e layer calls th
2a4e0 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
2a4f0 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a  all of the data.
2a500 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ** on the given 
2a510 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20  page is unused. 
2a520 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20  The pager marks 
2a530 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
2a540 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  n so.** that it 
2a550 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69  does not get wri
2a560 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  tten to disk..**
2a570 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74  .** Tests show t
2a580 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  hat this optimiz
2a590 61 74 69 6f 6e 20 63 61 6e 20 71 75 61 64 72 75  ation can quadru
2a5a0 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66  ple the speed of
2a5b0 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54   large .** DELET
2a5c0 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f  E operations..*/
2a5d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
2a5e0 65 72 44 6f 6e 74 57 72 69 74 65 28 50 67 48 64  erDontWrite(PgHd
2a5f0 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
2a600 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
2a610 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 28 70  pPager;.  if( (p
2a620 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2a630 44 49 52 54 59 29 20 26 26 20 70 50 61 67 65 72  DIRTY) && pPager
2a640 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20  ->nSavepoint==0 
2a650 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  ){.    PAGERTRAC
2a660 45 28 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70  E(("DONT_WRITE p
2a670 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  age %d of %d\n",
2a680 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45   pPg->pgno, PAGE
2a690 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
2a6a0 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45     IOTRACE(("CLE
2a6b0 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  AN %p %d\n", pPa
2a6c0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
2a6d0 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
2a6e0 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  |= PGHDR_DONT_WR
2a6f0 49 54 45 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ITE;.#ifdef SQLI
2a700 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
2a710 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
2a720 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
2a730 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
2a740 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
2a750 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2a760 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20  ed to increment 
2a770 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
2a780 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 0a   database file .
2a790 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  ** change-counte
2a7a0 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 34  r, stored as a 4
2a7b0 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e  -byte big-endian
2a7c0 20 69 6e 74 65 67 65 72 20 73 74 61 72 74 69 6e   integer startin
2a7d0 67 20 61 74 20 0a 2a 2a 20 62 79 74 65 20 6f 66  g at .** byte of
2a7e0 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 70  fset 24 of the p
2a7f0 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  ager file..**.**
2a800 20 49 66 20 74 68 65 20 69 73 44 69 72 65 63 74   If the isDirect
2a810 4d 6f 64 65 20 66 6c 61 67 20 69 73 20 7a 65 72  Mode flag is zer
2a820 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  o, then this is 
2a830 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  done by calling 
2a840 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
2a850 57 72 69 74 65 28 29 20 6f 6e 20 70 61 67 65 20  Write() on page 
2a860 31 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e  1, then modifyin
2a870 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
2a880 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61  f the.** page da
2a890 74 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ta. In this case
2a8a0 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62   the file will b
2a8b0 65 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 74  e updated when t
2a8c0 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72  he current.** tr
2a8d0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
2a8e0 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
2a8f0 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66  e isDirectMode f
2a900 6c 61 67 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  lag may only be 
2a910 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
2a920 6c 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70  library was comp
2a930 69 6c 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  iled.** with the
2a940 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
2a950 54 4f 4d 49 43 5f 57 52 49 54 45 20 6d 61 63 72  TOMIC_WRITE macr
2a960 6f 20 64 65 66 69 6e 65 64 2e 20 49 6e 20 74 68  o defined. In th
2a970 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 66 20 69  is case,.** if i
2a980 73 44 69 72 65 63 74 20 69 73 20 6e 6f 6e 2d 7a  sDirect is non-z
2a990 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 61  ero, then the da
2a9a0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
2a9b0 70 64 61 74 65 64 20 64 69 72 65 63 74 6c 79 0a  pdated directly.
2a9c0 2a 2a 20 62 79 20 77 72 69 74 69 6e 67 20 61 6e  ** by writing an
2a9d0 20 75 70 64 61 74 65 64 20 76 65 72 73 69 6f 6e   updated version
2a9e0 20 6f 66 20 70 61 67 65 20 31 20 75 73 69 6e 67   of page 1 using
2a9f0 20 61 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 0a   a call to the .
2aa00 2a 2a 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  ** sqlite3OsWrit
2aa10 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  e() function..*/
2aa20 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
2aa30 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
2aa40 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  nter(Pager *pPag
2aa50 65 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74  er, int isDirect
2aa60 4d 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Mode){.  int rc 
2aa70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
2aa80 2f 2a 20 44 65 63 6c 61 72 65 20 61 6e 64 20 69  /* Declare and i
2aa90 6e 69 74 69 61 6c 69 7a 65 20 63 6f 6e 73 74 61  nitialize consta
2aaa0 6e 74 20 69 6e 74 65 67 65 72 20 27 69 73 44 69  nt integer 'isDi
2aab0 72 65 63 74 27 2e 20 49 66 20 74 68 65 0a 20 20  rect'. If the.  
2aac0 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  ** atomic-write 
2aad0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
2aae0 65 6e 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20  enabled in this 
2aaf0 62 75 69 6c 64 2c 20 74 68 65 6e 20 69 73 44 69  build, then isDi
2ab00 72 65 63 74 0a 20 20 2a 2a 20 69 73 20 69 6e 69  rect.  ** is ini
2ab10 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20  tialized to the 
2ab20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
2ab30 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65  the isDirectMode
2ab40 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 20   parameter.  ** 
2ab50 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
2ab60 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
2ab70 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  is always set to
2ab80 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   zero..  **.  **
2ab90 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61   The idea is tha
2aba0 74 20 69 66 20 74 68 65 20 61 74 6f 6d 69 63 2d  t if the atomic-
2abb0 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
2abc0 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 65  on is not.  ** e
2abd0 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
2abe0 65 20 74 69 6d 65 2c 20 74 68 65 20 63 6f 6d 70  e time, the comp
2abf0 69 6c 65 72 20 63 61 6e 20 6f 6d 69 74 20 74 68  iler can omit th
2ac00 65 20 74 65 73 74 73 20 6f 66 0a 20 20 2a 2a 20  e tests of.  ** 
2ac10 27 69 73 44 69 72 65 63 74 27 20 62 65 6c 6f 77  'isDirect' below
2ac20 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  , as well as the
2ac30 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65 64 20   block enclosed 
2ac40 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 69 66 28  in the.  ** "if(
2ac50 20 69 73 44 69 72 65 63 74 20 29 22 20 63 6f 6e   isDirect )" con
2ac60 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66  dition..  */.#if
2ac70 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  ndef SQLITE_ENAB
2ac80 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
2ac90 23 20 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f  # define DIRECT_
2aca0 4d 4f 44 45 20 30 0a 20 20 61 73 73 65 72 74 28  MODE 0.  assert(
2acb0 20 69 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30   isDirectMode==0
2acc0 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
2acd0 41 4d 45 54 45 52 28 69 73 44 69 72 65 63 74 4d  AMETER(isDirectM
2ace0 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 23 20 64 65  ode);.#else.# de
2acf0 66 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45  fine DIRECT_MODE
2ad00 20 69 73 44 69 72 65 63 74 4d 6f 64 65 0a 23 65   isDirectMode.#e
2ad10 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
2ad20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
2ad30 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
2ad40 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
2ad50 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
2ad60 26 26 20 41 4c 57 41 59 53 28 70 50 61 67 65 72  && ALWAYS(pPager
2ad70 2d 3e 64 62 53 69 7a 65 3e 30 29 20 29 7b 0a 20  ->dbSize>0) ){. 
2ad80 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72     PgHdr *pPgHdr
2ad90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ada0 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f   /* Reference to
2adb0 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 20 20 75   page 1 */.    u
2adc0 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  32 change_counte
2add0 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
2ade0 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66  Initial value of
2adf0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
2ae00 66 69 65 6c 64 20 2a 2f 0a 0a 20 20 20 20 61 73  field */..    as
2ae10 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
2ae20 65 6d 70 46 69 6c 65 20 26 26 20 69 73 4f 70 65  empFile && isOpe
2ae30 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
2ae40 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61  ..    /* Open pa
2ae50 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65  ge 1 of the file
2ae60 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f   for writing. */
2ae70 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2ae80 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
2ae90 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20  , 1, &pPgHdr);. 
2aea0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 48 64     assert( pPgHd
2aeb0 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  r==0 || rc==SQLI
2aec0 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  TE_OK );..    /*
2aed0 20 49 66 20 70 61 67 65 20 6f 6e 65 20 77 61 73   If page one was
2aee0 20 66 65 74 63 68 65 64 20 73 75 63 63 65 73 73   fetched success
2aef0 66 75 6c 6c 79 2c 20 61 6e 64 20 74 68 69 73 20  fully, and this 
2af00 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 0a  function is not.
2af10 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67      ** operating
2af20 20 69 6e 20 64 69 72 65 63 74 2d 6d 6f 64 65 2c   in direct-mode,
2af30 20 6d 61 6b 65 20 70 61 67 65 20 31 20 77 72 69   make page 1 wri
2af40 74 61 62 6c 65 2e 20 20 57 68 65 6e 20 6e 6f 74  table.  When not
2af50 20 69 6e 20 0a 20 20 20 20 2a 2a 20 64 69 72 65   in .    ** dire
2af60 63 74 20 6d 6f 64 65 2c 20 70 61 67 65 20 31 20  ct mode, page 1 
2af70 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 69  is always held i
2af80 6e 20 63 61 63 68 65 20 61 6e 64 20 68 65 6e 63  n cache and henc
2af90 65 20 74 68 65 20 50 61 67 65 72 47 65 74 28 29  e the PagerGet()
2afa0 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 69 73  .    ** above is
2afb0 20 61 6c 77 61 79 73 20 73 75 63 63 65 73 73 66   always successf
2afc0 75 6c 20 2d 20 68 65 6e 63 65 20 74 68 65 20 41  ul - hence the A
2afd0 4c 57 41 59 53 20 6f 6e 20 72 63 3d 3d 53 51 4c  LWAYS on rc==SQL
2afe0 49 54 45 5f 4f 4b 2e 0a 20 20 20 20 2a 2f 0a 20  ITE_OK..    */. 
2aff0 20 20 20 69 66 28 20 21 44 49 52 45 43 54 5f 4d     if( !DIRECT_M
2b000 4f 44 45 20 26 26 20 41 4c 57 41 59 53 28 72 63  ODE && ALWAYS(rc
2b010 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a  ==SQLITE_OK) ){.
2b020 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2b030 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
2b040 48 64 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Hdr);.    }..   
2b050 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b060 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  OK ){.      /* I
2b070 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
2b080 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64  ue just read and
2b090 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74   write it back t
2b0a0 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  o byte 24. */.  
2b0b0 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74      change_count
2b0c0 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  er = sqlite3Get4
2b0d0 62 79 74 65 28 28 75 38 2a 29 70 50 61 67 65 72  byte((u8*)pPager
2b0e0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 3b 0a 20  ->dbFileVers);. 
2b0f0 20 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e       change_coun
2b100 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 70 75 74  ter++;.      put
2b110 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70  32bits(((char*)p
2b120 50 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 32 34  PgHdr->pData)+24
2b130 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  , change_counter
2b140 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
2b150 72 75 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65 63  running in direc
2b160 74 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 74 68  t mode, write th
2b170 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61  e contents of pa
2b180 67 65 20 31 20 74 6f 20 74 68 65 20 66 69 6c 65  ge 1 to the file
2b190 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 44  . */.      if( D
2b1a0 49 52 45 43 54 5f 4d 4f 44 45 20 29 7b 0a 20 20  IRECT_MODE ){.  
2b1b0 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64        const void
2b1c0 20 2a 7a 42 75 66 20 3d 20 70 50 67 48 64 72 2d   *zBuf = pPgHdr-
2b1d0 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >pData;.        
2b1e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2b1f0 64 62 46 69 6c 65 53 69 7a 65 3e 30 20 29 3b 0a  dbFileSize>0 );.
2b200 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2b210 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
2b220 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50  er->fd, zBuf, pP
2b230 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
2b240 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
2b250 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2b260 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
2b270 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
2b280 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ne = 1;.        
2b290 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
2b2a0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63         pPager->c
2b2b0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
2b2c0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
2b2d0 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
2b2e0 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72  e the page refer
2b2f0 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  ence. */.    sql
2b300 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2b310 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65  PgHdr);.  }.  re
2b320 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2b330 2a 20 53 79 6e 63 20 74 68 65 20 70 61 67 65 72  * Sync the pager
2b340 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 20 54   file to disk. T
2b350 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  his is a no-op f
2b360 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  or in-memory fil
2b370 65 73 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20 77  es.** or pages w
2b380 69 74 68 20 74 68 65 20 50 61 67 65 72 2e 6e 6f  ith the Pager.no
2b390 53 79 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a 2a  Sync flag set..*
2b3a0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
2b3b0 75 6c 2c 20 6f 72 20 63 61 6c 6c 65 64 20 6f 6e  ul, or called on
2b3c0 20 61 20 70 61 67 65 72 20 66 6f 72 20 77 68 69   a pager for whi
2b3d0 63 68 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  ch it is a no-op
2b3e0 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
2b3f0 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
2b400 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c  E_OK. Otherwise,
2b410 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
2b420 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
2b430 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2b440 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50  erSync(Pager *pP
2b450 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
2b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b480 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2b490 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
2b4a0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
2b4b0 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
2b4c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2b4d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
2b4e0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
2b4f0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
2b500 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
2b510 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2b520 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
2b530 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b540 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20  e for the pager 
2b550 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20  pPager. zMaster 
2b560 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61  points to the na
2b570 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65  me.** of a maste
2b580 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
2b590 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
2b5a0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69  itten into the i
2b5b0 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75  ndividual.** jou
2b5c0 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74  rnal file. zMast
2b5d0 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20  er may be NULL, 
2b5e0 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72  which is interpr
2b5f0 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65  eted as no maste
2b600 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20  r.** journal (a 
2b610 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
2b620 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
2b630 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2b640 20 65 6e 73 75 72 65 73 20 74 68 61 74 3a 0a 2a   ensures that:.*
2b650 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74  *.**   * The dat
2b660 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
2b670 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 75 70 64  e-counter is upd
2b680 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68 65  ated,.**   * the
2b690 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
2b6a0 65 64 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61  ed (unless the a
2b6b0 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
2b6c0 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64  mization is used
2b6d0 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64 69  ),.**   * all di
2b6e0 72 74 79 20 70 61 67 65 73 20 61 72 65 20 77 72  rty pages are wr
2b6f0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
2b700 61 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a 20  abase file, .** 
2b710 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65    * the database
2b720 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
2b730 65 64 20 28 69 66 20 72 65 71 75 69 72 65 64 29  ed (if required)
2b740 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65  , and.**   * the
2b750 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
2b760 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ynced. .**.** Th
2b770 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61  e only thing tha
2b780 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d  t remains to com
2b790 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
2b7a0 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c 69  ion is to finali
2b7b0 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c 20  ze .** (delete, 
2b7c0 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f  truncate or zero
2b7d0 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20   the first part 
2b7e0 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  of) the journal 
2b7f0 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65 6c  file (or .** del
2b800 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
2b810 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73  ournal file if s
2b820 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a  pecified)..**.**
2b830 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d   Note that if zM
2b840 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69  aster==NULL, thi
2b850 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77  s does not overw
2b860 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20  rite a previous 
2b870 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20  value.** passed 
2b880 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67  to an sqlite3Pag
2b890 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
2b8a0 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  () call..**.** I
2b8b0 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61  f the final para
2b8c0 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d  meter - noSync -
2b8d0 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
2b8e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b8f0 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f   itself.** is no
2b900 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61  t synced. The ca
2b910 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73  ller must call s
2b920 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
2b930 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a  ) directly to.**
2b940 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
2b950 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63  se file before c
2b960 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61  alling CommitPha
2b970 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74  seTwo() to delet
2b980 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  e the.** journal
2b990 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61   file in this ca
2b9a0 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
2b9b0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
2b9c0 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a  seOne(.  Pager *
2b9d0 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
2b9e0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2b9f0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  r object */.  co
2ba00 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
2ba10 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
2ba20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
2ba30 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
2ba40 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   name */.  int n
2ba50 6f 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20  oSync           
2ba60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2ba70 75 65 20 74 6f 20 6f 6d 69 74 20 74 68 65 20 78  ue to omit the x
2ba80 53 79 6e 63 20 6f 6e 20 74 68 65 20 64 62 20 66  Sync on the db f
2ba90 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ile */.){.  int 
2baa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2bab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2bac0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
2bad0 20 2f 2a 20 54 68 65 20 64 62 4f 72 69 67 53 69   /* The dbOrigSi
2bae0 7a 65 20 69 73 20 6e 65 76 65 72 20 73 65 74 20  ze is never set 
2baf0 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  if journal_mode=
2bb00 4f 46 46 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  OFF */.  assert(
2bb10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2bb20 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
2bb30 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70  NALMODE_OFF || p
2bb40 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
2bb50 65 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  e==0 );..  /* If
2bb60 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 6f   a prior error o
2bb70 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 72 6f  ccurred, this ro
2bb80 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74  utine should not
2bb90 20 62 65 20 63 61 6c 6c 65 64 2e 20 20 52 4f 4c   be called.  ROL
2bba0 4c 42 41 43 4b 0a 20 20 2a 2a 20 69 73 20 74 68  LBACK.  ** is th
2bbb0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72 65  e appropriate re
2bbc0 73 70 6f 6e 73 65 20 74 6f 20 61 6e 20 65 72 72  sponse to an err
2bbd0 6f 72 2c 20 6e 6f 74 20 43 4f 4d 4d 49 54 2e 20  or, not COMMIT. 
2bbe0 20 47 75 61 72 64 20 61 67 61 69 6e 73 74 0a 20   Guard against. 
2bbf0 20 2a 2a 20 63 6f 64 69 6e 67 20 65 72 72 6f 72   ** coding error
2bc00 73 20 62 79 20 72 65 70 65 61 74 69 6e 67 20 74  s by repeating t
2bc10 68 65 20 70 72 69 6f 72 20 65 72 72 6f 72 2e 20  he prior error. 
2bc20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
2bc30 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
2bc40 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
2bc50 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 50 41 47  >errCode;..  PAG
2bc60 45 52 54 52 41 43 45 28 28 22 44 41 54 41 42 41  ERTRACE(("DATABA
2bc70 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73  SE SYNC: File=%s
2bc80 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 53 69 7a   zMaster=%s nSiz
2bc90 65 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  e=%d\n", .      
2bca0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2bcb0 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  e, zMaster, pPag
2bcc0 65 72 2d 3e 64 62 53 69 7a 65 29 29 3b 0a 0a 20  er->dbSize));.. 
2bcd0 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20 70 50   if( MEMDB && pP
2bce0 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
2bcf0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
2bd00 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
2bd10 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67  ry db, or no pag
2bd20 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
2bd30 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73  tten to, or this
2bd40 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  .    ** function
2bd50 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
2bd60 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  n called, it is 
2bd70 6d 6f 73 74 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20  mostly a no-op. 
2bd80 20 48 6f 77 65 76 65 72 2c 20 61 6e 79 0a 20 20   However, any.  
2bd90 20 20 2a 2a 20 62 61 63 6b 75 70 20 69 6e 20 70    ** backup in p
2bda0 72 6f 67 72 65 73 73 20 6e 65 65 64 73 20 74 6f  rogress needs to
2bdb0 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20   be restarted.. 
2bdc0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
2bdd0 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
2bde0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
2bdf0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
2be00 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
2be10 52 5f 53 59 4e 43 45 44 20 26 26 20 70 50 61 67  R_SYNCED && pPag
2be20 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29  er->dbModified )
2be30 7b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  {..    /* The fo
2be40 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 75 70  llowing block up
2be50 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65  dates the change
2be60 2d 63 6f 75 6e 74 65 72 2e 20 45 78 61 63 74 6c  -counter. Exactl
2be70 79 20 68 6f 77 20 69 74 0a 20 20 20 20 2a 2a 20  y how it.    ** 
2be80 64 6f 65 73 20 74 68 69 73 20 64 65 70 65 6e 64  does this depend
2be90 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  s on whether or 
2bea0 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 75  not the atomic-u
2beb0 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  pdate optimizati
2bec0 6f 6e 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 6e  on.    ** was en
2bed0 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
2bee0 20 74 69 6d 65 2c 20 61 6e 64 20 69 66 20 74 68   time, and if th
2bef0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  is transaction m
2bf00 65 65 74 73 20 74 68 65 20 0a 20 20 20 20 2a 2a  eets the .    **
2bf10 20 72 75 6e 74 69 6d 65 20 63 72 69 74 65 72 69   runtime criteri
2bf20 61 20 74 6f 20 75 73 65 20 74 68 65 20 6f 70 65  a to use the ope
2bf30 72 61 74 69 6f 6e 3a 20 0a 20 20 20 20 2a 2a 0a  ration: .    **.
2bf40 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 65 20      **    * The 
2bf50 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70  file-system supp
2bf60 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d  orts the atomic-
2bf70 77 72 69 74 65 20 70 72 6f 70 65 72 74 79 20 66  write property f
2bf80 6f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62  or.    **      b
2bf90 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20 70 61  locks of size pa
2bfa0 67 65 2d 73 69 7a 65 2c 20 61 6e 64 20 0a 20 20  ge-size, and .  
2bfb0 20 20 2a 2a 20 20 20 20 2a 20 54 68 69 73 20 63    **    * This c
2bfc0 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72  ommit is not par
2bfd0 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c  t of a multi-fil
2bfe0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
2bff0 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2a 20 45  nd.    **    * E
2c000 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 20  xactly one page 
2c010 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
2c020 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 74  d and store in t
2c030 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
2c040 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
2c050 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
2c060 6f 6e 20 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c  on was not enabl
2c070 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  ed at compile ti
2c080 6d 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  me, then the.   
2c090 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63   ** pager_incr_c
2c0a0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 66  hangecounter() f
2c0b0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2c0c0 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  d to update the 
2c0d0 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a 20 63 6f  change.    ** co
2c0e0 75 6e 74 65 72 20 69 6e 20 27 69 6e 64 69 72 65  unter in 'indire
2c0f0 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20 74 68 65  ct-mode'. If the
2c100 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
2c110 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 62 75 74   compiled in but
2c120 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61  .    ** is not a
2c130 70 70 6c 69 63 61 62 6c 65 20 74 6f 20 74 68 69  pplicable to thi
2c140 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63  s transaction, c
2c150 61 6c 6c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  all sqlite3Journ
2c160 61 6c 43 72 65 61 74 65 28 29 0a 20 20 20 20 2a  alCreate().    *
2c170 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  * to make sure t
2c180 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2c190 68 61 73 20 61 63 74 75 61 6c 6c 79 20 62 65 65  has actually bee
2c1a0 6e 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20  n created, then 
2c1b0 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65  call.    ** page
2c1c0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
2c1d0 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74 65  nter() to update
2c1e0 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
2c1f0 74 65 72 20 69 6e 20 69 6e 64 69 72 65 63 74 0a  ter in indirect.
2c200 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 0a 20 20      ** mode. .  
2c210 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74 68 65    **.    ** Othe
2c220 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 6f 70  rwise, if the op
2c230 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f  timization is bo
2c240 74 68 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 61  th enabled and a
2c250 70 70 6c 69 63 61 62 6c 65 2c 0a 20 20 20 20 2a  pplicable,.    *
2c260 2a 20 74 68 65 6e 20 63 61 6c 6c 20 70 61 67 65  * then call page
2c270 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
2c280 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74 65  nter() to update
2c290 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
2c2a0 74 65 72 0a 20 20 20 20 2a 2a 20 69 6e 20 27 64  ter.    ** in 'd
2c2b0 69 72 65 63 74 27 20 6d 6f 64 65 2e 20 49 6e 20  irect' mode. In 
2c2c0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
2c2d0 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20  urnal file will 
2c2e0 6e 65 76 65 72 20 62 65 0a 20 20 20 20 2a 2a 20  never be.    ** 
2c2f0 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 69 73  created for this
2c300 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
2c310 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
2c320 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
2c330 5f 57 52 49 54 45 0a 20 20 20 20 50 67 48 64 72  _WRITE.    PgHdr
2c340 20 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72   *pPg;.    asser
2c350 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2c360 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72  ->jfd) || pPager
2c370 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
2c380 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2c390 5f 4f 46 46 20 29 3b 0a 20 20 20 20 69 66 28 20  _OFF );.    if( 
2c3a0 21 7a 4d 61 73 74 65 72 20 26 26 20 69 73 4f 70  !zMaster && isOp
2c3b0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
2c3c0 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d  .     && pPager-
2c3d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e  >journalOff==jrn
2c3e0 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
2c3f0 65 72 29 20 0a 20 20 20 20 20 26 26 20 70 50 61  er) .     && pPa
2c400 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61  ger->dbSize>=pPa
2c410 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a  ger->dbFileSize.
2c420 20 20 20 20 20 26 26 20 28 30 3d 3d 28 70 50 67       && (0==(pPg
2c430 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
2c440 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
2c450 2d 3e 70 50 43 61 63 68 65 29 29 20 7c 7c 20 30  ->pPCache)) || 0
2c460 3d 3d 70 50 67 2d 3e 70 44 69 72 74 79 29 0a 20  ==pPg->pDirty). 
2c470 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55     ){.      /* U
2c480 70 64 61 74 65 20 74 68 65 20 64 62 20 66 69 6c  pdate the db fil
2c490 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
2c4a0 20 76 69 61 20 74 68 65 20 64 69 72 65 63 74 2d   via the direct-
2c4b0 77 72 69 74 65 20 6d 65 74 68 6f 64 2e 20 54 68  write method. Th
2c4c0 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c  e .      ** foll
2c4d0 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20  owing call will 
2c4e0 6d 6f 64 69 66 79 20 74 68 65 20 69 6e 2d 6d 65  modify the in-me
2c4f0 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
2c500 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 0a 20  ion of page 1 . 
2c510 20 20 20 20 20 2a 2a 20 74 6f 20 69 6e 63 6c 75       ** to inclu
2c520 64 65 20 74 68 65 20 75 70 64 61 74 65 64 20 63  de the updated c
2c530 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 61 6e  hange counter an
2c540 64 20 74 68 65 6e 20 77 72 69 74 65 20 70 61 67  d then write pag
2c550 65 20 31 20 0a 20 20 20 20 20 20 2a 2a 20 64 69  e 1 .      ** di
2c560 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61  rectly to the da
2c570 74 61 62 61 73 65 20 66 69 6c 65 2e 20 42 65 63  tabase file. Bec
2c580 61 75 73 65 20 6f 66 20 74 68 65 20 61 74 6f 6d  ause of the atom
2c590 69 63 2d 77 72 69 74 65 20 0a 20 20 20 20 20 20  ic-write .      
2c5a0 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74  ** property of t
2c5b0 68 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73  he host file-sys
2c5c0 74 65 6d 2c 20 74 68 69 73 20 69 73 20 73 61 66  tem, this is saf
2c5d0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
2c5e0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
2c5f0 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
2c600 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
2c610 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2c620 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
2c630 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  Create(pPager->j
2c640 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  fd);.      if( r
2c650 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2c660 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
2c670 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
2c680 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30 29  unter(pPager, 0)
2c690 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2c6a0 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 70  #else.    rc = p
2c6b0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
2c6c0 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20  counter(pPager, 
2c6d0 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  0);.#endif.    i
2c6e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c6f0 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70   ) goto commit_p
2c700 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a  hase_one_exit;..
2c710 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74      /* If this t
2c720 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d  ransaction has m
2c730 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ade the database
2c740 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61   smaller, then a
2c750 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 2a 2a 20  ll pages.    ** 
2c760 62 65 69 6e 67 20 64 69 73 63 61 72 64 65 64 20  being discarded 
2c770 62 79 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f  by the truncatio
2c780 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65  n must be writte
2c790 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
2c7a0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 54 68  .    ** file. Th
2c7b0 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  is can only happ
2c7c0 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  en in auto-vacuu
2c7d0 6d 20 6d 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20  m mode..    **. 
2c7e0 20 20 20 2a 2a 20 42 65 66 6f 72 65 20 72 65 61     ** Before rea
2c7f0 64 69 6e 67 20 74 68 65 20 70 61 67 65 73 20 77  ding the pages w
2c800 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
2c810 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
2c820 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74   .    ** current
2c830 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
2c840 64 62 53 69 7a 65 2c 20 73 65 74 20 64 62 53 69  dbSize, set dbSi
2c850 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76  ze back to the v
2c860 61 6c 75 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  alue.    ** that
2c870 20 69 74 20 74 6f 6f 6b 20 61 74 20 74 68 65 20   it took at the 
2c880 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
2c890 6e 73 61 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77  nsaction. Otherw
2c8a0 69 73 65 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20  ise, the.    ** 
2c8b0 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
2c8c0 50 61 67 65 72 47 65 74 28 29 20 72 65 74 75 72  PagerGet() retur
2c8d0 6e 20 7a 65 72 6f 65 64 20 70 61 67 65 73 20 69  n zeroed pages i
2c8e0 6e 73 74 65 61 64 20 6f 66 20 0a 20 20 20 20 2a  nstead of .    *
2c8f0 2a 20 72 65 61 64 69 6e 67 20 64 61 74 61 20 66  * reading data f
2c900 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
2c910 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
2c920 20 20 2a 2a 20 57 68 65 6e 20 6a 6f 75 72 6e 61    ** When journa
2c930 6c 5f 6d 6f 64 65 3d 3d 4f 46 46 20 74 68 65 20  l_mode==OFF the 
2c940 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 6c  dbOrigSize is al
2c950 77 61 79 73 20 7a 65 72 6f 2c 20 73 6f 20 74 68  ways zero, so th
2c960 69 73 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20  is.    ** block 
2c970 6e 65 76 65 72 20 72 75 6e 73 20 69 66 20 6a 6f  never runs if jo
2c980 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 2e 0a  urnal_mode=OFF..
2c990 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
2c9a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2c9b0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50  ACUUM.    if( pP
2c9c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 61  ager->dbSize<pPa
2c9d0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
2c9e0 0a 20 20 20 20 20 26 26 20 41 4c 57 41 59 53 28  .     && ALWAYS(
2c9f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2ca00 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
2ca10 41 4c 4d 4f 44 45 5f 4f 46 46 29 0a 20 20 20 20  ALMODE_OFF).    
2ca20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 3b  ){.      Pgno i;
2ca30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca50 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
2ca60 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  ariable */.     
2ca70 20 63 6f 6e 73 74 20 50 67 6e 6f 20 69 53 6b 69   const Pgno iSki
2ca80 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  p = PAGER_MJ_PGN
2ca90 4f 28 70 50 61 67 65 72 29 3b 20 2f 2a 20 50 65  O(pPager); /* Pe
2caa0 6e 64 69 6e 67 20 6c 6f 63 6b 20 70 61 67 65 20  nding lock page 
2cab0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 50  */.      const P
2cac0 67 6e 6f 20 64 62 53 69 7a 65 20 3d 20 70 50 61  gno dbSize = pPa
2cad0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 20 20 20 20  ger->dbSize;    
2cae0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69     /* Database i
2caf0 6d 61 67 65 20 73 69 7a 65 20 2a 2f 20 0a 20 20  mage size */ .  
2cb00 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
2cb10 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f  ze = pPager->dbO
2cb20 72 69 67 53 69 7a 65 3b 0a 20 20 20 20 20 20 66  rigSize;.      f
2cb30 6f 72 28 20 69 3d 64 62 53 69 7a 65 2b 31 3b 20  or( i=dbSize+1; 
2cb40 69 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  i<=pPager->dbOri
2cb50 67 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20  gSize; i++ ){.  
2cb60 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
2cb70 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
2cb80 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
2cb90 20 69 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20   i) && i!=iSkip 
2cba0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67 48  ){.          PgH
2cbb0 64 72 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20  dr *pPage;      
2cbc0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74         /* Page t
2cbd0 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  o journal */.   
2cbe0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2cbf0 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
2cc00 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29 3b 0a  er, i, &pPage);.
2cc10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2cc20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2cc30 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
2cc40 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  one_exit;.      
2cc50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2cc60 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
2cc70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
2cc80 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2cc90 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2cca0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ccb0 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
2ccc0 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
2ccd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2cce0 20 7d 20 0a 20 20 20 20 20 20 70 50 61 67 65 72   } .      pPager
2ccf0 2d 3e 64 62 53 69 7a 65 20 3d 20 64 62 53 69 7a  ->dbSize = dbSiz
2cd00 65 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  e;.    }.#endif.
2cd10 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
2cd20 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
2cd30 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a   name into the j
2cd40 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
2cd50 61 20 6d 61 73 74 65 72 20 0a 20 20 20 20 2a 2a  a master .    **
2cd60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
2cd70 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  me has already b
2cd80 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
2cd90 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
2cda0 20 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 7a   .    ** or if z
2cdb0 4d 61 73 74 65 72 20 69 73 20 4e 55 4c 4c 20 28  Master is NULL (
2cdc0 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
2cdd0 6c 29 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61  l), then this ca
2cde0 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  ll is a no-op.. 
2cdf0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77     */.    rc = w
2ce00 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
2ce10 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  l(pPager, zMaste
2ce20 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
2ce30 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2ce40 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
2ce50 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20  e_exit;..    /* 
2ce60 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
2ce70 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 61 74   file. If the at
2ce80 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74 69  omic-update opti
2ce90 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 65 69 6e  mization is bein
2cea0 67 0a 20 20 20 20 2a 2a 20 75 73 65 64 2c 20 74  g.    ** used, t
2ceb0 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f  his call will no
2cec0 74 20 63 72 65 61 74 65 20 74 68 65 20 6a 6f 75  t create the jou
2ced0 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 70 65 72  rnal file or per
2cee0 66 6f 72 6d 20 61 6e 79 0a 20 20 20 20 2a 2a 20  form any.    ** 
2cef0 72 65 61 6c 20 49 4f 2e 0a 20 20 20 20 2a 2f 0a  real IO..    */.
2cf00 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
2cf10 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
2cf20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2cf30 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
2cf40 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
2cf50 3b 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ;..    /* Write 
2cf60 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
2cf70 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2cf80 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 72 63 20  file. */.    rc 
2cf90 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
2cfa0 67 65 6c 69 73 74 28 73 71 6c 69 74 65 33 50 63  gelist(sqlite3Pc
2cfb0 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
2cfc0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29 3b  ager->pPCache));
2cfd0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2cfe0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2cff0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
2d000 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44  TE_IOERR_BLOCKED
2d010 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 63   );.      goto c
2d020 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
2d030 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
2d040 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
2d050 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50  anAll(pPager->pP
2d060 43 61 63 68 65 29 3b 0a 0a 20 20 20 20 2f 2a 20  Cache);..    /* 
2d070 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  If the file on d
2d080 69 73 6b 20 69 73 20 6e 6f 74 20 74 68 65 20 73  isk is not the s
2d090 61 6d 65 20 73 69 7a 65 20 61 73 20 74 68 65 20  ame size as the 
2d0a0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 0a  database image,.
2d0b0 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65 20      ** then use 
2d0c0 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 20 74  pager_truncate t
2d0d0 6f 20 67 72 6f 77 20 6f 72 20 73 68 72 69 6e 6b  o grow or shrink
2d0e0 20 74 68 65 20 66 69 6c 65 20 68 65 72 65 2e 0a   the file here..
2d0f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2d100 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 21 3d 70  Pager->dbSize!=p
2d110 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
2d120 65 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  e ){.      Pgno 
2d130 6e 4e 65 77 20 3d 20 70 50 61 67 65 72 2d 3e 64  nNew = pPager->d
2d140 62 53 69 7a 65 20 2d 20 28 70 50 61 67 65 72 2d  bSize - (pPager-
2d150 3e 64 62 53 69 7a 65 3d 3d 50 41 47 45 52 5f 4d  >dbSize==PAGER_M
2d160 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b  J_PGNO(pPager));
2d170 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2d180 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
2d190 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  GER_EXCLUSIVE );
2d1a0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2d1b0 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
2d1c0 72 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, nNew);.      
2d1d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2d1e0 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f  K ) goto commit_
2d1f0 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
2d200 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69      }..    /* Fi
2d210 6e 61 6c 6c 79 2c 20 73 79 6e 63 20 74 68 65 20  nally, sync the 
2d220 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
2d230 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
2d240 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e 6f  r->noSync && !no
2d250 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63  Sync ){.      rc
2d260 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
2d270 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
2d280 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
2d290 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52  ;.    }.    IOTR
2d2a0 41 43 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c  ACE(("DBSYNC %p\
2d2b0 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20  n", pPager))..  
2d2c0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
2d2d0 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a  = PAGER_SYNCED;.
2d2e0 20 20 7d 0a 0a 63 6f 6d 6d 69 74 5f 70 68 61 73    }..commit_phas
2d2f0 65 5f 6f 6e 65 5f 65 78 69 74 3a 0a 20 20 72 65  e_one_exit:.  re
2d300 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
2d310 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  ** When this fun
2d320 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
2d330 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2d340 6c 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70  le has been comp
2d350 6c 65 74 65 6c 79 0a 2a 2a 20 75 70 64 61 74 65  letely.** update
2d360 64 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65  d to reflect the
2d370 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
2d380 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
2d390 6e 73 61 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  nsaction and.** 
2d3a0 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20  synced to disk. 
2d3b0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2d3c0 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 69 6e   still exists in
2d3d0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
2d3e0 20 0a 2a 2a 20 74 68 6f 75 67 68 2c 20 61 6e 64   .** though, and
2d3f0 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
2d400 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69  curs at this poi
2d410 6e 74 20 69 74 20 77 69 6c 6c 20 65 76 65 6e 74  nt it will event
2d420 75 61 6c 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64  ually.** be used
2d430 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   as a hot-journa
2d440 6c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  l and the curren
2d450 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  t transaction ro
2d460 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
2d470 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   This function f
2d480 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75  inalizes the jou
2d490 72 6e 61 6c 20 66 69 6c 65 2c 20 65 69 74 68 65  rnal file, eithe
2d4a0 72 20 62 79 20 64 65 6c 65 74 69 6e 67 2c 20 0a  r by deleting, .
2d4b0 2a 2a 20 74 72 75 6e 63 61 74 69 6e 67 20 6f 72  ** truncating or
2d4c0 20 70 61 72 74 69 61 6c 6c 79 20 7a 65 72 6f 69   partially zeroi
2d4d0 6e 67 20 69 74 2c 20 73 6f 20 74 68 61 74 20 69  ng it, so that i
2d4e0 74 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  t cannot be used
2d4f0 20 0a 2a 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f 75   .** for hot-jou
2d500 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f  rnal rollback. O
2d510 6e 63 65 20 74 68 69 73 20 69 73 20 64 6f 6e 65  nce this is done
2d520 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2d530 20 69 73 0a 2a 2a 20 69 72 72 65 76 6f 63 61 62   is.** irrevocab
2d540 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a  ly committed..**
2d550 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
2d560 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72  occurs, an IO er
2d570 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2d580 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67  rned and the pag
2d590 65 72 0a 2a 2a 20 6d 6f 76 65 73 20 69 6e 74 6f  er.** moves into
2d5a0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2d5b0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
2d5c0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2d5d0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
2d5e0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
2d5f0 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61  seTwo(Pager *pPa
2d600 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
2d610 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2d620 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d630 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
2d640 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
2d650 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  e should not be 
2d660 63 61 6c 6c 65 64 20 69 66 20 61 20 70 72 69 6f  called if a prio
2d670 72 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  r error has occu
2d680 72 72 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20 69  rred..  ** But i
2d690 66 20 28 64 75 65 20 74 6f 20 61 20 63 6f 64 69  f (due to a codi
2d6a0 6e 67 20 65 72 72 6f 72 20 65 6c 73 65 77 68 65  ng error elsewhe
2d6b0 72 65 20 69 6e 20 74 68 65 20 73 79 73 74 65 6d  re in the system
2d6c0 29 20 69 74 20 64 6f 65 73 20 67 65 74 0a 20 20  ) it does get.  
2d6d0 2a 2a 20 63 61 6c 6c 65 64 2c 20 6a 75 73 74 20  ** called, just 
2d6e0 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
2d6f0 65 72 72 6f 72 20 63 6f 64 65 20 77 69 74 68 6f  error code witho
2d700 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
2d710 67 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  g. */.  if( NEVE
2d720 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
2d730 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67  e) ) return pPag
2d740 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
2d750 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
2d760 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63   should not be c
2d770 61 6c 6c 65 64 20 69 66 20 74 68 65 20 70 61 67  alled if the pag
2d780 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 61 74 20  er is not in at 
2d790 6c 65 61 73 74 0a 20 20 2a 2a 20 50 41 47 45 52  least.  ** PAGER
2d7a0 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e  _RESERVED state.
2d7b0 20 41 6e 64 20 69 6e 64 65 65 64 20 53 51 4c 69   And indeed SQLi
2d7c0 74 65 20 6e 65 76 65 72 20 64 6f 65 73 20 74 68  te never does th
2d7d0 69 73 2e 20 42 75 74 20 69 74 20 69 73 0a 20 20  is. But it is.  
2d7e0 2a 2a 20 6e 69 63 65 20 74 6f 20 68 61 76 65 20  ** nice to have 
2d7f0 74 68 69 73 20 64 65 66 65 6e 73 69 76 65 20 74  this defensive t
2d800 65 73 74 20 68 65 72 65 20 61 6e 79 77 61 79 2e  est here anyway.
2d810 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  .  */.  if( NEVE
2d820 52 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  R(pPager->state<
2d830 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 29 20  PAGER_RESERVED) 
2d840 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2d850 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 41 6e 20  ERROR;..  /* An 
2d860 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 49 66  optimization. If
2d870 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61   the database wa
2d880 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d  s not actually m
2d890 6f 64 69 66 69 65 64 20 64 75 72 69 6e 67 0a 20  odified during. 
2d8a0 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63   ** this transac
2d8b0 74 69 6f 6e 2c 20 74 68 65 20 70 61 67 65 72 20  tion, the pager 
2d8c0 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
2d8d0 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 61 6e 64  clusive-mode and
2d8e0 20 69 73 0a 20 20 2a 2a 20 75 73 69 6e 67 20 70   is.  ** using p
2d8f0 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61  ersistent journa
2d900 6c 73 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  ls, then this fu
2d910 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
2d920 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  p..  **.  ** The
2d930 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
2d940 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65  urnal file curre
2d950 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20 61 20  ntly contains a 
2d960 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 20 0a  single journal .
2d970 20 20 2a 2a 20 68 65 61 64 65 72 20 77 69 74 68    ** header with
2d980 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
2d990 73 65 74 20 74 6f 20 30 2e 20 49 66 20 73 75 63  set to 0. If suc
2d9a0 68 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75  h a journal is u
2d9b0 73 65 64 20 61 73 0a 20 20 2a 2a 20 61 20 68 6f  sed as.  ** a ho
2d9c0 74 2d 6a 6f 75 72 6e 61 6c 20 64 75 72 69 6e 67  t-journal during
2d9d0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
2d9e0 6c 62 61 63 6b 2c 20 30 20 63 68 61 6e 67 65 73  lback, 0 changes
2d9f0 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 0a 20 20   will be made.  
2da00 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
2da10 73 65 20 66 69 6c 65 2e 20 53 6f 20 74 68 65 72  se file. So ther
2da20 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
2da30 7a 65 72 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  zero the journal
2da40 20 0a 20 20 2a 2a 20 68 65 61 64 65 72 2e 20 53   .  ** header. S
2da50 69 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69  ince the pager i
2da60 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
2da70 6f 64 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ode, there is no
2da80 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 64 72   need.  ** to dr
2da90 6f 70 20 61 6e 79 20 6c 6f 63 6b 73 20 65 69 74  op any locks eit
2daa0 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  her..  */.  if( 
2dab0 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
2dac0 65 64 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  ed==0 && pPager-
2dad0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
2dae0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
2daf0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
2db00 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
2db10 53 49 53 54 0a 20 20 29 7b 0a 20 20 20 20 61 73  SIST.  ){.    as
2db20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
2db30 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
2db40 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
2db50 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
2db60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
2db70 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4f   PAGERTRACE(("CO
2db80 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
2db90 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
2dba0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2dbb0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59  >state==PAGER_SY
2dbc0 4e 43 45 44 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c  NCED || MEMDB ||
2dbd0 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69   !pPager->dbModi
2dbe0 66 69 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 70  fied );.  rc = p
2dbf0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
2dc00 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61  tion(pPager, pPa
2dc10 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b  ger->setMaster);
2dc20 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
2dc30 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
2dc40 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  );.}../*.** Roll
2dc50 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73  back all changes
2dc60 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  . The database f
2dc70 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47  alls back to PAG
2dc80 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a  ER_SHARED mode..
2dc90 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
2dca0 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 77 6f  ion performs two
2dcb0 20 74 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   tasks:.**.**   
2dcc0 31 29 20 49 74 20 72 6f 6c 6c 73 20 62 61 63 6b  1) It rolls back
2dcd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2dce0 65 2c 20 72 65 73 74 6f 72 69 6e 67 20 61 6c 6c  e, restoring all
2dcf0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
2dd00 6e 64 20 0a 2a 2a 20 20 20 20 20 20 69 6e 2d 6d  nd .**      in-m
2dd10 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65  emory cache page
2dd20 73 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 74  s to the state t
2dd30 68 65 79 20 77 65 72 65 20 69 6e 20 77 68 65 6e  hey were in when
2dd40 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2dd50 0a 2a 2a 20 20 20 20 20 20 77 61 73 20 6f 70 65  .**      was ope
2dd60 6e 65 64 2c 20 61 6e 64 0a 2a 2a 20 20 20 32 29  ned, and.**   2)
2dd70 20 49 74 20 66 69 6e 61 6c 69 7a 65 73 20 74 68   It finalizes th
2dd80 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
2dd90 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  so that it is no
2dda0 74 20 75 73 65 64 20 66 6f 72 20 68 6f 74 0a 2a  t used for hot.*
2ddb0 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20  *      rollback 
2ddc0 61 74 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20  at any point in 
2ddd0 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a  the future..**.*
2dde0 2a 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  * subject to the
2ddf0 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 61 6c 69   following quali
2de00 66 69 63 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  fications:.**.**
2de10 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61   * If the journa
2de20 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 79 65  l file is not ye
2de30 74 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  t open when this
2de40 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2de50 6c 65 64 2c 0a 2a 2a 20 20 20 74 68 65 6e 20 6f  led,.**   then o
2de60 6e 6c 79 20 28 32 29 20 69 73 20 70 65 72 66 6f  nly (2) is perfo
2de70 72 6d 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  rmed. In this ca
2de80 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6a  se there is no j
2de90 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
2dea0 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a   to roll back..*
2deb0 2a 0a 2a 2a 20 2a 20 49 66 20 69 6e 20 61 6e 20  *.** * If in an 
2dec0 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65  error state othe
2ded0 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55  r than SQLITE_FU
2dee0 4c 4c 2c 20 74 68 65 6e 20 74 61 73 6b 20 28 31  LL, then task (1
2def0 29 20 69 73 20 0a 2a 2a 20 20 20 70 65 72 66 6f  ) is .**   perfo
2df00 72 6d 65 64 2e 20 49 66 20 73 75 63 63 65 73 73  rmed. If success
2df10 66 75 6c 2c 20 74 61 73 6b 20 28 32 29 2e 20 52  ful, task (2). R
2df20 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
2df30 20 6f 75 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66   outcome.**   of
2df40 20 65 69 74 68 65 72 2c 20 74 68 65 20 65 72 72   either, the err
2df50 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
2df60 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
2df70 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a  to the caller.**
2df80 20 20 20 28 69 2e 65 2e 20 65 69 74 68 65 72 20     (i.e. either 
2df90 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20  SQLITE_IOERR or 
2dfa0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e  SQLITE_CORRUPT).
2dfb0 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20  .**.** * If the 
2dfc0 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47 45  pager is in PAGE
2dfd0 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65  R_RESERVED state
2dfe0 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28  , then attempt (
2dff0 31 29 2e 20 57 68 65 74 68 65 72 0a 2a 2a 20 20  1). Whether.**  
2e000 20 6f 72 20 6e 6f 74 20 28 31 29 20 69 73 20 73   or not (1) is s
2e010 75 63 63 75 73 73 66 75 6c 2c 20 61 6c 73 6f 20  uccussful, also 
2e020 61 74 74 65 6d 70 74 20 28 32 29 2e 20 49 66 20  attempt (2). If 
2e030 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
2e040 72 6e 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4f  rn.**   SQLITE_O
2e050 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65 6e  K. Otherwise, en
2e060 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
2e070 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ate and return t
2e080 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 20 20 65  he first .**   e
2e090 72 72 6f 72 20 63 6f 64 65 20 65 6e 63 6f 75 6e  rror code encoun
2e0a0 74 65 72 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  tered. .**.**   
2e0b0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2e0c0 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
2e0d0 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
2e0e0 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f  e was written to
2e0f0 2e 20 0a 2a 2a 20 20 20 53 6f 20 69 73 20 73 61  . .**   So is sa
2e100 66 65 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  fe to finalize t
2e110 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2e120 65 76 65 6e 20 69 66 20 74 68 65 20 70 6c 61 79  even if the play
2e130 62 61 63 6b 20 0a 2a 2a 20 20 20 28 6f 70 65 72  back .**   (oper
2e140 61 74 69 6f 6e 20 31 29 20 66 61 69 6c 65 64 2e  ation 1) failed.
2e150 20 48 6f 77 65 76 65 72 20 74 68 65 20 70 61 67   However the pag
2e160 65 72 20 6d 75 73 74 20 65 6e 74 65 72 20 74 68  er must enter th
2e170 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a  e error state.**
2e180 20 20 20 61 73 20 74 68 65 20 63 6f 6e 74 65 6e     as the conten
2e190 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d  ts of the in-mem
2e1a0 6f 72 79 20 63 61 63 68 65 20 61 72 65 20 6e 6f  ory cache are no
2e1b0 77 20 73 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a  w suspect..**.**
2e1c0 20 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 69   * Finally, if i
2e1d0 6e 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  n PAGER_EXCLUSIV
2e1e0 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74  E state, then at
2e1f0 74 65 6d 70 74 20 28 31 29 2e 20 4f 6e 6c 79 0a  tempt (1). Only.
2e200 2a 2a 20 20 20 61 74 74 65 6d 70 74 20 28 32 29  **   attempt (2)
2e210 20 69 66 20 28 31 29 20 69 73 20 73 75 63 63 65   if (1) is succe
2e220 73 73 66 75 6c 2e 20 52 65 74 75 72 6e 20 53 51  ssful. Return SQ
2e230 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
2e240 73 73 66 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65  ssful,.**   othe
2e250 72 77 69 73 65 20 65 6e 74 65 72 20 74 68 65 20  rwise enter the 
2e260 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20  error state and 
2e270 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
2e280 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 0a   code from the .
2e290 2a 2a 20 20 20 66 61 69 6c 69 6e 67 20 6f 70 65  **   failing ope
2e2a0 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ration..**.**   
2e2b0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2e2c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d   database file m
2e2d0 61 79 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  ay have been wri
2e2e0 74 74 65 6e 20 74 6f 2e 20 53 6f 20 69 66 20 74  tten to. So if t
2e2f0 68 65 0a 2a 2a 20 20 20 70 6c 61 79 62 61 63 6b  he.**   playback
2e300 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e   operation did n
2e310 6f 74 20 73 75 63 63 65 65 64 20 69 74 20 77 6f  ot succeed it wo
2e320 75 6c 64 20 6e 6f 74 20 62 65 20 73 61 66 65 20  uld not be safe 
2e330 74 6f 20 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20  to finalize.**  
2e340 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2e350 65 2e 20 49 74 20 6e 65 65 64 73 20 74 6f 20 62  e. It needs to b
2e360 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  e left in the fi
2e370 6c 65 2d 73 79 73 74 65 6d 20 73 6f 20 74 68 61  le-system so tha
2e380 74 0a 2a 2a 20 20 20 73 6f 6d 65 20 6f 74 68 65  t.**   some othe
2e390 72 20 70 72 6f 63 65 73 73 20 63 61 6e 20 75 73  r process can us
2e3a0 65 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 20  e it to restore 
2e3b0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 74 61  the database sta
2e3c0 74 65 20 28 62 79 0a 2a 2a 20 20 20 68 6f 74 2d  te (by.**   hot-
2e3d0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
2e3e0 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
2e3f0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50  3PagerRollback(P
2e400 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2e410 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2e420 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
2e430 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2e440 63 6f 64 65 20 2a 2f 0a 20 20 50 41 47 45 52 54  code */.  PAGERT
2e450 52 41 43 45 28 28 22 52 4f 4c 4c 42 41 43 4b 20  RACE(("ROLLBACK 
2e460 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
2e470 50 61 67 65 72 29 29 29 3b 0a 20 20 69 66 28 20  Pager)));.  if( 
2e480 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66  !pPager->dbModif
2e490 69 65 64 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70  ied || !isOpen(p
2e4a0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
2e4b0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e     rc = pager_en
2e4c0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
2e4d0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65  ager, pPager->se
2e4e0 74 4d 61 73 74 65 72 29 3b 0a 20 20 7d 65 6c 73  tMaster);.  }els
2e4f0 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72  e if( pPager->er
2e500 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  rCode && pPager-
2e510 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
2e520 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28  _FULL ){.    if(
2e530 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
2e540 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
2e550 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70  ){.      pager_p
2e560 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
2e570 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  0);.    }.    rc
2e580 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
2e590 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  de;.  }else{.   
2e5a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
2e5b0 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
2e5c0 45 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ED ){.      int 
2e5d0 72 63 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rc2;.      rc = 
2e5e0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
2e5f0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
2e600 20 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64   rc2 = pager_end
2e610 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
2e620 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74  ger, pPager->set
2e630 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69  Master);.      i
2e640 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e650 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2e660 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc2;.      }.  
2e670 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2e680 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
2e690 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  ck(pPager, 0);. 
2e6a0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d     }..    if( !M
2e6b0 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50  EMDB ){.      pP
2e6c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
2e6d0 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  d = 0;.    }..  
2e6e0 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
2e6f0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61   occurs during a
2e700 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61   ROLLBACK, we ca
2e710 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73  n no longer trus
2e720 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  t the pager.    
2e730 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c  ** cache. So cal
2e740 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20  l pager_error() 
2e750 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20 74  on the way out t
2e760 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72  o make any error
2e770 20 0a 20 20 20 20 2a 2a 20 70 65 72 73 69 73 74   .    ** persist
2e780 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ent..    */.    
2e790 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72  rc = pager_error
2e7a0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
2e7b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2e7c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
2e7d0 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62  RUE if the datab
2e7e0 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  ase file is open
2e7f0 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52  ed read-only.  R
2e800 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69  eturn FALSE.** i
2e810 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
2e820 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72  s (in theory) wr
2e830 69 74 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71  itable..*/.u8 sq
2e840 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
2e850 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67  only(Pager *pPag
2e860 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
2e870 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a  ager->readOnly;.
2e880 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2e890 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
2e8a0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
2e8b0 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pager..*/.int sq
2e8c0 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
2e8d0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
2e8e0 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
2e8f0 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
2e900 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
2e910 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  e);.}../*.** Ret
2e920 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
2e930 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
2e940 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
2e950 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ge..*/.int sqlit
2e960 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
2e970 75 6e 74 28 44 62 50 61 67 65 20 2a 70 50 61 67  unt(DbPage *pPag
2e980 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e){.  return sql
2e990 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52 65  ite3PcachePageRe
2e9a0 66 63 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d  fcount(pPage);.}
2e9b0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2e9c0 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  TEST./*.** This 
2e9d0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
2e9e0 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
2e9f0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a  analysis only..*
2ea00 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61  /.int *sqlite3Pa
2ea10 67 65 72 53 74 61 74 73 28 50 61 67 65 72 20 2a  gerStats(Pager *
2ea20 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69  pPager){.  stati
2ea30 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61  c int a[11];.  a
2ea40 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61  [0] = sqlite3Pca
2ea50 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
2ea60 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
2ea70 61 5b 31 5d 20 3d 20 73 71 6c 69 74 65 33 50 63  a[1] = sqlite3Pc
2ea80 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50  achePagecount(pP
2ea90 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
2eaa0 20 20 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33    a[2] = sqlite3
2eab0 50 63 61 63 68 65 47 65 74 43 61 63 68 65 73 69  PcacheGetCachesi
2eac0 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
2ead0 68 65 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50  he);.  a[3] = pP
2eae0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
2eaf0 64 20 3f 20 28 69 6e 74 29 20 70 50 61 67 65 72  d ? (int) pPager
2eb00 2d 3e 64 62 53 69 7a 65 20 3a 20 2d 31 3b 0a 20  ->dbSize : -1;. 
2eb10 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[4] = pPager->
2eb20 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20  state;.  a[5] = 
2eb30 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
2eb40 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72  .  a[6] = pPager
2eb50 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d  ->nHit;.  a[7] =
2eb60 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a   pPager->nMiss;.
2eb70 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20    a[8] = 0;  /* 
2eb80 55 73 65 64 20 74 6f 20 62 65 20 70 50 61 67 65  Used to be pPage
2eb90 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b  r->nOvfl */.  a[
2eba0 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  9] = pPager->nRe
2ebb0 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50  ad;.  a[10] = pP
2ebc0 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20  ager->nWrite;.  
2ebd0 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64  return a;.}.#end
2ebe0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
2ebf0 20 74 72 75 65 20 69 66 20 74 68 69 73 20 69 73   true if this is
2ec00 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
2ec10 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
2ec20 74 65 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28  te3PagerIsMemdb(
2ec30 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2ec40 20 20 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a    return MEMDB;.
2ec50 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
2ec60 68 61 74 20 74 68 65 72 65 20 61 72 65 20 61 74  hat there are at
2ec70 20 6c 65 61 73 74 20 6e 53 61 76 65 70 6f 69 6e   least nSavepoin
2ec80 74 20 73 61 76 65 70 6f 69 6e 74 73 20 6f 70 65  t savepoints ope
2ec90 6e 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 0a  n. If there are.
2eca0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 6c 65 73  ** currently les
2ecb0 73 20 74 68 61 6e 20 6e 53 61 76 65 70 6f 69 6e  s than nSavepoin
2ecc0 74 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 6f 70  ts open, then op
2ecd0 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  en one or more s
2ece0 61 76 65 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  avepoints.** to 
2ecf0 6d 61 6b 65 20 75 70 20 74 68 65 20 64 69 66 66  make up the diff
2ed00 65 72 65 6e 63 65 2e 20 49 66 20 74 68 65 20 6e  erence. If the n
2ed10 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
2ed20 6e 74 73 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  nts is already.*
2ed30 2a 20 65 71 75 61 6c 20 74 6f 20 6e 53 61 76 65  * equal to nSave
2ed40 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73  point, then this
2ed50 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
2ed60 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  o-op..**.** If a
2ed70 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2ed80 6f 6e 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  on fails, SQLITE
2ed90 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
2eda0 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ed. If an error 
2edb0 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65  .** occurs while
2edc0 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 73 75 62   opening the sub
2edd0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74  -journal file, t
2ede0 68 65 6e 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  hen an IO error 
2edf0 63 6f 64 65 20 69 73 0a 2a 2a 20 72 65 74 75 72  code is.** retur
2ee00 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
2ee10 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
2ee20 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
2ee30 65 6e 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  enSavepoint(Page
2ee40 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e  r *pPager, int n
2ee50 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
2ee60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2ee70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ee80 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2ee90 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2eea0 6e 43 75 72 72 65 6e 74 20 3d 20 70 50 61 67 65  nCurrent = pPage
2eeb0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  r->nSavepoint;  
2eec0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
2eed0 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70   number of savep
2eee0 6f 69 6e 74 73 20 2a 2f 0a 0a 20 20 69 66 28 20  oints */..  if( 
2eef0 6e 53 61 76 65 70 6f 69 6e 74 3e 6e 43 75 72 72  nSavepoint>nCurr
2ef00 65 6e 74 20 26 26 20 70 50 61 67 65 72 2d 3e 75  ent && pPager->u
2ef10 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
2ef20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
2ef30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef40 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
2ef50 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
2ef60 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f  .    PagerSavepo
2ef70 69 6e 74 20 2a 61 4e 65 77 3b 20 20 20 20 20 20  int *aNew;      
2ef80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ef90 4e 65 77 20 50 61 67 65 72 2e 61 53 61 76 65 70  New Pager.aSavep
2efa0 6f 69 6e 74 20 61 72 72 61 79 20 2a 2f 0a 0a 20  oint array */.. 
2efb0 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65     /* Either the
2efc0 72 65 20 69 73 20 6e 6f 20 61 63 74 69 76 65 20  re is no active 
2efd0 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 73  journal or the s
2efe0 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  ub-journal is op
2eff0 65 6e 20 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  en or .    ** th
2f000 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77  e journal is alw
2f010 61 79 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65  ays stored in me
2f020 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 61 73 73 65  mory */.    asse
2f030 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  rt( pPager->nSav
2f040 65 70 6f 69 6e 74 3d 3d 30 20 7c 7c 20 69 73 4f  epoint==0 || isO
2f050 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
2f060 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ) ||.           
2f070 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2f080 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
2f090 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
2f0a0 3b 0a 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74  ;..    /* Grow t
2f0b0 68 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  he Pager.aSavepo
2f0c0 69 6e 74 20 61 72 72 61 79 20 75 73 69 6e 67 20  int array using 
2f0d0 72 65 61 6c 6c 6f 63 28 29 2e 20 52 65 74 75 72  realloc(). Retur
2f0e0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20  n SQLITE_NOMEM. 
2f0f0 20 20 20 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c     ** if the all
2f100 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20 4f  ocation fails. O
2f110 74 68 65 72 77 69 73 65 2c 20 7a 65 72 6f 20 74  therwise, zero t
2f120 68 65 20 6e 65 77 20 70 6f 72 74 69 6f 6e 20 69  he new portion i
2f130 6e 20 63 61 73 65 20 61 20 0a 20 20 20 20 2a 2a  n case a .    **
2f140 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
2f150 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 6f 70  occurs while pop
2f160 75 6c 61 74 69 6e 67 20 69 74 20 69 6e 20 74 68  ulating it in th
2f170 65 20 66 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20  e for(...) loop 
2f180 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  below..    */.  
2f190 20 20 61 4e 65 77 20 3d 20 28 50 61 67 65 72 53    aNew = (PagerS
2f1a0 61 76 65 70 6f 69 6e 74 20 2a 29 73 71 6c 69 74  avepoint *)sqlit
2f1b0 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  e3Realloc(.     
2f1c0 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
2f1d0 70 6f 69 6e 74 2c 20 73 69 7a 65 6f 66 28 50 61  point, sizeof(Pa
2f1e0 67 65 72 53 61 76 65 70 6f 69 6e 74 29 2a 6e 53  gerSavepoint)*nS
2f1f0 61 76 65 70 6f 69 6e 74 0a 20 20 20 20 29 3b 0a  avepoint.    );.
2f200 20 20 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b      if( !aNew ){
2f210 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2f220 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2f230 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e  }.    memset(&aN
2f240 65 77 5b 6e 43 75 72 72 65 6e 74 5d 2c 20 30 2c  ew[nCurrent], 0,
2f250 20 28 6e 53 61 76 65 70 6f 69 6e 74 2d 6e 43 75   (nSavepoint-nCu
2f260 72 72 65 6e 74 29 20 2a 20 73 69 7a 65 6f 66 28  rrent) * sizeof(
2f270 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 29 29  PagerSavepoint))
2f280 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53  ;.    pPager->aS
2f290 61 76 65 70 6f 69 6e 74 20 3d 20 61 4e 65 77 3b  avepoint = aNew;
2f2a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61  .    pPager->nSa
2f2b0 76 65 70 6f 69 6e 74 20 3d 20 6e 53 61 76 65 70  vepoint = nSavep
2f2c0 6f 69 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f  oint;..    /* Po
2f2d0 70 75 6c 61 74 65 20 74 68 65 20 50 61 67 65 72  pulate the Pager
2f2e0 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74  Savepoint struct
2f2f0 75 72 65 73 20 6a 75 73 74 20 61 6c 6c 6f 63 61  ures just alloca
2f300 74 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ted. */.    for(
2f310 69 69 3d 6e 43 75 72 72 65 6e 74 3b 20 69 69 3c  ii=nCurrent; ii<
2f320 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
2f330 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2f340 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
2f350 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 61 4e  alid );.      aN
2f360 65 77 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d 20 70  ew[ii].nOrig = p
2f370 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
2f380 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28       if( isOpen(
2f390 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
2f3a0 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e 6a  ALWAYS(pPager->j
2f3b0 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 29 7b 0a  ournalOff>0) ){.
2f3c0 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d          aNew[ii]
2f3d0 2e 69 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  .iOffset = pPage
2f3e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
2f3f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2f400 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66      aNew[ii].iOf
2f410 66 73 65 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48  fset = JOURNAL_H
2f420 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
2f430 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 4e 65       }.      aNe
2f440 77 5b 69 69 5d 2e 69 53 75 62 52 65 63 20 3d 20  w[ii].iSubRec = 
2f450 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b  pPager->nSubRec;
2f460 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e  .      aNew[ii].
2f470 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 73  pInSavepoint = s
2f480 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
2f490 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  te(pPager->dbSiz
2f4a0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 61  e);.      if( !a
2f4b0 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  New[ii].pInSavep
2f4c0 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  oint ){.        
2f4d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2f4e0 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
2f4f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20   }..    /* Open 
2f500 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c  the sub-journal,
2f510 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   if it is not al
2f520 72 65 61 64 79 20 6f 70 65 6e 65 64 2e 20 2a 2f  ready opened. */
2f530 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75  .    rc = openSu
2f540 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  bJournal(pPager)
2f550 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2f560 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2f570 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2f580 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  lled to rollback
2f590 20 6f 72 20 72 65 6c 65 61 73 65 20 28 63 6f 6d   or release (com
2f5a0 6d 69 74 29 20 61 20 73 61 76 65 70 6f 69 6e 74  mit) a savepoint
2f5b0 2e 0a 2a 2a 20 54 68 65 20 73 61 76 65 70 6f 69  ..** The savepoi
2f5c0 6e 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6f 72  nt to release or
2f5d0 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 20 6e   rollback need n
2f5e0 6f 74 20 62 65 20 74 68 65 20 6d 6f 73 74 20 72  ot be the most r
2f5f0 65 63 65 6e 74 6c 79 20 0a 2a 2a 20 63 72 65 61  ecently .** crea
2f600 74 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a  ted savepoint..*
2f610 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6f  *.** Parameter o
2f620 70 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68  p is always eith
2f630 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  er SAVEPOINT_ROL
2f640 4c 42 41 43 4b 20 6f 72 20 53 41 56 45 50 4f 49  LBACK or SAVEPOI
2f650 4e 54 5f 52 45 4c 45 41 53 45 2e 0a 2a 2a 20 49  NT_RELEASE..** I
2f660 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e  f it is SAVEPOIN
2f670 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20  T_RELEASE, then 
2f680 72 65 6c 65 61 73 65 20 61 6e 64 20 64 65 73 74  release and dest
2f690 72 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69 6e  roy the savepoin
2f6a0 74 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20  t with.** index 
2f6b0 69 53 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69  iSavepoint. If i
2f6c0 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  t is SAVEPOINT_R
2f6d0 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 72 6f  OLLBACK, then ro
2f6e0 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67  llback all chang
2f6f0 65 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20  es.** that have 
2f700 6f 63 63 75 72 72 65 64 20 73 69 6e 63 65 20 74  occurred since t
2f710 68 65 20 73 70 65 63 69 66 69 65 64 20 73 61 76  he specified sav
2f720 65 70 6f 69 6e 74 20 77 61 73 20 63 72 65 61 74  epoint was creat
2f730 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61  ed..**.** The sa
2f740 76 65 70 6f 69 6e 74 20 74 6f 20 72 6f 6c 6c 62  vepoint to rollb
2f750 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 20 69  ack or release i
2f760 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  s identified by 
2f770 70 61 72 61 6d 65 74 65 72 20 0a 2a 2a 20 69 53  parameter .** iS
2f780 61 76 65 70 6f 69 6e 74 2e 20 41 20 76 61 6c 75  avepoint. A valu
2f790 65 20 6f 66 20 30 20 6d 65 61 6e 73 20 74 6f 20  e of 0 means to 
2f7a0 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 6f  operate on the o
2f7b0 75 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69  utermost savepoi
2f7c0 6e 74 0a 2a 2a 20 28 74 68 65 20 66 69 72 73 74  nt.** (the first
2f7d0 20 63 72 65 61 74 65 64 29 2e 20 41 20 76 61 6c   created). A val
2f7e0 75 65 20 6f 66 20 28 50 61 67 65 72 2e 6e 53 61  ue of (Pager.nSa
2f7f0 76 65 70 6f 69 6e 74 2d 31 29 20 6d 65 61 6e 73  vepoint-1) means
2f800 20 6f 70 65 72 61 74 65 0a 2a 2a 20 6f 6e 20 74   operate.** on t
2f810 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
2f820 20 63 72 65 61 74 65 64 20 73 61 76 65 70 6f 69   created savepoi
2f830 6e 74 2e 20 49 66 20 69 53 61 76 65 70 6f 69 6e  nt. If iSavepoin
2f840 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
2f850 6e 0a 2a 2a 20 28 50 61 67 65 72 2e 6e 53 61 76  n.** (Pager.nSav
2f860 65 70 6f 69 6e 74 2d 31 29 2c 20 74 68 65 6e 20  epoint-1), then 
2f870 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2f880 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
2f890 49 66 20 61 20 6e 65 67 61 74 69 76 65 20 76 61  If a negative va
2f8a0 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 74 6f  lue is passed to
2f8b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
2f8c0 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  then the current
2f8d0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
2f8e0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
2f8f0 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e  This is differen
2f900 74 20 74 6f 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a  t to calling .**
2f910 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
2f920 6c 62 61 63 6b 28 29 20 62 65 63 61 75 73 65 20  lback() because 
2f930 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
2f940 65 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65  es not terminate
2f950 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74  .** the transact
2f960 69 6f 6e 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ion or unlock th
2f970 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 6a  e database, it j
2f980 75 73 74 20 72 65 73 74 6f 72 65 73 20 74 68 65  ust restores the
2f990 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66   .** contents of
2f9a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
2f9b0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
2f9c0 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  ate. .**.** In a
2f9d0 6e 79 20 63 61 73 65 2c 20 61 6c 6c 20 73 61 76  ny case, all sav
2f9e0 65 70 6f 69 6e 74 73 20 77 69 74 68 20 61 6e 20  epoints with an 
2f9f0 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68  index greater th
2fa00 61 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 0a 2a  an iSavepoint .*
2fa10 2a 20 61 72 65 20 64 65 73 74 72 6f 79 65 64 2e  * are destroyed.
2fa20 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72 65   If this is a re
2fa30 6c 65 61 73 65 20 6f 70 65 72 61 74 69 6f 6e 20  lease operation 
2fa40 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  (op==SAVEPOINT_R
2fa50 45 4c 45 41 53 45 29 2c 0a 2a 2a 20 74 68 65 6e  ELEASE),.** then
2fa60 20 73 61 76 65 70 6f 69 6e 74 20 69 53 61 76 65   savepoint iSave
2fa70 70 6f 69 6e 74 20 69 73 20 61 6c 73 6f 20 64 65  point is also de
2fa80 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  stroyed..**.** T
2fa90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
2faa0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2fab0 4f 4d 45 4d 20 69 66 20 61 20 6d 65 6d 6f 72 79  OMEM if a memory
2fac0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
2fad0 73 2c 0a 2a 2a 20 6f 72 20 61 6e 20 49 4f 20 65  s,.** or an IO e
2fae0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20  rror code if an 
2faf0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
2fb00 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 20 62 61  while rolling ba
2fb10 63 6b 20 61 20 0a 2a 2a 20 73 61 76 65 70 6f 69  ck a .** savepoi
2fb20 6e 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 73  nt. If no errors
2fb30 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f   occur, SQLITE_O
2fb40 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
2fb50 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  / .int sqlite3Pa
2fb60 67 65 72 53 61 76 65 70 6f 69 6e 74 28 50 61 67  gerSavepoint(Pag
2fb70 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
2fb80 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69  op, int iSavepoi
2fb90 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nt){.  int rc = 
2fba0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
2fbb0 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f  sert( op==SAVEPO
2fbc0 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f  INT_RELEASE || o
2fbd0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
2fbe0 4c 42 41 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  LBACK );.  asser
2fbf0 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30  t( iSavepoint>=0
2fc00 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   || op==SAVEPOIN
2fc10 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 0a 20  T_ROLLBACK );.. 
2fc20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c   if( iSavepoint<
2fc30 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
2fc40 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69  nt ){.    int ii
2fc50 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2fc60 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
2fc70 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 65  e */.    int nNe
2fc80 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  w;          /* N
2fc90 75 6d 62 65 72 20 6f 66 20 72 65 6d 61 69 6e 69  umber of remaini
2fca0 6e 67 20 73 61 76 65 70 6f 69 6e 74 73 20 61 66  ng savepoints af
2fcb0 74 65 72 20 74 68 69 73 20 6f 70 2e 20 2a 2f 0a  ter this op. */.
2fcc0 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
2fcd0 75 74 20 68 6f 77 20 6d 61 6e 79 20 73 61 76 65  ut how many save
2fce0 70 6f 69 6e 74 73 20 77 69 6c 6c 20 73 74 69 6c  points will stil
2fcf0 6c 20 62 65 20 61 63 74 69 76 65 20 61 66 74 65  l be active afte
2fd00 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6f 70  r this.    ** op
2fd10 65 72 61 74 69 6f 6e 2e 20 53 74 6f 72 65 20 74  eration. Store t
2fd20 68 69 73 20 76 61 6c 75 65 20 69 6e 20 6e 4e 65  his value in nNe
2fd30 77 2e 20 54 68 65 6e 20 66 72 65 65 20 72 65 73  w. Then free res
2fd40 6f 75 72 63 65 73 20 61 73 73 6f 63 69 61 74 65  ources associate
2fd50 64 20 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 61  d .    ** with a
2fd60 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68  ny savepoints th
2fd70 61 74 20 61 72 65 20 64 65 73 74 72 6f 79 65 64  at are destroyed
2fd80 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
2fd90 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  on..    */.    n
2fda0 4e 65 77 20 3d 20 69 53 61 76 65 70 6f 69 6e 74  New = iSavepoint
2fdb0 20 2b 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   + (op==SAVEPOIN
2fdc0 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
2fdd0 20 66 6f 72 28 69 69 3d 6e 4e 65 77 3b 20 69 69   for(ii=nNew; ii
2fde0 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
2fdf0 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
2fe00 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
2fe10 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61  estroy(pPager->a
2fe20 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49  Savepoint[ii].pI
2fe30 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  nSavepoint);.   
2fe40 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e   }.    pPager->n
2fe50 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e 4e 65 77  Savepoint = nNew
2fe60 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
2fe70 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  s is a rollback 
2fe80 6f 70 65 72 61 74 69 6f 6e 2c 20 70 6c 61 79 62  operation, playb
2fe90 61 63 6b 20 74 68 65 20 73 70 65 63 69 66 69 65  ack the specifie
2fea0 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a 20 20 20  d savepoint..   
2feb0 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
2fec0 20 74 65 6d 70 2d 66 69 6c 65 2c 20 69 74 20 69   temp-file, it i
2fed0 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  s possible that 
2fee0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2fef0 20 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20   has.    ** not 
2ff00 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  yet been opened.
2ff10 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
2ff20 65 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f  ere have been no
2ff30 20 63 68 61 6e 67 65 73 20 74 6f 0a 20 20 20 20   changes to.    
2ff40 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
2ff50 66 69 6c 65 2c 20 73 6f 20 74 68 65 20 70 6c 61  file, so the pla
2ff60 79 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  yback operation 
2ff70 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a  can be skipped..
2ff80 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f      */.    if( o
2ff90 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
2ffa0 4c 42 41 43 4b 20 26 26 20 69 73 4f 70 65 6e 28  LBACK && isOpen(
2ffb0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
2ffc0 20 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70        PagerSavep
2ffd0 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74  oint *pSavepoint
2ffe0 20 3d 20 28 6e 4e 65 77 3d 3d 30 29 3f 30 3a 26   = (nNew==0)?0:&
2fff0 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
30000 6e 74 5b 6e 4e 65 77 2d 31 5d 3b 0a 20 20 20 20  nt[nNew-1];.    
30010 20 20 72 63 20 3d 20 70 61 67 65 72 50 6c 61 79    rc = pagerPlay
30020 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 70 50  backSavepoint(pP
30030 61 67 65 72 2c 20 70 53 61 76 65 70 6f 69 6e 74  ager, pSavepoint
30040 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
30050 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 29  rc!=SQLITE_DONE)
30060 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
30070 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72  * If this is a r
30080 65 6c 65 61 73 65 20 6f 66 20 74 68 65 20 6f 75  elease of the ou
30090 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e  termost savepoin
300a0 74 2c 20 74 72 75 6e 63 61 74 65 20 0a 20 20 20  t, truncate .   
300b0 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
300c0 6e 61 6c 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  nal to zero byte
300d0 73 20 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20 20  s in size. */.  
300e0 20 20 69 66 28 20 6e 4e 65 77 3d 3d 30 20 26 26    if( nNew==0 &&
300f0 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
30100 45 4c 45 41 53 45 20 26 26 20 69 73 4f 70 65 6e  ELEASE && isOpen
30110 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
30120 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
30130 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
30140 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
30150 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
30160 61 67 65 72 2d 3e 73 6a 66 64 2c 20 30 29 3b 0a  ager->sjfd, 0);.
30170 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53        pPager->nS
30180 75 62 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 7d  ubRec = 0;.    }
30190 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
301a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
301b0 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
301c0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
301d0 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  ase file..*/.con
301e0 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
301f0 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61  PagerFilename(Pa
30200 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
30210 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
30220 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
30230 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 46  ** Return the VF
30240 53 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  S structure for 
30250 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f  the pager..*/.co
30260 6e 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 20  nst sqlite3_vfs 
30270 2a 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73  *sqlite3PagerVfs
30280 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
30290 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
302a0 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pVfs;.}../*.**
302b0 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65   Return the file
302c0 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20   handle for the 
302d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 73  database file as
302e0 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
302f0 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69   the pager.  Thi
30300 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 4e  s might return N
30310 55 4c 4c 20 69 66 20 74 68 65 20 66 69 6c 65 20  ULL if the file 
30320 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20 62  has.** not yet b
30330 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73  een opened..*/.s
30340 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 71 6c  qlite3_file *sql
30350 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 50 61  ite3PagerFile(Pa
30360 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
30370 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66  return pPager->f
30380 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  d;.}../*.** Retu
30390 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
303a0 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  name of the jour
303b0 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  nal file..*/.con
303c0 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
303d0 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65  PagerJournalname
303e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
303f0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
30400 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f  ->zJournal;.}../
30410 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
30420 20 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c   if fsync() call
30430 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 66  s are disabled f
30440 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
30450 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
30460 69 66 20 66 73 79 6e 63 28 29 73 20 61 72 65 20  if fsync()s are 
30470 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c  executed normall
30480 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
30490 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67  3PagerNosync(Pag
304a0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
304b0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f  eturn pPager->no
304c0 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  Sync;.}..#ifdef 
304d0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
304e0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 72 65  ./*.** Set or re
304f0 74 72 69 65 76 65 20 74 68 65 20 63 6f 64 65 63  trieve the codec
30500 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a   for this pager.
30510 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
30520 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 6f  qlite3PagerSetCo
30530 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50  dec(.  Pager *pP
30540 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a  ager,.  void *(*
30550 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
30560 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20  id*,Pgno,int),. 
30570 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69   void (*xCodecSi
30580 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e  zeChng)(void*,in
30590 74 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 28  t,int),.  void (
305a0 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69  *xCodecFree)(voi
305b0 64 2a 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f  d*),.  void *pCo
305c0 64 65 63 0a 29 7b 0a 20 20 69 66 28 20 70 50 61  dec.){.  if( pPa
305d0 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20  ger->xCodecFree 
305e0 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ) pPager->xCodec
305f0 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f  Free(pPager->pCo
30600 64 65 63 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  dec);.  pPager->
30610 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b  xCodec = xCodec;
30620 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  .  pPager->xCode
30630 63 53 69 7a 65 43 68 6e 67 20 3d 20 78 43 6f 64  cSizeChng = xCod
30640 65 63 53 69 7a 65 43 68 6e 67 3b 0a 20 20 70 50  ecSizeChng;.  pP
30650 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
30660 20 3d 20 78 43 6f 64 65 63 46 72 65 65 3b 0a 20   = xCodecFree;. 
30670 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 20   pPager->pCodec 
30680 3d 20 70 43 6f 64 65 63 3b 0a 20 20 70 61 67 65  = pCodec;.  page
30690 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
306a0 65 72 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  er);.}.static vo
306b0 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
306c0 47 65 74 43 6f 64 65 63 28 50 61 67 65 72 20 2a  GetCodec(Pager *
306d0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
306e0 6e 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63  n pPager->pCodec
306f0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
30700 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
30710 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
30720 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 70   Move the page p
30730 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70  Pg to location p
30740 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  gno in the file.
30750 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
30760 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63  t be no referenc
30770 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70  es to the page p
30780 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65  reviously locate
30790 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68  d at.** pgno (wh
307a0 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f  ich we call pPgO
307b0 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61 74 20  ld) though that 
307c0 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  page is allowed 
307d0 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68  to be.** in cach
307e0 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  e.  If the page 
307f0 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74  previously locat
30800 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f  ed at pgno is no
30810 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
30820 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
30830 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20  rnal, it is not 
30840 70 75 74 20 74 68 65 72 65 20 62 79 20 62 79 20  put there by by 
30850 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
30860 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74  .** References t
30870 6f 20 74 68 65 20 70 61 67 65 20 70 50 67 20 72  o the page pPg r
30880 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64  emain valid. Upd
30890 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74  ating any.** met
308a0 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  a-data associate
308b0 64 20 77 69 74 68 20 70 50 67 20 28 69 2e 65 2e  d with pPg (i.e.
308c0 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20   data stored in 
308d0 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65 73  the nExtra bytes
308e0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  .** allocated al
308f0 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61 67  ong with the pag
30900 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  e) is the respon
30910 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
30920 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20  caller..**.** A 
30930 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
30940 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e 20   be active when 
30950 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
30960 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20  called. It used 
30970 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65  to be.** require
30980 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d 65  d that a stateme
30990 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
309a0 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62  as not active, b
309b0 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74  ut this restrict
309c0 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
309d0 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20  removed (CREATE 
309e0 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d  INDEX needs to m
309f0 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e 20  ove a page when 
30a00 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  a statement.** t
30a10 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
30a20 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tive)..**.** If 
30a30 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d  the fourth argum
30a40 65 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 69  ent, isCommit, i
30a50 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
30a60 20 74 68 69 73 20 70 61 67 65 20 69 73 20 62 65   this page is be
30a70 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61 73 20  ing.** moved as 
30a80 70 61 72 74 20 6f 66 20 61 20 64 61 74 61 62 61  part of a databa
30a90 73 65 20 72 65 6f 72 67 61 6e 69 7a 61 74 69 6f  se reorganizatio
30aa0 6e 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68  n just before th
30ab0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  e transaction .*
30ac0 2a 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69  * is being commi
30ad0 74 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  tted. In this ca
30ae0 73 65 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e  se, it is guaran
30af0 74 65 65 64 20 74 68 61 74 20 74 68 65 20 64 61  teed that the da
30b00 74 61 62 61 73 65 20 70 61 67 65 20 0a 2a 2a 20  tabase page .** 
30b10 70 50 67 20 72 65 66 65 72 73 20 74 6f 20 77 69  pPg refers to wi
30b20 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65  ll not be writte
30b30 6e 20 74 6f 20 61 67 61 69 6e 20 77 69 74 68 69  n to again withi
30b40 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
30b50 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  on..**.** This f
30b60 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75  unction may retu
30b70 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  rn SQLITE_NOMEM 
30b80 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  or an IO error c
30b90 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0a  ode if an error.
30ba0 2a 2a 20 6f 63 63 75 72 73 2e 20 4f 74 68 65 72  ** occurs. Other
30bb0 77 69 73 65 2c 20 69 74 20 72 65 74 75 72 6e 73  wise, it returns
30bc0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
30bd0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  nt sqlite3PagerM
30be0 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a 70  ovepage(Pager *p
30bf0 50 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70  Pager, DbPage *p
30c00 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 69  Pg, Pgno pgno, i
30c10 6e 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a 20 20  nt isCommit){.  
30c20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 20  PgHdr *pPgOld;  
30c30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30c40 54 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 6f  The page being o
30c50 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20  verwritten. */. 
30c60 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67   Pgno needSyncPg
30c70 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  no = 0;       /*
30c80 20 4f 6c 64 20 76 61 6c 75 65 20 6f 66 20 70 50   Old value of pP
30c90 67 2d 3e 70 67 6e 6f 2c 20 69 66 20 73 79 6e 63  g->pgno, if sync
30ca0 20 69 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   is required */.
30cb0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
30cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30cd0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
30ce0 0a 20 20 50 67 6e 6f 20 6f 72 69 67 50 67 6e 6f  .  Pgno origPgno
30cf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30d00 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  /* The original 
30d10 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a  page number */..
30d20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
30d30 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  Ref>0 );..  /* I
30d40 66 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  f the page being
30d50 20 6d 6f 76 65 64 20 69 73 20 64 69 72 74 79 20   moved is dirty 
30d60 61 6e 64 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  and has not been
30d70 20 73 61 76 65 64 20 62 79 20 74 68 65 20 6c 61   saved by the la
30d80 74 65 73 74 0a 20 20 2a 2a 20 73 61 76 65 70 6f  test.  ** savepo
30d90 69 6e 74 2c 20 74 68 65 6e 20 73 61 76 65 20 74  int, then save t
30da0 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
30db0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
30dc0 69 6e 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 73  into the .  ** s
30dd0 75 62 2d 6a 6f 75 72 6e 61 6c 20 6e 6f 77 2e 20  ub-journal now. 
30de0 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
30df0 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 66   to handle the f
30e00 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61 72 69  ollowing scenari
30e10 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 42  o:.  **.  **   B
30e20 45 47 49 4e 3b 0a 20 20 2a 2a 20 20 20 20 20 3c  EGIN;.  **     <
30e30 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 2c 20  journal page X, 
30e40 74 68 65 6e 20 6d 6f 64 69 66 79 20 69 74 20 69  then modify it i
30e50 6e 20 6d 65 6d 6f 72 79 3e 0a 20 20 2a 2a 20 20  n memory>.  **  
30e60 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65     SAVEPOINT one
30e70 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c 4d 6f  ;.  **       <Mo
30e80 76 65 20 70 61 67 65 20 58 20 74 6f 20 6c 6f 63  ve page X to loc
30e90 61 74 69 6f 6e 20 59 3e 0a 20 20 2a 2a 20 20 20  ation Y>.  **   
30ea0 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e    ROLLBACK TO on
30eb0 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e;.  **.  ** If 
30ec0 70 61 67 65 20 58 20 77 65 72 65 20 6e 6f 74 20  page X were not 
30ed0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
30ee0 75 62 2d 6a 6f 75 72 6e 61 6c 20 68 65 72 65 2c  ub-journal here,
30ef0 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 20 20   it would not.  
30f00 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ** be possible t
30f10 6f 20 72 65 73 74 6f 72 65 20 69 74 73 20 63 6f  o restore its co
30f20 6e 74 65 6e 74 73 20 77 68 65 6e 20 74 68 65 20  ntents when the 
30f30 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65  "ROLLBACK TO one
30f40 22 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ".  ** statement
30f50 20 77 65 72 65 20 69 73 20 70 72 6f 63 65 73 73   were is process
30f60 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73 75  ed..  **.  ** su
30f70 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 29 20 6d  bjournalPage() m
30f80 61 79 20 6e 65 65 64 20 74 6f 20 61 6c 6c 6f 63  ay need to alloc
30f90 61 74 65 20 73 70 61 63 65 20 74 6f 20 73 74 6f  ate space to sto
30fa0 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 74  re pPg->pgno int
30fb0 6f 0a 20 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f  o.  ** one or mo
30fc0 72 65 20 73 61 76 65 70 6f 69 6e 74 20 62 69 74  re savepoint bit
30fd0 76 65 63 73 2e 20 54 68 69 73 20 69 73 20 74 68  vecs. This is th
30fe0 65 20 72 65 61 73 6f 6e 20 74 68 69 73 20 66 75  e reason this fu
30ff0 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6d 61 79 20  nction.  ** may 
31000 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
31010 4d 45 4d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  MEM..  */.  if( 
31020 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
31030 5f 44 49 52 54 59 20 0a 20 20 20 26 26 20 73 75  _DIRTY .   && su
31040 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
31050 50 67 29 0a 20 20 20 26 26 20 53 51 4c 49 54 45  Pg).   && SQLITE
31060 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 75 62 6a 6f  _OK!=(rc = subjo
31070 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 29 0a  urnalPage(pPg)).
31080 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
31090 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  rc;.  }..  PAGER
310a0 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25 64 20  TRACE(("MOVE %d 
310b0 70 61 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e  page %d (needSyn
310c0 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25  c=%d) moves to %
310d0 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47  d\n", .      PAG
310e0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
310f0 67 2d 3e 70 67 6e 6f 2c 20 28 70 50 67 2d 3e 66  g->pgno, (pPg->f
31100 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
31110 53 59 4e 43 29 3f 31 3a 30 2c 20 70 67 6e 6f 29  SYNC)?1:0, pgno)
31120 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d  );.  IOTRACE(("M
31130 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c  OVE %p %d %d\n",
31140 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
31150 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 2f 2a  no, pgno))..  /*
31160 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
31170 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
31180 28 29 65 64 20 62 65 66 6f 72 65 20 70 61 67 65  ()ed before page
31190 20 70 50 67 2d 3e 70 67 6e 6f 20 63 61 6e 0a 20   pPg->pgno can. 
311a0 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 74   ** be written t
311b0 6f 2c 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67  o, store pPg->pg
311c0 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69  no in local vari
311d0 61 62 6c 65 20 6e 65 65 64 53 79 6e 63 50 67 6e  able needSyncPgn
311e0 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  o..  **.  ** If 
311f0 74 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61  the isCommit fla
31200 67 20 69 73 20 73 65 74 2c 20 74 68 65 72 65 20  g is set, there 
31210 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65  is no need to re
31220 6d 65 6d 62 65 72 20 74 68 61 74 0a 20 20 2a 2a  member that.  **
31230 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65   the journal nee
31240 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65  ds to be sync()e
31250 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73  d before databas
31260 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f  e page pPg->pgno
31270 20 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 77 72   .  ** can be wr
31280 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61  itten to. The ca
31290 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
312a0 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f   promised not to
312b0 20 77 72 69 74 65 20 74 6f 20 69 74 2e 0a 20 20   write to it..  
312c0 2a 2f 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66  */.  if( (pPg->f
312d0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
312e0 53 59 4e 43 29 20 26 26 20 21 69 73 43 6f 6d 6d  SYNC) && !isComm
312f0 69 74 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79  it ){.    needSy
31300 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  ncPgno = pPg->pg
31310 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  no;.    assert( 
31320 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
31330 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e  g) || pPg->pgno>
31340 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
31350 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ze );.    assert
31360 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
31370 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 20 20  DR_DIRTY );.    
31380 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
31390 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a  needSync );.  }.
313a0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63  .  /* If the cac
313b0 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61  he contains a pa
313c0 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  ge with page-num
313d0 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65  ber pgno, remove
313e0 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74   it.  ** from it
313f0 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c  s hash chain. Al
31400 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64 72  so, if the PgHdr
31410 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73 65  .needSync was se
31420 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65  t for .  ** page
31430 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65   pgno before the
31440 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f   'move' operatio
31450 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  n, it needs to b
31460 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a  e retained .  **
31470 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f   for the page mo
31480 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a  ved there..  */.
31490 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
314a0 7e 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  ~PGHDR_NEED_SYNC
314b0 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67  ;.  pPgOld = pag
314c0 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
314d0 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72  , pgno);.  asser
314e0 74 28 20 21 70 50 67 4f 6c 64 20 7c 7c 20 70 50  t( !pPgOld || pP
314f0 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b  gOld->nRef==1 );
31500 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b  .  if( pPgOld ){
31510 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
31520 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e 66 6c 61 67  |= (pPgOld->flag
31530 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
31540 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  C);.    sqlite3P
31550 63 61 63 68 65 44 72 6f 70 28 70 50 67 4f 6c 64  cacheDrop(pPgOld
31560 29 3b 0a 20 20 7d 0a 0a 20 20 6f 72 69 67 50 67  );.  }..  origPg
31570 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  no = pPg->pgno;.
31580 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
31590 6f 76 65 28 70 50 67 2c 20 70 67 6e 6f 29 3b 0a  ove(pPg, pgno);.
315a0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
315b0 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
315c0 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
315d0 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20  ied = 1;..  if( 
315e0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a  needSyncPgno ){.
315f0 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79      /* If needSy
31600 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65  ncPgno is non-ze
31610 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  ro, then the jou
31620 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20  rnal file needs 
31630 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79  to be .    ** sy
31640 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e  nc()ed before an
31650 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y data is writte
31660 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69  n to database fi
31670 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63  le page needSync
31680 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72  Pgno..    ** Cur
31690 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20  rently, no such 
316a0 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20 74  page exists in t
316b0 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e  he page-cache an
316c0 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 22 69  d the .    ** "i
316d0 73 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62 69 74  s journaled" bit
316e0 76 65 63 20 66 6c 61 67 20 68 61 73 20 62 65 65  vec flag has bee
316f0 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64  n set. This need
31700 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64  s to be remedied
31710 20 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61 64 69   by.    ** loadi
31720 6e 67 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ng the page into
31730 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
31740 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65   and setting the
31750 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
31760 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a 20 20  .    ** flag..  
31770 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
31780 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  he attempt to lo
31790 61 64 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ad the page into
317a0 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
317b0 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20 20 20  fails, (due.    
317c0 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28 29  ** to a malloc()
317d0 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 29 2c   or IO failure),
317e0 20 63 6c 65 61 72 20 74 68 65 20 62 69 74 20 69   clear the bit i
317f0 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e 61 6c  n the pInJournal
31800 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61 79 2e  [].    ** array.
31810 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
31820 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65  he page is loade
31830 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20 61 67  d and written ag
31840 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ain in.    ** th
31850 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
31860 69 74 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  it may be writte
31870 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
31880 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 20 20  e file before.  
31890 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e 63 65    ** it is synce
318a0 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  d into the journ
318b0 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 77 61  al file. This wa
318c0 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20 75 70  y, it may end up
318d0 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a   in.    ** the j
318e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77 69 63  ournal file twic
318f0 65 2c 20 62 75 74 20 74 68 61 74 20 69 73 20 6e  e, but that is n
31900 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20  ot a problem..  
31910 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
31920 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
31930 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65  ) call may cause
31940 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20   the journal to 
31950 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20  sync. So make.  
31960 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61    ** sure the Pa
31970 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
31980 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20  g is set too..  
31990 20 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a    */.    PgHdr *
319a0 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73 73 65  pPgHdr;.    asse
319b0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
319c0 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d  Sync );.    rc =
319d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
319e0 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e  (pPager, needSyn
319f0 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b  cPgno, &pPgHdr);
31a00 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
31a10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31a20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  if( needSyncPgno
31a30 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
31a40 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
31a50 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
31a60 70 54 6d 70 53 70 61 63 65 21 3d 30 20 29 3b 0a  pTmpSpace!=0 );.
31a70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
31a80 69 74 76 65 63 43 6c 65 61 72 28 70 50 61 67 65  itvecClear(pPage
31a90 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e  r->pInJournal, n
31aa0 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 70 50 61  eedSyncPgno, pPa
31ab0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
31ac0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
31ad0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
31ae0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
31af0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 61 73  Sync = 1;.    as
31b00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f  sert( pPager->no
31b10 53 79 6e 63 3d 3d 30 20 26 26 20 21 4d 45 4d 44  Sync==0 && !MEMD
31b20 42 20 29 3b 0a 20 20 20 20 70 50 67 48 64 72 2d  B );.    pPgHdr-
31b30 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
31b40 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 73  NEED_SYNC;.    s
31b50 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
31b60 44 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20  Dirty(pPgHdr);. 
31b70 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
31b80 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20  nref(pPgHdr);.  
31b90 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 6f 72  }..  /*.  ** For
31ba0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
31bb0 74 61 62 61 73 65 2c 20 6d 61 6b 65 20 73 75 72  tabase, make sur
31bc0 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  e the original p
31bd0 61 67 65 20 63 6f 6e 74 69 6e 75 65 73 0a 20 20  age continues.  
31be0 2a 2a 20 74 6f 20 65 78 69 73 74 2c 20 69 6e 20  ** to exist, in 
31bf0 63 61 73 65 20 74 68 65 20 74 72 61 6e 73 61 63  case the transac
31c00 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 72 6f  tion needs to ro
31c10 6c 6c 20 62 61 63 6b 2e 20 20 57 65 20 61 6c 6c  ll back.  We all
31c20 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 70  ocate.  ** the p
31c30 61 67 65 20 6e 6f 77 2c 20 69 6e 73 74 65 61 64  age now, instead
31c40 20 6f 66 20 61 74 20 72 6f 6c 6c 62 61 63 6b 2c   of at rollback,
31c50 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 20   because we can 
31c60 62 65 74 74 65 72 20 64 65 61 6c 0a 20 20 2a 2a  better deal.  **
31c70 20 77 69 74 68 20 61 6e 20 6f 75 74 2d 6f 66 2d   with an out-of-
31c80 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20 6e 6f 77  memory error now
31c90 2e 20 20 54 69 63 6b 65 74 20 23 33 37 36 31 2e  .  Ticket #3761.
31ca0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44  .  */.  if( MEMD
31cb0 42 20 29 7b 0a 20 20 20 20 44 62 50 61 67 65 20  B ){.    DbPage 
31cc0 2a 70 4e 65 77 3b 0a 20 20 20 20 72 63 20 3d 20  *pNew;.    rc = 
31cd0 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
31ce0 69 72 65 28 70 50 61 67 65 72 2c 20 6f 72 69 67  ire(pPager, orig
31cf0 50 67 6e 6f 2c 20 26 70 4e 65 77 2c 20 31 29 3b  Pgno, &pNew, 1);
31d00 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
31d10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31d20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 6f 76  sqlite3PcacheMov
31d30 65 28 70 50 67 2c 20 6f 72 69 67 50 67 6e 6f 29  e(pPg, origPgno)
31d40 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
31d50 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  c;.    }.    sql
31d60 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
31d70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  New);.  }..  ret
31d80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
31d90 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
31da0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
31db0 74 6f 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  to the data for 
31dc0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
31dd0 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ge..*/.void *sql
31de0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
31df0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
31e00 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
31e10 65 66 3e 30 20 7c 7c 20 70 50 67 2d 3e 70 50 61  ef>0 || pPg->pPa
31e20 67 65 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20 20  ger->memDb );.  
31e30 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 44 61 74  return pPg->pDat
31e40 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  a;.}../*.** Retu
31e50 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
31e60 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61  the Pager.nExtra
31e70 20 62 79 74 65 73 20 6f 66 20 22 65 78 74 72 61   bytes of "extra
31e80 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f  " space .** allo
31e90 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
31ea0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
31eb0 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  age..*/.void *sq
31ec0 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
31ed0 72 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ra(DbPage *pPg){
31ee0 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70  .  return pPg->p
31ef0 45 78 74 72 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Extra;.}../*.** 
31f00 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b  Get/set the lock
31f10 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69  ing-mode for thi
31f20 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74  s pager. Paramet
31f30 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65  er eMode must be
31f40 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52   one.** of PAGER
31f50 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
31f60 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  RY, PAGER_LOCKIN
31f70 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20  GMODE_NORMAL or 
31f80 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  .** PAGER_LOCKIN
31f90 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e  GMODE_EXCLUSIVE.
31fa0 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   If the paramete
31fb0 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c  r is not _QUERY,
31fc0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63   then.** the loc
31fd0 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74  king-mode is set
31fe0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70   to the value sp
31ff0 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  ecified..**.** T
32000 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
32010 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47 45  e is either PAGE
32020 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
32030 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52  RMAL or.** PAGER
32040 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
32050 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69  LUSIVE, indicati
32060 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 28  ng the current (
32070 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64  possibly updated
32080 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64  ).** locking-mod
32090 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
320a0 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64  3PagerLockingMod
320b0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
320c0 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61   int eMode){.  a
320d0 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41  ssert( eMode==PA
320e0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
320f0 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20 20  QUERY.          
32100 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
32110 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
32120 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20  RMAL.           
32130 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
32140 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
32150 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
32160 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
32170 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b  GMODE_QUERY<0 );
32180 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
32190 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
321a0 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f  MAL>=0 && PAGER_
321b0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
321c0 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66  USIVE>=0 );.  if
321d0 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70  ( eMode>=0 && !p
321e0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
321f0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
32200 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28  xclusiveMode = (
32210 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20  u8)eMode;.  }.  
32220 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67  return (int)pPag
32230 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
32240 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f  e;.}../*.** Get/
32250 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  set the journal-
32260 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61  mode for this pa
32270 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65  ger. Parameter e
32280 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65  Mode must be one
32290 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50 41   of:.**.**    PA
322a0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
322b0 51 55 45 52 59 0a 2a 2a 20 20 20 20 50 41 47 45  QUERY.**    PAGE
322c0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
322d0 4c 45 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52  LETE.**    PAGER
322e0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
322f0 4e 43 41 54 45 0a 2a 2a 20 20 20 20 50 41 47 45  NCATE.**    PAGE
32300 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
32310 52 53 49 53 54 0a 2a 2a 20 20 20 20 50 41 47 45  RSIST.**    PAGE
32320 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
32330 46 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  F.**    PAGER_JO
32340 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
32350 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
32360 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f  rameter is not _
32370 51 55 45 52 59 2c 20 74 68 65 6e 20 74 68 65 20  QUERY, then the 
32380 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 69 73 20  journal_mode is 
32390 73 65 74 20 74 6f 20 74 68 65 0a 2a 2a 20 76 61  set to the.** va
323a0 6c 75 65 20 73 70 65 63 69 66 69 65 64 20 69 66  lue specified if
323b0 20 74 68 65 20 63 68 61 6e 67 65 20 69 73 20 61   the change is a
323c0 6c 6c 6f 77 65 64 2e 20 20 54 68 65 20 63 68 61  llowed.  The cha
323d0 6e 67 65 20 69 73 20 64 69 73 61 6c 6c 6f 77 65  nge is disallowe
323e0 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 66 6f 6c  d.** for the fol
323f0 6c 6f 77 69 6e 67 20 72 65 61 73 6f 6e 73 3a 0a  lowing reasons:.
32400 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 69 6e  **.**   *  An in
32410 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
32420 20 63 61 6e 20 6f 6e 6c 79 20 68 61 76 65 20 69   can only have i
32430 74 73 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  ts journal_mode 
32440 73 65 74 20 74 6f 20 5f 4f 46 46 0a 2a 2a 20 20  set to _OFF.**  
32450 20 20 20 20 6f 72 20 5f 4d 45 4d 4f 52 59 2e 0a      or _MEMORY..
32460 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 6a  **.**   *  The j
32470 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 6d 61 79 20  ournal mode may 
32480 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64 20 77  not be changed w
32490 68 69 6c 65 20 61 20 74 72 61 6e 73 61 63 74 69  hile a transacti
324a0 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
324b0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
324c0 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 63 75   indicate the cu
324d0 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20  rrent (possibly 
324e0 75 70 64 61 74 65 64 29 20 6a 6f 75 72 6e 61 6c  updated) journal
324f0 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  -mode..*/.int sq
32500 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
32510 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61  lMode(Pager *pPa
32520 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b  ger, int eMode){
32530 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65  .  assert( eMode
32540 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
32550 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20  ODE_QUERY.      
32560 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
32570 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
32580 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20  E_DELETE.       
32590 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
325a0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
325b0 5f 54 52 55 4e 43 41 54 45 0a 20 20 20 20 20 20  _TRUNCATE.      
325c0 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
325d0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
325e0 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20 20  E_PERSIST.      
325f0 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
32600 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
32610 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20  E_OFF .         
32620 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
32630 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
32640 45 4d 4f 52 59 20 29 3b 0a 20 20 61 73 73 65 72  EMORY );.  asser
32650 74 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  t( PAGER_JOURNAL
32660 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a  MODE_QUERY<0 );.
32670 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 0a 20    if( eMode>=0. 
32680 20 20 26 26 20 28 21 4d 45 4d 44 42 20 7c 7c 20    && (!MEMDB || 
32690 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
326a0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
326b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  .              |
326c0 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
326d0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 29 0a  OURNALMODE_OFF).
326e0 20 20 20 26 26 20 21 70 50 61 67 65 72 2d 3e 64     && !pPager->d
326f0 62 4d 6f 64 69 66 69 65 64 0a 20 20 20 26 26 20  bModified.   && 
32700 28 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  (!isOpen(pPager-
32710 3e 6a 66 64 29 20 7c 7c 20 30 3d 3d 70 50 61 67  >jfd) || 0==pPag
32720 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 0a  er->journalOff).
32730 20 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 4f    ){.    if( isO
32740 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
32750 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
32760 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
32770 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >jfd);.    }.   
32780 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
32790 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65  Mode = (u8)eMode
327a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
327b0 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f 75 72  int)pPager->jour
327c0 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nalMode;.}../*.*
327d0 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 73 69  * Get/set the si
327e0 7a 65 2d 6c 69 6d 69 74 20 75 73 65 64 20 66 6f  ze-limit used fo
327f0 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  r persistent jou
32800 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  rnal files..**.*
32810 2a 20 53 65 74 74 69 6e 67 20 74 68 65 20 73 69  * Setting the si
32820 7a 65 20 6c 69 6d 69 74 20 74 6f 20 2d 31 20 6d  ze limit to -1 m
32830 65 61 6e 73 20 6e 6f 20 6c 69 6d 69 74 20 69 73  eans no limit is
32840 20 65 6e 66 6f 72 63 65 64 2e 0a 2a 2a 20 41 6e   enforced..** An
32850 20 61 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   attempt to set 
32860 61 20 6c 69 6d 69 74 20 73 6d 61 6c 6c 65 72 20  a limit smaller 
32870 74 68 61 6e 20 2d 31 20 69 73 20 61 20 6e 6f 2d  than -1 is a no-
32880 6f 70 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74  op..*/.i64 sqlit
32890 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69  e3PagerJournalSi
328a0 7a 65 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70  zeLimit(Pager *p
328b0 50 61 67 65 72 2c 20 69 36 34 20 69 4c 69 6d 69  Pager, i64 iLimi
328c0 74 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74  t){.  if( iLimit
328d0 3e 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50 61 67  >=-1 ){.    pPag
328e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
328f0 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b 0a 20  imit = iLimit;. 
32900 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67   }.  return pPag
32910 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
32920 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  imit;.}../*.** R
32930 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
32940 74 6f 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70  to the pPager->p
32950 42 61 63 6b 75 70 20 76 61 72 69 61 62 6c 65 2e  Backup variable.
32960 20 54 68 65 20 62 61 63 6b 75 70 20 6d 6f 64 75   The backup modu
32970 6c 65 0a 2a 2a 20 69 6e 20 62 61 63 6b 75 70 2e  le.** in backup.
32980 63 20 6d 61 69 6e 74 61 69 6e 73 20 74 68 65 20  c maintains the 
32990 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20  content of this 
329a0 76 61 72 69 61 62 6c 65 2e 20 54 68 69 73 20 6d  variable. This m
329b0 6f 64 75 6c 65 0a 2a 2a 20 75 73 65 73 20 69 74  odule.** uses it
329c0 20 6f 70 61 71 75 65 6c 79 20 61 73 20 61 6e 20   opaquely as an 
329d0 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69  argument to sqli
329e0 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
329f0 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69 74 65  () and.** sqlite
32a00 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 29 20  3BackupUpdate() 
32a10 6f 6e 6c 79 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  only..*/.sqlite3
32a20 5f 62 61 63 6b 75 70 20 2a 2a 73 71 6c 69 74 65  _backup **sqlite
32a30 33 50 61 67 65 72 42 61 63 6b 75 70 50 74 72 28  3PagerBackupPtr(
32a40 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
32a50 20 20 72 65 74 75 72 6e 20 26 70 50 61 67 65 72    return &pPager
32a60 2d 3e 70 42 61 63 6b 75 70 3b 0a 7d 0a 0a 23 65  ->pBackup;.}..#e
32a70 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
32a80 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a        MIT_DISKIO */.