/ Hex Artifact Content
Login

Artifact e442d1caaeb30ab197d65514bdf41bba090800d6:


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 30  : pager.c,v 1.60
0350: 36 20 32 30 30 39 2f 30 37 2f 31 32 20 30 32 3a  6 2009/07/12 02:
0360: 33 31 3a 33 37 20 64 72 68 20 45 78 70 20 24 0a  31:37 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 70 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 7c  NALMODE_DELETE |
cdb0: 7c 20 72 63 20 29 3b 0a 20 20 20 20 20 20 73 71  | rc );.      sq
cdc0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
cdd0: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
cde0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
cdf0: 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  OK && !pPager->t
ce00: 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
ce10: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
ce20: 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
ce30: 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
ce40: 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
ce50: 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65    }.    }..#ifde
ce60: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
ce70: 41 47 45 53 0a 20 20 20 20 73 71 6c 69 74 65 33  AGES.    sqlite3
ce80: 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72  PcacheIterateDir
ce90: 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ty(pPager->pPCac
cea0: 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61  he, pager_set_pa
ceb0: 67 65 68 61 73 68 29 3b 0a 23 65 6e 64 69 66 0a  gehash);.#endif.
cec0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
ced0: 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65  heCleanAll(pPage
cee0: 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20  r->pPCache);.   
cef0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
cf00: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
cf10: 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
cf20: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
cf30: 6c 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  l = 0;.    pPage
cf40: 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d  r->nRec = 0;.  }
cf50: 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
cf60: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
cf70: 7b 0a 20 20 20 20 72 63 32 20 3d 20 6f 73 55 6e  {.    rc2 = osUn
cf80: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
cf90: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
cfa0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
cfb0: 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
cfc0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
cfd0: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30  ngeCountDone = 0
cfe0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
cff0: 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
d000: 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20  ER_SYNCED ){.   
d010: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
d020: 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
d030: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
d040: 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
d050: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
d060: 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  c = 0;.  pPager-
d070: 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b  >dbModified = 0;
d080: 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20  ..  /* TODO: Is 
d090: 74 68 69 73 20 6f 70 74 69 6d 61 6c 3f 20 57 68  this optimal? Wh
d0a0: 79 20 69 73 20 74 68 65 20 64 62 20 73 69 7a 65  y is the db size
d0b0: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 68 65 72   invalidated her
d0c0: 65 20 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68 65  e .  ** when the
d0d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
d0e0: 73 20 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64 3f 20  s not unlocked? 
d0f0: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4f  */.  pPager->dbO
d100: 72 69 67 53 69 7a 65 20 3d 20 30 3b 0a 20 20 73  rigSize = 0;.  s
d110: 71 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e  qlite3PcacheTrun
d120: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43  cate(pPager->pPC
d130: 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62  ache, pPager->db
d140: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 21 4d 45  Size);.  if( !ME
d150: 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65  MDB ){.    pPage
d160: 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
d170: 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   0;.  }..  retur
d180: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
d190: 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ?rc2:rc);.}../*.
d1a0: 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61  ** Parameter aDa
d1b0: 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ta must point to
d1c0: 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61   a buffer of pPa
d1d0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
d1e0: 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20  tes.** of data. 
d1f0: 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
d200: 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61  rn a checksum ba
d210: 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74  sed ont the cont
d220: 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  ents of the .** 
d230: 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64  page of data and
d240: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
d250: 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b  ue of pPager->ck
d260: 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  sumInit..**.** T
d270: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61  his is not a rea
d280: 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69  l checksum. It i
d290: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68  s really just th
d2a0: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a  e sum of the .**
d2b0: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20   random initial 
d2c0: 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63  value (pPager->c
d2d0: 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76  ksumInit) and ev
d2e0: 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a  ery 200th byte.*
d2f0: 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  * of the page da
d300: 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  ta, starting wit
d310: 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70  h byte offset (p
d320: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25  Pager->pageSize%
d330: 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79  200)..** Each by
d340: 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  te is interprete
d350: 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e  d as an 8-bit un
d360: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a  signed integer..
d370: 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74  **.** Changing t
d380: 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20  he formula used 
d390: 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20  to compute this 
d3a0: 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73  checksum results
d3b0: 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70   in an.** incomp
d3c0: 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66  atible journal f
d3d0: 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  ile format..**.*
d3e0: 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72  * If journal cor
d3f0: 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
d400: 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
d410: 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
d420: 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61  likely .** scena
d430: 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20  rio is that one 
d440: 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72  end or the other
d450: 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77   of the record w
d460: 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20  ill be changed. 
d470: 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c  .** It is much l
d480: 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20  ess likely that 
d490: 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20  the two ends of 
d4a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
d4b0: 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f  rd will be.** co
d4c0: 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69  rrect and the mi
d4d0: 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e  ddle be corrupt.
d4e0: 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68    Thus, this "ch
d4f0: 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a  ecksum" scheme,.
d500: 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61  ** though fast a
d510: 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68  nd simple, catch
d520: 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69  es the mostly li
d530: 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72  kely kind of cor
d540: 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
d550: 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
d560: 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
d570: 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  , const u8 *aDat
d580: 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
d590: 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
d5a0: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nit;         /* 
d5b0: 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74  Checksum value t
d5c0: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
d5d0: 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
d5e0: 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20  geSize-200;     
d5f0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
d600: 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28  nter */.  while(
d610: 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
d620: 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
d630: 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
d640: 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
d650: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
d660: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f   single page fro
d670: 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75  m either the jou
d680: 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73  rnal file (if is
d690: 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a  MainJrnl==1) or.
d6a0: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ** from the sub-
d6b0: 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61  journal (if isMa
d6c0: 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70  inJrnl==0) and p
d6d0: 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67  layback that pag
d6e0: 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62  e..** The page b
d6f0: 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20  egins at offset 
d700: 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68  *pOffset into th
d710: 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66  e file. The *pOf
d720: 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73  fset.** value is
d730: 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68   increased to th
d740: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
d750: 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
d760: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
d770: 68 65 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 66 6c  he isMainJrnl fl
d780: 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  ag is true if th
d790: 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 72  is is the main r
d7a0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
d7b0: 61 6e 64 0a 2a 2a 20 66 61 6c 73 65 20 66 6f 72  and.** false for
d7c0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
d7d0: 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 69  ournal.  The mai
d7e0: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  n rollback journ
d7f0: 61 6c 20 75 73 65 73 0a 2a 2a 20 63 68 65 63 6b  al uses.** check
d800: 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65  sums - the state
d810: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65  ment journal doe
d820: 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  s not..**.** If 
d830: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
d840: 6f 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f  of the page reco
d850: 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  rd read from the
d860: 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
d870: 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65  ile.** is greate
d880: 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
d890: 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  nt value of Page
d8a0: 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70  r.dbSize, then p
d8b0: 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b  layback is.** sk
d8c0: 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45  ipped and SQLITE
d8d0: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
d8e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20  .**.** If pDone 
d8f0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
d900: 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f 72 64  n it is a record
d910: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68   of pages that h
d920: 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  ave already.** b
d930: 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e  een played back.
d940: 20 20 49 66 20 74 68 65 20 70 61 67 65 20 61 74    If the page at
d950: 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c   *pOffset has al
d960: 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65  ready been playe
d970: 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68  d back.** (if th
d980: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
d990: 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74  pDone bit is set
d9a0: 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20  ) then skip the 
d9b0: 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b  playback..** Mak
d9c0: 65 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65  e sure the pDone
d9d0: 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
d9e0: 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73  ng to the *pOffs
d9f0: 65 74 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a  et page is set.*
da00: 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72  * prior to retur
da10: 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ning..**.** If t
da20: 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 69  he page record i
da30: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  s successfully r
da40: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
da50: 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  b-)journal file.
da60: 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61  ** and played ba
da70: 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  ck, then SQLITE_
da80: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
da90: 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
daa0: 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72  ccurs.** while r
dab0: 65 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72  eading the recor
dac0: 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
dad0: 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72  )journal file or
dae0: 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a   while writing.*
daf0: 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
db00: 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65  e file, then the
db10: 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
db20: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64  s returned. If d
db30: 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73  ata.** is succes
db40: 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  sfully read from
db50: 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
db60: 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70 65  al file but appe
db70: 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72  ars to be.** cor
db80: 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
db90: 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
dba0: 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65   Data is conside
dbb0: 72 65 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e  red corrupted in
dbc0: 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74  .** two circumst
dbd0: 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  ances:.** .**   
dbe0: 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
dbf0: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69  page-number is i
dc00: 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47  llegal (0 or PAG
dc10: 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a  ER_MJ_PGNO), or.
dc20: 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65  **   * If the re
dc30: 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f  cord is being ro
dc40: 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  lled back from t
dc50: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
dc60: 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20  file.**     and 
dc70: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65  the checksum fie
dc80: 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ld does not matc
dc90: 68 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e  h the record con
dca0: 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74  tent..**.** Neit
dcb0: 68 65 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f  her of these two
dcc0: 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70   scenarios are p
dcd0: 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61  ossible during a
dce0: 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
dcf0: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
dd00: 69 73 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e  is is a savepoin
dd10: 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  t rollback, then
dd20: 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65   memory may have
dd30: 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
dd40: 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  ly.** allocated 
dd50: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
dd60: 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
dd70: 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c   case and an all
dd80: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a  ocation fails,.*
dd90: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
dda0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
ddb0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
ddc0: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
ddd0: 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
dde0: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
ddf0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
de00: 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63  being played bac
de10: 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69  k */.  int isMai
de20: 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20  nJrnl,          
de30: 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69       /* 1 -> mai
de40: 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20  n journal. 0 -> 
de50: 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  sub-journal. */.
de60: 20 20 69 6e 74 20 69 73 55 6e 73 79 6e 63 2c 20    int isUnsync, 
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de80: 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 69  /* True if readi
de90: 6e 67 20 66 72 6f 6d 20 75 6e 73 79 6e 63 65 64  ng from unsynced
dea0: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f   main journal */
deb0: 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c  .  i64 *pOffset,
dec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ded0: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65   /* Offset of re
dee0: 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b  cord to playback
def0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65   */.  int isSave
df00: 70 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pnt,            
df10: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
df20: 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
df30: 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63  back */.  Bitvec
df40: 20 2a 70 44 6f 6e 65 20 20 20 20 20 20 20 20 20   *pDone         
df50: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65          /* Bitve
df60: 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61  c of pages alrea
df70: 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a  dy played back *
df80: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
df90: 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20   PgHdr *pPg;    
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dfb0: 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61  * An existing pa
dfc0: 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  ge in the cache 
dfd0: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dff0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
e000: 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20  umber of a page 
e010: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
e020: 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20  u32 cksum;      
e030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e040: 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66   Checksum used f
e050: 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  or sanity checki
e060: 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74  ng */.  u8 *aDat
e070: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
e080: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
e090: 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74  ry storage for t
e0a0: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c  he page */.  sql
e0b0: 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20  ite3_file *jfd; 
e0c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
e0d0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
e0e0: 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  r for the journa
e0f0: 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73  l file */..  ass
e100: 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c  ert( (isMainJrnl
e110: 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
e120: 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73  /* isMainJrnl is
e130: 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
e140: 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26  ert( (isSavepnt&
e150: 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  ~1)==0 );       
e160: 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20  /* isSavepnt is 
e170: 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
e180: 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c  rt( isMainJrnl |
e190: 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f  | pDone );     /
e1a0: 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75  * pDone always u
e1b0: 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e  sed on sub-journ
e1c0: 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  als */.  assert(
e1d0: 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44   isSavepnt || pD
e1e0: 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70  one==0 );   /* p
e1f0: 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20  Done never used 
e200: 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74  on non-savepoint
e210: 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 28   */..  aData = (
e220: 75 38 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  u8*)pPager->pTmp
e230: 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28  Space;.  assert(
e240: 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20 20   aData );       
e250: 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
e260: 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  e must have alre
e270: 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
e280: 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64  ed */..  /* Read
e290: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
e2a0: 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66   and page data f
e2b0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
e2c0: 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20  or sub-journal. 
e2d0: 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e   ** file. Return
e2e0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
e2f0: 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20  o the caller if 
e300: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
e310: 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d  rs..  */.  jfd =
e320: 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50   isMainJrnl ? pP
e330: 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67  ager->jfd : pPag
e340: 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d  er->sjfd;.  rc =
e350: 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
e360: 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f   *pOffset, &pgno
e370: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
e380: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
e390: 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
e3a0: 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44  e3OsRead(jfd, aD
e3b0: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
e3c0: 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74  eSize, (*pOffset
e3d0: 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  )+4);.  if( rc!=
e3e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
e3f0: 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65  rn rc;.  *pOffse
e400: 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  t += pPager->pag
e410: 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61  eSize + 4 + isMa
e420: 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20  inJrnl*4;..  /* 
e430: 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
e440: 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68  on the page.  Th
e450: 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72  is is more impor
e460: 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67  tant that I orig
e470: 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75  inally.  ** thou
e480: 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72  ght.  If a power
e490: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
e4a0: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
e4b0: 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  l is being writt
e4c0: 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c  en,.  ** it coul
e4d0: 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20  d cause invalid 
e4e0: 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74  data to be writt
e4f0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
e500: 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  nal.  We need to
e510: 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69  .  ** detect thi
e520: 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28  s invalid data (
e530: 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62  with high probab
e540: 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72  ility) and ignor
e550: 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  e it..  */.  if(
e560: 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
e570: 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
e580: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61  pPager) ){.    a
e590: 73 73 65 72 74 28 20 21 69 73 53 61 76 65 70 6e  ssert( !isSavepn
e5a0: 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  t );.    return 
e5b0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
e5c0: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e  .  if( pgno>(Pgn
e5d0: 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  o)pPager->dbSize
e5e0: 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65   || sqlite3Bitve
e5f0: 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e  cTest(pDone, pgn
e600: 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  o) ){.    return
e610: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
e620: 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
e630: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61   ){.    rc = rea
e640: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70  d32bits(jfd, (*p
e650: 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75  Offset)-4, &cksu
e660: 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  m);.    if( rc )
e670: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
e680: 69 66 28 20 21 69 73 53 61 76 65 70 6e 74 20 26  if( !isSavepnt &
e690: 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  & pager_cksum(pP
e6a0: 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b  ager, aData)!=ck
e6b0: 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sum ){.      ret
e6c0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
e6d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
e6e0: 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d  ( pDone && (rc =
e6f0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
e700: 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21  t(pDone, pgno))!
e710: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e720: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
e730: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
e740: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
e750: 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61  _RESERVED || pPa
e760: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
e770: 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a  R_EXCLUSIVE );..
e780: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
e790: 72 20 69 73 20 69 6e 20 52 45 53 45 52 56 45 44  r is in RESERVED
e7a0: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65   state, then the
e7b0: 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70  re must be a cop
e7c0: 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70  y of this.  ** p
e7d0: 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72  age in the pager
e7e0: 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20   cache. In this 
e7f0: 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65  case just update
e800: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
e810: 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64  ,.  ** not the d
e820: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
e830: 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d  e page is left m
e840: 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74  arked dirty in t
e850: 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20  his case..  **. 
e860: 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e   ** An exception
e870: 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75   to the above ru
e880: 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74 61 62  le: If the datab
e890: 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e  ase is in no-syn
e8a0: 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20  c mode.  ** and 
e8b0: 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20  a page is moved 
e8c0: 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d  during an increm
e8d0: 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65  ental vacuum the
e8e0: 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20  n the page may. 
e8f0: 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68   ** not be in th
e900: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c  e pager cache. L
e910: 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f  ater: if a mallo
e920: 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20  c() or IO error 
e930: 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69  occurs.  ** duri
e940: 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20  ng a Movepage() 
e950: 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70  call, then the p
e960: 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  age may not be i
e970: 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a  n the cache.  **
e980: 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20   either. So the 
e990: 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69  condition descri
e9a0: 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65  bed in the above
e9b0: 20 70 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f   paragraph is no
e9c0: 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61  t.  ** assert()a
e9d0: 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ble..  **.  ** I
e9e0: 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73  f in EXCLUSIVE s
e9f0: 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70  tate, then we up
ea00: 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
ea10: 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74  ache if it exist
ea20: 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d  s.  ** and the m
ea30: 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ain file. The pa
ea40: 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65  ge is then marke
ea50: 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a  d not dirty..  *
ea60: 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31  *.  ** Ticket #1
ea70: 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d  171:  The statem
ea80: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ent journal migh
ea90: 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63  t contain page c
eaa0: 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20  ontent that is. 
eab0: 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72   ** different fr
eac0: 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  om the page cont
ead0: 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ent at the start
eae0: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
eaf0: 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f  ion..  ** This o
eb00: 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67  ccurs when a pag
eb10: 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69  e is changed pri
eb20: 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
eb30: 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20  of a statement. 
eb40: 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64   ** then changed
eb50: 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
eb60: 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68  e statement.  Wh
eb70: 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
eb80: 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74  such a.  ** stat
eb90: 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f  ement we must no
eba0: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f  t write to the o
ebb0: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
ebc0: 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a   unless we know.
ebd0: 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e    ** for certain
ebe0: 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70   that original p
ebf0: 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
ec00: 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
ec10: 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
ec20: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74   ** journal.  Ot
ec30: 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72  herwise, a power
ec40: 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76   loss might leav
ec50: 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20  e modified data 
ec60: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  in the.  ** data
ec70: 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75  base file withou
ec80: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  t an entry in th
ec90: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
eca0: 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a  al that can.  **
ecb0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
ecc0: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
ecd0: 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f  ginal form.  Two
ece0: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74   conditions must
ecf0: 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66   be.  ** met bef
ed00: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ore writing to t
ed10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
ed20: 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62  s. (1) the datab
ed30: 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ase must be.  **
ed40: 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65   locked.  (2) we
ed50: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
ed60: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
ed70: 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79  tent is fully sy
ed80: 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65  nced.  ** in the
ed90: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69   main journal ei
eda0: 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65  ther because the
edb0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
edc0: 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20  cache or else.  
edd0: 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  ** the page is m
ede0: 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e  arked as needSyn
edf0: 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  c==0..  **.  ** 
ee00: 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65  2008-04-14:  Whe
ee10: 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  n attempting to 
ee20: 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74  vacuum a corrupt
ee30: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
ee40: 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
ee50: 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74  ble to fail a st
ee60: 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74  atement on a dat
ee70: 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20  abase that does 
ee80: 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20  not yet exist.. 
ee90: 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d   ** Do not attem
eea0: 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64  pt to write if d
eeb0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
eec0: 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e   never been open
eed0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  ed..  */.  pPg =
eee0: 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
eef0: 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61  ager, pgno);.  a
ef00: 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d  ssert( pPg || !M
ef10: 45 4d 44 42 20 29 3b 0a 20 20 50 41 47 45 52 54  EMDB );.  PAGERT
ef20: 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20  RACE(("PLAYBACK 
ef30: 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
ef40: 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20  %08x) %s\n",.   
ef50: 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
ef60: 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
ef70: 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  o, pager_datahas
ef80: 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  h(pPager->pageSi
ef90: 7a 65 2c 20 61 44 61 74 61 29 2c 0a 20 20 20 20  ze, aData),.    
efa0: 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d 61             (isMa
efb0: 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75  inJrnl?"main-jou
efc0: 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e  rnal":"sub-journ
efd0: 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28  al").  ));.  if(
efe0: 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e   (pPager->state>
eff0: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
f000: 29 0a 20 20 20 26 26 20 28 70 50 67 3d 3d 30 20  ).   && (pPg==0 
f010: 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67  || 0==(pPg->flag
f020: 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
f030: 43 29 29 0a 20 20 20 26 26 20 69 73 4f 70 65 6e  C)).   && isOpen
f040: 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20  (pPager->fd).   
f050: 26 26 20 21 69 73 55 6e 73 79 6e 63 0a 20 20 29  && !isUnsync.  )
f060: 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d  {.    i64 ofst =
f070: 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
f080: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
f090: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
f0a0: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
f0b0: 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67  >fd, aData, pPag
f0c0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
f0d0: 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  st);.    if( pgn
f0e0: 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
f0f0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Size ){.      pP
f100: 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
f110: 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20   = pgno;.    }. 
f120: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
f130: 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20  Backup ){.      
f140: 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61  CODEC1(pPager, a
f150: 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
f160: 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  c=SQLITE_NOMEM);
f170: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
f180: 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
f190: 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
f1a0: 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  , aData);.      
f1b0: 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61  CODEC1(pPager, a
f1c0: 44 61 74 61 2c 20 70 67 6e 6f 2c 20 30 2c 20 72  Data, pgno, 0, r
f1d0: 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  c=SQLITE_NOMEM);
f1e0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
f1f0: 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26  f( !isMainJrnl &
f200: 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  & pPg==0 ){.    
f210: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
f220: 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73 61  rollback of a sa
f230: 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74 61  vepoint and data
f240: 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65 6e   was not written
f250: 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   to.    ** the d
f260: 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20  atabase and the 
f270: 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d  page is not in-m
f280: 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73 20  emory, there is 
f290: 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20  a potential.    
f2a0: 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e  ** problem. When
f2b0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 65 78   the page is nex
f2c0: 74 20 66 65 74 63 68 65 64 20 62 79 20 74 68 65  t fetched by the
f2d0: 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20 69   b-tree layer, i
f2e0: 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  t .    ** will b
f2f0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
f300: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
f310: 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20  hich may or may 
f320: 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20 63  not be .    ** c
f330: 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a  urrent. .    **.
f340: 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65      ** There are
f350: 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66   a couple of dif
f360: 66 65 72 65 6e 74 20 77 61 79 73 20 74 68 69 73  ferent ways this
f370: 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c   can happen. All
f380: 20 61 72 65 20 71 75 69 74 65 0a 20 20 20 20 2a   are quite.    *
f390: 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e 20  * obscure. When 
f3a0: 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68  running in synch
f3b0: 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69  ronous mode, thi
f3c0: 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
f3d0: 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65  n .    ** if the
f3e0: 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65 20   page is on the 
f3f0: 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68 65  free-list at the
f400: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
f410: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a  ansaction, then.
f420: 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64      ** populated
f430: 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73 69  , then moved usi
f440: 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  ng sqlite3PagerM
f450: 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20 2a  ovepage()..    *
f460: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c  *.    ** The sol
f470: 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64 20  ution is to add 
f480: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
f490: 65 20 74 6f 20 74 68 65 20 63 61 63 68 65 20 63  e to the cache c
f4a0: 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a  ontaining.    **
f4b0: 20 74 68 65 20 64 61 74 61 20 6a 75 73 74 20 72   the data just r
f4c0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ead from the sub
f4d0: 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74  -journal. Mark t
f4e0: 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
f4f0: 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20   .    ** and if 
f500: 74 68 65 20 70 61 67 65 72 20 72 65 71 75 69 72  the pager requir
f510: 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  es a journal-syn
f520: 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 65  c, then mark the
f530: 20 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a 2a   page as .    **
f540: 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f 75   requiring a jou
f550: 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65  rnal-sync before
f560: 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e 0a   it is written..
f570: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
f580: 74 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b 0a  t( isSavepnt );.
f590: 20 20 20 20 69 66 28 20 28 72 63 20 3d 20 73 71      if( (rc = sq
f5a0: 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
f5b0: 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  e(pPager, pgno, 
f5c0: 26 70 50 67 2c 20 31 29 29 21 3d 53 51 4c 49 54  &pPg, 1))!=SQLIT
f5d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
f5e0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
f5f0: 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d     pPg->flags &=
f600: 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41   ~PGHDR_NEED_REA
f610: 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  D;.    sqlite3Pc
f620: 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
f630: 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  g);.  }.  if( pP
f640: 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70  g ){.    /* No p
f650: 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20  age should ever 
f660: 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f  be explicitly ro
f670: 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69  lled back that i
f680: 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74  s in use, except
f690: 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  .    ** for page
f6a0: 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64   1 which is held
f6b0: 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72   in use in order
f6c0: 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63   to keep the loc
f6d0: 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
f6e0: 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e  database active.
f6f0: 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20   However such a 
f700: 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c  page may be roll
f710: 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
f720: 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e  ult.    ** of an
f730: 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20   internal error 
f740: 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20  resulting in an 
f750: 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74  automatic call t
f760: 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
f770: 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e  PagerRollback().
f780: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64  .    */.    void
f790: 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61   *pData;.    pDa
f7a0: 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
f7b0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
f7c0: 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  a, aData, pPager
f7d0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
f7e0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65   if( pPager->xRe
f7f0: 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  initer ){.      
f800: 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
f810: 72 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  r(pPg);.    }.  
f820: 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
f830: 20 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20   && (!isSavepnt 
f840: 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61  || *pOffset<=pPa
f850: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
f860: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
f870: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
f880: 74 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a  this page were j
f890: 75 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f  ust restored fro
f8a0: 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20  m the main .    
f8b0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
f8c0: 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74  e, then its cont
f8d0: 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74  ent must be as t
f8e0: 68 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68  hey were when th
f8f0: 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  e .      ** tran
f900: 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73  saction was firs
f910: 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69  t opened. In thi
f920: 73 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61  s case we can ma
f930: 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  rk the page.    
f940: 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73    ** as clean, s
f950: 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20  ince there will 
f960: 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72  be no need to wr
f970: 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68  ite it out to th
f980: 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
f990: 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e    ** There is on
f9a0: 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74  e exception to t
f9b0: 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68 65  his rule. If the
f9c0: 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 72   page is being r
f9d0: 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  olled.      ** b
f9e0: 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20 61  ack as part of a
f9f0: 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20 73   savepoint (or s
fa00: 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62 61  tatement) rollba
fa10: 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20 20  ck from an .    
fa20: 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70 6f    ** unsynced po
fa30: 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61 69  rtion of the mai
fa40: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  n journal file, 
fa50: 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 73  then it is not s
fa60: 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  afe.      ** to 
fa70: 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
fa80: 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73 20   clean. This is 
fa90: 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67 20  because marking 
faa0: 74 68 65 20 70 61 67 65 20 61 73 0a 20 20 20 20  the page as.    
fab0: 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20    ** clean will 
fac0: 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f  clear the PGHDR_
fad0: 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20  NEED_SYNC flag. 
fae0: 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 20 69  Since the page i
faf0: 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61  s.      ** alrea
fb00: 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  dy in the journa
fb10: 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65 64  l file (recorded
fb20: 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75   in Pager.pInJou
fb30: 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20 20  rnal) and.      
fb40: 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ** the PGHDR_NEE
fb50: 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 63  D_SYNC flag is c
fb60: 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65 20 70  leared, if the p
fb70: 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 74  age is written t
fb80: 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e  o.      ** again
fb90: 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61   within this tra
fba0: 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c  nsaction, it wil
fbb0: 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  l be marked as d
fbc0: 69 72 74 79 20 62 75 74 0a 20 20 20 20 20 20 2a  irty but.      *
fbd0: 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  * the PGHDR_NEED
fbe0: 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c 20  _SYNC flag will 
fbf0: 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20 63  not be set. It c
fc00: 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e 74  ould then potent
fc10: 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 62  ially.      ** b
fc20: 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69 6e  e written out in
fc30: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
fc40: 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73 20  file before its 
fc50: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20  journal file.   
fc60: 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73     ** segment is
fc70: 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63 72   synced. If a cr
fc80: 61 73 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ash occurs durin
fc90: 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  g or following t
fca0: 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64 61  his,.      ** da
fcb0: 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
fcc0: 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20 20  n may ensue..   
fcd0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
fce0: 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
fcf0: 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 23  an(pPg);.    }.#
fd00: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
fd10: 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67  CK_PAGES.    pPg
fd20: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
fd30: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
fd40: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20  ;.#endif.    /* 
fd50: 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65  If this was page
fd60: 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65   1, then restore
fd70: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
fd80: 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a  ger.dbFileVers..
fd90: 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62      ** Do this b
fda0: 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69  efore any decodi
fdb0: 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ng. */.    if( p
fdc0: 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
fdd0: 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
fde0: 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
fdf0: 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69  8*)pData)[24],si
fe00: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
fe10: 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
fe20: 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20  ..    /* Decode 
fe30: 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65  the page just re
fe40: 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a  ad from disk */.
fe50: 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
fe60: 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
fe70: 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
fe80: 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71  E_NOMEM);.    sq
fe90: 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
fea0: 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72  se(pPg);.  }.  r
feb0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
fec0: 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
fed0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
fee0: 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53  ITE_COVERAGE_TES
fef0: 54 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  T)./*.** This ro
ff00: 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 61 68 65 61  utine looks ahea
ff10: 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  d into the main 
ff20: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64  journal file and
ff30: 20 64 65 74 65 72 6d 69 6e 65 73 0a 2a 2a 20 77   determines.** w
ff40: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
ff50: 65 20 6e 65 78 74 20 72 65 63 6f 72 64 20 28 74  e next record (t
ff60: 68 65 20 72 65 63 6f 72 64 20 74 68 61 74 20 62  he record that b
ff70: 65 67 69 6e 73 20 61 74 20 66 69 6c 65 0a 2a 2a  egins at file.**
ff80: 20 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e   offset pPager->
ff90: 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 69 73 20 61  journalOff) is a
ffa0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 70 61 67   well-formed pag
ffb0: 65 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73 74  e record consist
ffc0: 69 6e 67 0a 2a 2a 20 6f 66 20 61 20 76 61 6c 69  ing.** of a vali
ffd0: 64 20 70 61 67 65 20 6e 75 6d 62 65 72 2c 20 70  d page number, p
ffe0: 50 61 67 65 2d 3e 70 61 67 65 53 69 7a 65 20 62  Page->pageSize b
fff0: 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 2c  ytes of content,
10000 20 66 6f 6c 6c 6f 77 65 64 0a 2a 2a 20 62 79 20   followed.** by 
10010 61 20 76 61 6c 69 64 20 63 68 65 63 6b 73 75 6d  a valid checksum
10020 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
10030 72 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f  r never needs to
10040 20 6b 6e 6f 77 20 74 68 69 73 20 69 6e 20 6f 72   know this in or
10050 64 65 72 20 74 6f 20 64 6f 20 69 74 73 20 6a 6f  der to do its jo
10060 62 2e 20 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  b.   This.** rou
10070 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  tine is only use
10080 64 20 66 72 6f 6d 20 77 69 74 68 20 61 73 73 65  d from with asse
10090 72 74 28 29 20 61 6e 64 20 74 65 73 74 63 61 73  rt() and testcas
100a0 65 28 29 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 73  e() macros..*/.s
100b0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4e  tatic int pagerN
100c0 65 78 74 4a 6f 75 72 6e 61 6c 50 61 67 65 49 73  extJournalPageIs
100d0 56 61 6c 69 64 28 50 61 67 65 72 20 2a 70 50 61  Valid(Pager *pPa
100e0 67 65 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  ger){.  Pgno pgn
100f0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
10100 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
10110 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
10120 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
10130 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
10140 65 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20  e checksum */.  
10150 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
10160 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
10170 6f 64 65 20 66 72 6f 6d 20 72 65 61 64 20 6f 70  ode from read op
10180 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 71  erations */.  sq
10190 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20  lite3_file *fd; 
101a0 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
101b0 65 73 63 72 69 70 74 6f 72 20 66 72 6f 6d 20 77  escriptor from w
101c0 68 69 63 68 20 77 65 20 61 72 65 20 72 65 61 64  hich we are read
101d0 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61  ing */.  u8 *aDa
101e0 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ta;           /*
101f0 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   Content of the 
10200 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65  page */..  /* Re
10210 61 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ad the page numb
10220 65 72 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 66  er header */.  f
10230 64 20 3d 20 70 50 61 67 65 72 2d 3e 6a 66 64 3b  d = pPager->jfd;
10240 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
10250 74 73 28 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ts(fd, pPager->j
10260 6f 75 72 6e 61 6c 4f 66 66 2c 20 26 70 67 6e 6f  ournalOff, &pgno
10270 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
10280 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75 72 6e  ITE_OK ){ return
10290 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20 20   0; }           
102a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102b0 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54         /*NO_TEST
102c0 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  */.  if( pgno==0
102d0 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
102e0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
102f0 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20  ){ return 0; }  
10300 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54         /*NO_TEST
10310 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50  */.  if( pgno>(P
10320 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69  gno)pPager->dbSi
10330 7a 65 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20  ze ){ return 0; 
10340 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
10350 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54         /*NO_TEST
10360 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  */..  /* Read th
10370 65 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20  e checksum */.  
10380 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
10390 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
103a0 6e 61 6c 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70  nalOff+pPager->p
103b0 61 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b 73 75  ageSize+4, &cksu
103c0 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  m);.  if( rc!=SQ
103d0 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75 72  LITE_OK ){ retur
103e0 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20  n 0; }          
103f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10400 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53          /*NO_TES
10410 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74  T*/..  /* Read t
10420 68 65 20 64 61 74 61 20 61 6e 64 20 76 65 72 69  he data and veri
10430 66 79 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  fy the checksum 
10440 2a 2f 0a 20 20 61 44 61 74 61 20 3d 20 28 75 38  */.  aData = (u8
10450 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  *)pPager->pTmpSp
10460 61 63 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ace;.  rc = sqli
10470 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 44  te3OsRead(fd, aD
10480 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
10490 65 53 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e 6a  eSize, pPager->j
104a0 6f 75 72 6e 61 6c 4f 66 66 2b 34 29 3b 0a 20 20  ournalOff+4);.  
104b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
104c0 4b 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d  K ){ return 0; }
104d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104f0 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20    /*NO_TEST*/.  
10500 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  if( pager_cksum(
10510 70 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d  pPager, aData)!=
10520 63 6b 73 75 6d 20 29 7b 20 72 65 74 75 72 6e 20  cksum ){ return 
10530 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  0; }            
10540 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 0a 20    /*NO_TEST*/.. 
10550 20 2f 2a 20 52 65 61 63 68 20 74 68 69 73 20 70   /* Reach this p
10560 6f 69 6e 74 20 6f 6e 6c 79 20 69 66 20 74 68 65  oint only if the
10570 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 20 2a   page is valid *
10580 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  /.  return 1;.}.
10590 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
105a0 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65  ed(NDEBUG) || de
105b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56  fined(SQLITE_COV
105c0 45 52 41 47 45 5f 54 45 53 54 29 20 2a 2f 0a 0a  ERAGE_TEST) */..
105d0 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
105e0 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e  zMaster is the n
105f0 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
10600 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20  journal file. A 
10610 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a  single journal.*
10620 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65  * file that refe
10630 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74  rred to the mast
10640 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
10650 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f  has just been ro
10660 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68  lled back..** Th
10670 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
10680 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  s if it is possi
10690 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
106a0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
106b0 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f   file,.** and do
106c0 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a  es so if it is..
106d0 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a  **.** Argument z
106e0 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74  Master may point
106f0 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70   to Pager.pTmpSp
10700 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66  ace. So that buf
10710 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61  fer is not .** a
10720 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
10730 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
10740 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ction..**.** Whe
10750 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  n a master journ
10760 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  al file is creat
10770 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61  ed, it is popula
10780 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ted with the nam
10790 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66  es .** of all of
107a0 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e   its child journ
107b0 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61  als, one after a
107c0 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65  nother, formatte
107d0 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65  d as utf-8 .** e
107e0 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65  ncoded text. The
107f0 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69   end of each chi
10800 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ld journal file 
10810 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61  is marked with a
10820 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61   .** nul-termina
10830 74 6f 72 20 62 79 74 65 20 28 30 78 30 30 29 2e  tor byte (0x00).
10840 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65   i.e. the entire
10850 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d   contents of a m
10860 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
10870 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e   file for a tran
10880 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e  saction involvin
10890 67 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 20  g two databases 
108a0 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20  might be:.**.** 
108b0 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e    "/home/bill/a.
108c0 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68  db-journal\x00/h
108d0 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f  ome/bill/b.db-jo
108e0 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a  urnal\x00".**.**
108f0 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   A master journa
10900 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20  l file may only 
10910 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20  be deleted once 
10920 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64  all of its child
10930 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61   .** journals ha
10940 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  ve been rolled b
10950 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
10960 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74  function reads t
10970 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
10980 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
10990 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20  l file into .** 
109a0 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73  memory and loops
109b0 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66   through each of
109c0 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e   the child journ
109d0 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a  al names. For.**
109e0 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   each child jour
109f0 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69  nal, it checks i
10a00 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20  f:.**.**   * if 
10a10 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
10a20 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66  l exists, and if
10a30 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68   so.**   * if th
10a40 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
10a50 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72  contains a refer
10a60 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a  ence to master j
10a70 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66  ournal .**     f
10a80 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a  ile zMaster.**.*
10a90 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75  * If a child jou
10aa0 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
10ab0 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 62  d that matches b
10ac0 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69 74 65  oth of the crite
10ad0 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68  ria.** above, th
10ae0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
10af0 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  rns without doin
10b00 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65  g anything. Othe
10b10 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20  rwise, if.** no 
10b20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  such child journ
10b30 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  al can be found,
10b40 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73   file zMaster is
10b50 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a   deleted from.**
10b60 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
10b70 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
10b80 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  Delete()..**.** 
10b90 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77  If an IO error w
10ba0 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74  ithin this funct
10bb0 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  ion, an error co
10bc0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
10bd0 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
10be0 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72   allocates memor
10bf0 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c  y by calling sql
10c00 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66  ite3Malloc(). If
10c10 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a   an allocation.*
10c20 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f  * fails, SQLITE_
10c30 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
10c40 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
10c50 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63   no IO or malloc
10c60 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75   errors .** occu
10c70 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r, SQLITE_OK is 
10c80 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
10c90 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74  TODO: This funct
10ca0 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20  ion allocates a 
10cb0 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20  single block of 
10cc0 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a  memory to load.*
10cd0 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  * the entire con
10ce0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73  tents of the mas
10cf0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10d00 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a  . This could be.
10d10 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b  ** a couple of k
10d20 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d  ilobytes or so -
10d30 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72   potentially lar
10d40 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61 67  ger than the pag
10d50 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73  e .** size..*/.s
10d60 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
10d70 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20  delmaster(Pager 
10d80 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
10d90 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
10da0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
10db0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
10dc0 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  s;.  int rc;    
10dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10de0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
10df0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
10e00 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20  *pMaster;    /* 
10e10 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d  Malloc'd master-
10e20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
10e30 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c  criptor */.  sql
10e40 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72  ite3_file *pJour
10e50 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  nal;   /* Malloc
10e60 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c  'd child-journal
10e70 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
10e80 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
10e90 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20  terJournal = 0; 
10ea0 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d  /* Contents of m
10eb0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10ec0 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73  le */.  i64 nMas
10ed0 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
10ee0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73    /* Size of mas
10ef0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10f00 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
10f10 74 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74  te space for bot
10f20 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61  h the pJournal a
10f30 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20  nd pMaster file 
10f40 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a  descriptors..  *
10f50 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
10f60 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   open the master
10f70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
10f80 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a  r reading..  */.
10f90 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c    pMaster = (sql
10fa0 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69  ite3_file *)sqli
10fb0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56  te3MallocZero(pV
10fc0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32  fs->szOsFile * 2
10fd0 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20  );.  pJournal = 
10fe0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
10ff0 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29  (((u8 *)pMaster)
11000 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c   + pVfs->szOsFil
11010 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74  e);.  if( !pMast
11020 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  er ){.    rc = S
11030 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
11040 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20  else{.    const 
11050 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c  int flags = (SQL
11060 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
11070 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
11080 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  STER_JOURNAL);. 
11090 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
110a0 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73  sOpen(pVfs, zMas
110b0 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c  ter, pMaster, fl
110c0 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  ags, 0);.  }.  i
110d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
110e0 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
110f0 72 5f 6f 75 74 3b 0a 0a 20 20 72 63 20 3d 20 73  r_out;..  rc = s
11100 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
11110 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74  (pMaster, &nMast
11120 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
11130 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11140 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
11150 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61  _out;..  if( nMa
11160 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b  sterJournal>0 ){
11170 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  .    char *zJour
11180 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  nal;.    char *z
11190 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 20  MasterPtr = 0;. 
111a0 20 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74     int nMasterPt
111b0 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  r = pVfs->mxPath
111c0 6e 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20  name+1;..    /* 
111d0 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20  Load the entire 
111e0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
111f0 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f  ile into space o
11200 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20  btained from.   
11210 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   ** sqlite3_mall
11220 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64  oc() and pointed
11230 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f   to by zMasterJo
11240 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20  urnal. .    */. 
11250 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61     zMasterJourna
11260 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  l = (char *)sqli
11270 74 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e  te3Malloc((int)n
11280 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20  MasterJournal + 
11290 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20  nMasterPtr);.   
112a0 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75   if( !zMasterJou
112b0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
112c0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
112d0 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d  .      goto delm
112e0 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  aster_out;.    }
112f0 0a 20 20 20 20 7a 4d 61 73 74 65 72 50 74 72 20  .    zMasterPtr 
11300 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  = &zMasterJourna
11310 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l[nMasterJournal
11320 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ];.    rc = sqli
11330 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65  te3OsRead(pMaste
11340 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r, zMasterJourna
11350 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a  l, (int)nMasterJ
11360 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
11370 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11380 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
11390 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f  er_out;..    zJo
113a0 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a  urnal = zMasterJ
113b0 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c  ournal;.    whil
113c0 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61  e( (zJournal-zMa
113d0 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61  sterJournal)<nMa
113e0 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
113f0 20 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b       int exists;
11400 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
11410 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
11420 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  , zJournal, SQLI
11430 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
11440 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20  , &exists);.    
11450 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11460 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
11470 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
11480 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
11490 20 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20   if( exists ){. 
114a0 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
114b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
114c0 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
114d0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
114e0 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  xists..        *
114f0 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68  * Open it and ch
11500 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73  eck if it points
11510 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a   at the master j
11520 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20  ournal. If.     
11530 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
11540 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
11550 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
11560 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
11570 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
11580 74 20 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  t c;.        int
11590 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45   flags = (SQLITE
115a0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
115b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
115c0 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20  JOURNAL);.      
115d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
115e0 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72  Open(pVfs, zJour
115f0 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66  nal, pJournal, f
11600 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20  lags, 0);.      
11610 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11620 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
11630 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
11640 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
11650 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61          rc = rea
11660 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
11670 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72  Journal, zMaster
11680 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29  Ptr, nMasterPtr)
11690 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
116a0 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61  3OsClose(pJourna
116b0 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
116c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
116d0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
116e0 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
116f0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
11700 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72    c = zMasterPtr
11710 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70  [0]!=0 && strcmp
11720 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61  (zMasterPtr, zMa
11730 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20  ster)==0;.      
11740 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20    if( c ){.     
11750 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20       /* We have 
11760 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20  a match. Do not 
11770 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
11780 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
11790 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  */.          got
117a0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
117b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
117c0 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61   }.      zJourna
117d0 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72  l += (sqlite3Str
117e0 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b  len30(zJournal)+
117f0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
11800 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
11810 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
11820 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d  aster, 0);..delm
11830 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28  aster_out:.  if(
11840 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
11850 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
11860 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ree(zMasterJourn
11870 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28  al);.  }  .  if(
11880 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20   pMaster ){.    
11890 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
118a0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73  Master);.    ass
118b0 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f  ert( !isOpen(pJo
118c0 75 72 6e 61 6c 29 20 29 3b 0a 20 20 7d 0a 20 20  urnal) );.  }.  
118d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61  sqlite3_free(pMa
118e0 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ster);.  return 
118f0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
11900 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
11910 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68  sed to change th
11920 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  e actual size of
11930 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
11940 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  * file in the fi
11950 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20  le-system. This 
11960 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
11970 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
11980 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f  ransaction,.** o
11990 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
119a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e   transaction (in
119b0 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20  cluding rolling 
119c0 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
119d0 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
119e0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
119f0 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e  file is not open
11a00 2c 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76  , or an exclusiv
11a10 65 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a 2a 2a  e lock is not.**
11a20 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63   held, this func
11a30 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
11a40 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
11a50 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
11a60 20 69 73 0a 2a 2a 20 63 68 61 6e 67 65 64 20 74   is.** changed t
11a70 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e  o nPage pages (n
11a80 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67  Page*pPager->pag
11a90 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20 49 66  eSize bytes). If
11aa0 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 6f 6e 20   the file.** on 
11ab0 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  disk is currentl
11ac0 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50  y larger than nP
11ad0 61 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20  age pages, then 
11ae0 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78  use the VFS.** x
11af0 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f  Truncate() metho
11b00 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74  d to truncate it
11b10 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d  ..**.** Or, it m
11b20 69 67 68 74 20 6d 69 67 68 74 20 62 65 20 74 68  ight might be th
11b30 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  e case that the 
11b40 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
11b50 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a  smaller than .**
11b60 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f   nPage pages. So
11b70 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  me operating sys
11b80 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tem implementati
11b90 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66  ons can get conf
11ba0 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20  used if .** you 
11bb0 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20  try to truncate 
11bc0 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73  a file to some s
11bd0 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67  ize that is larg
11be0 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63  er than it .** c
11bf0 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20  urrently is, so 
11c00 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65  detect this case
11c10 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e   and write a sin
11c20 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f  gle zero byte to
11c30 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20   .** the end of 
11c40 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73  the new file ins
11c50 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  tead..**.** If s
11c60 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
11c70 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  n SQLITE_OK. If 
11c80 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
11c90 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69  rs while modifyi
11ca0 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  ng.** the databa
11cb0 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20  se file, return 
11cc0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
11cd0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
11ce0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
11cf0 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
11d00 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
11d10 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
11d20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
11d30 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
11d40 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
11d50 45 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  E && isOpen(pPag
11d60 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 69  er->fd) ){.    i
11d70 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20  64 currentSize, 
11d80 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 2f 2a 20  newSize;.    /* 
11d90 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65  TODO: Is it safe
11da0 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62   to use Pager.db
11db0 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a  FileSize here? *
11dc0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
11dd0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
11de0 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e  ger->fd, &curren
11df0 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53  tSize);.    newS
11e00 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
11e10 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67  geSize*(i64)nPag
11e20 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  e;.    if( rc==S
11e30 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72  QLITE_OK && curr
11e40 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65  entSize!=newSize
11e50 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75   ){.      if( cu
11e60 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a  rrentSize>newSiz
11e70 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
11e80 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
11e90 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ate(pPager->fd, 
11ea0 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  newSize);.      
11eb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
11ec0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
11ed0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 22  te(pPager->fd, "
11ee0 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29  ", 1, newSize-1)
11ef0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11f00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
11f10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
11f20 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
11f30 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  = nPage;.      }
11f40 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
11f50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11f60 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Set the value o
11f70 66 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74  f the Pager.sect
11f80 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
11f90 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
11fa0 20 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20   pager based on 
11fb0 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
11fc0 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
11fd0 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20  rSize method.** 
11fe0 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  of the open data
11ff0 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73  base file. The s
12000 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20  ector size will 
12010 62 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a  be used used .**
12020 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
12030 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e  e size and align
12040 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ment of journal 
12050 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d  header and .** m
12060 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
12070 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72  inters within cr
12080 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69  eated journal fi
12090 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
120a0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74  emporary files t
120b0 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
120c0 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61  tor size is alwa
120d0 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a  ys 512 bytes..**
120e0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66  .** Otherwise, f
120f0 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79  or non-temporary
12100 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65   files, the effe
12110 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
12120 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75  e is.** the valu
12130 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
12140 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20  e xSectorSize() 
12150 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75  method rounded u
12160 70 20 74 6f 20 35 31 32 20 69 66 0a 2a 2a 20 69  p to 512 if.** i
12170 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 35  t is less than 5
12180 31 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64  12, or rounded d
12190 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f  own to MAX_SECTO
121a0 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20  R_SIZE if it.** 
121b0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
121c0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e  MAX_SECTOR_SIZE.
121d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
121e0 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61  setSectorSize(Pa
121f0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
12200 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
12210 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
12220 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
12230 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ;..  if( !pPager
12240 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
12250 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65    /* Sector size
12260 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
12270 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
12280 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66  les. Also, the f
12290 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  ile.    ** may n
122a0 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ot have been ope
122b0 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63  ned yet, in whic
122c0 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63  h case the OsSec
122d0 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
122e0 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61   call will segfa
122f0 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ult..    */.    
12300 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
12310 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  ze = sqlite3OsSe
12320 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d  ctorSize(pPager-
12330 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  >fd);.  }.  if( 
12340 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
12350 7a 65 3c 35 31 32 20 29 7b 0a 20 20 20 20 70 50  ze<512 ){.    pP
12360 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
12370 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 20 20 69 66   = 512;.  }.  if
12380 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
12390 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f  Size>MAX_SECTOR_
123a0 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65  SIZE ){.    asse
123b0 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  rt( MAX_SECTOR_S
123c0 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20  IZE>=512 );.    
123d0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
123e0 7a 65 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f  ze = MAX_SECTOR_
123f0 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  SIZE;.  }.}../*.
12400 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
12410 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73  journal and thus
12420 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
12430 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a  abase file to.**
12440 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
12450 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73  s in before we s
12460 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68  tarted making ch
12470 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  anges.  .**.** T
12480 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12490 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c  format is as fol
124a0 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31  lows: .**.**  (1
124b0 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78  )  8 byte prefix
124c0 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f  .  A copy of aJo
124d0 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
124e0 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69    (2)  4 byte bi
124f0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
12500 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
12510 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61  mber of valid pa
12520 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20  ge records.**   
12530 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e      in the journ
12540 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  al.  If this val
12550 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
12560 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74  , then compute t
12570 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62  he.**       numb
12580 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72  er of page recor
12590 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ds from the jour
125a0 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33  nal size..**  (3
125b0 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
125c0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
125d0 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  ch is the initia
125e0 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  l value for the 
125f0 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79  .**       sanity
12600 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28   checksum..**  (
12610 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  4)  4 byte integ
12620 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
12630 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
12640 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  to truncate the.
12650 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73  **       databas
12660 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f  e to during a ro
12670 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20  llback..**  (5) 
12680 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
12690 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
126a0 20 69 73 20 74 68 65 20 73 65 63 74 6f 72 20 73   is the sector s
126b0 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65 72  ize.  The header
126c0 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68 69  .**       is thi
126d0 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20  s many bytes in 
126e0 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34  size..**  (6)  4
126f0 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
12700 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
12710 73 20 74 68 65 20 70 61 67 65 20 63 61 73 65 2e  s the page case.
12720 0a 2a 2a 20 20 28 37 29 20 20 34 20 62 79 74 65  .**  (7)  4 byte
12730 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
12740 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
12750 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
12760 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ter journal.**  
12770 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20       name.  The 
12780 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72  value may be zer
12790 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61 74  o (indicate that
127a0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
127b0 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75  ter.**       jou
127c0 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 38 29 20 20  rnal.).**  (8)  
127d0 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d  N bytes of the m
127e0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
127f0 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69  me.  The name wi
12800 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  ll be nul-termin
12810 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e  ated.**       an
12820 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74  d might be short
12830 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75  er than the valu
12840 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e  e read from (5).
12850 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62    If the first b
12860 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20  yte.**       of 
12870 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30  the name is \000
12880 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
12890 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
128a0 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a  .  The master.**
128b0 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e         journal n
128c0 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ame is stored in
128d0 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 39 29 20   UTF-8..**  (9) 
128e0 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61   Zero or more pa
128f0 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65  ges instances, e
12900 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ach as follows:.
12910 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
12920 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  yte page number.
12930 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50  .**        +  pP
12940 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
12950 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  ytes of data..**
12960 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
12970 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a  e checksum.**.**
12980 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f   When we speak o
12990 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
129a0 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68  ader, we mean th
129b0 65 20 66 69 72 73 74 20 38 20 69 74 65 6d 73 20  e first 8 items 
129c0 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65  above..** Each e
129d0 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  ntry in the jour
129e0 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  nal is an instan
129f0 63 65 20 6f 66 20 74 68 65 20 39 74 68 20 69 74  ce of the 9th it
12a00 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  em..**.** Call t
12a10 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  he value from th
12a20 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20  e second bullet 
12a30 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73  "nRec".  nRec is
12a40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
12a50 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74  * valid page ent
12a60 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ries in the jour
12a70 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61  nal.  In most ca
12a80 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d  ses, you can com
12a90 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75  pute the.** valu
12aa0 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74  e of nRec from t
12ab0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
12ac0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75  ournal file.  Bu
12ad0 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20  t if a power.** 
12ae0 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
12af0 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
12b00 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69  al was being wri
12b10 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62  tten, it could b
12b20 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68  e the.** case th
12b30 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  at the size of t
12b40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12b50 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
12b60 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a   increased but.*
12b70 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72  * the extra entr
12b80 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ies had not yet 
12b90 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74  made it safely t
12ba0 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68  o disk.  In such
12bb0 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20   a case,.** the 
12bc0 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f  value of nRec co
12bd0 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
12be0 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20  file size would 
12bf0 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46  be too large.  F
12c00 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f  or.** that reaso
12c10 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  n, we always use
12c20 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
12c30 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  in the header..*
12c40 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63  *.** If the nRec
12c50 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
12c60 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68  ffff it means th
12c70 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62  at nRec should b
12c80 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72  e computed.** fr
12c90 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
12ca0 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  .  This value is
12cb0 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75   used when the u
12cc0 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a  ser selects the.
12cd0 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f  ** no-sync optio
12ce0 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  n for the journa
12cf0 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c  l.  A power fail
12d00 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  ure could lead t
12d10 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20  o corruption.** 
12d20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42  in this case.  B
12d30 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69  ut for things li
12d40 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ke temporary tab
12d50 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62  le (which will b
12d60 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65  e.** deleted whe
12d70 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72  n the power is r
12d80 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27  estored) we don'
12d90 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  t care.  .**.** 
12da0 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
12db0 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  ed as the journa
12dc0 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  l file is not a 
12dd0 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a  well-formed.** j
12de0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
12df0 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f   all pages up to
12e00 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75   the first corru
12e10 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f  pted page are ro
12e20 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72  lled.** back (or
12e30 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65   no pages if the
12e40 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
12e50 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54  is corrupted). T
12e60 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
12e70 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74  ** is then delet
12e80 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
12e90 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20   returned, just 
12ea0 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74  as if no corrupt
12eb0 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20  ion had.** been 
12ec0 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a  encountered..**.
12ed0 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20  ** If an I/O or 
12ee0 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f  malloc() error o
12ef0 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e  ccurs, the journ
12f00 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64  al-file is not d
12f10 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e  eleted.** and an
12f20 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
12f30 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
12f40 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74  he isHot paramet
12f50 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  er indicates tha
12f60 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20  t we are trying 
12f70 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f  to rollback a jo
12f80 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69  urnal.** that mi
12f90 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75  ght be a hot jou
12fa0 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f  rnal.  Or, it co
12fb0 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65 20  uld be that the 
12fc0 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70  journal is .** p
12fd0 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73 65  reserved because
12fe0 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f   of JOURNALMODE_
12ff0 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e  PERSIST or JOURN
13000 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e  ALMODE_TRUNCATE.
13010 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
13020 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74  al really is hot
13030 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67 65  , reset the page
13040 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f  r cache prior ro
13050 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e  lling.** back an
13060 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74  y content.  If t
13070 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65  he journal is me
13080 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c  rely persistent,
13090 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20   no reset is.** 
130a0 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
130b0 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
130c0 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
130d0 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a  er, int isHot){.
130e0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
130f0 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
13100 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  fs;.  i64 szJ;  
13110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13120 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * Size of the jo
13130 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
13140 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65  tes */.  u32 nRe
13150 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
13160 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
13170 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f  ecords in the jo
13180 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75  urnal */.  u32 u
13190 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
131a0 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
131b0 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
131c0 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b    Pgno mxPg = 0;
131d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
131e0 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ze of the origin
131f0 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  al file in pages
13200 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
13210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13220 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66  * Result code of
13230 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
13240 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20  .  int res = 1; 
13250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
13260 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
13270 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
13280 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  () */.  char *zM
13290 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20  aster = 0;      
132a0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74   /* Name of mast
132b0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
132c0 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20  if any */.  int 
132d0 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b 20  needPagerReset; 
132e0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
132f0 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f 72  reset page prior
13300 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20 72   to first page r
13310 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f 2a  ollback */..  /*
13320 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
13330 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65  many records are
13340 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
13350 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66    Abort early if
13360 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  .  ** the journa
13370 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f  l is empty..  */
13380 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
13390 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
133a0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
133b0 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
133c0 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20  r->jfd, &szJ);. 
133d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
133e0 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a  OK || szJ==0 ){.
133f0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
13400 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  yback;.  }..  /*
13410 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72   Read the master
13420 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72   journal name fr
13430 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
13440 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74  if it is present
13450 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74  ..  ** If a mast
13460 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
13470 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  name is specifie
13480 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20  d, but the file 
13490 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73  is not.  ** pres
134a0 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65  ent on disk, the
134b0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
134c0 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65   not hot and doe
134d0 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
134e0 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63  .  ** played bac
134f0 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44  k..  **.  ** TOD
13500 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74  O: Technically t
13510 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
13520 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65  an error because
13530 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74   it assumes that
13540 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67  .  ** buffer Pag
13550 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20  er.pTmpSpace is 
13560 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62  (mxPathname+1) b
13570 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20  ytes or larger. 
13580 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28  i.e. that.  ** (
13590 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
135a0 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73   >= pPager->pVfs
135b0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e  ->mxPathname+1).
135c0 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63   Using os_unix.c
135d0 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61  ,.  **  mxPathna
135e0 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63 68  me is 512, which
135f0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
13600 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f  the minimum allo
13610 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a  wable value.  **
13620 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20   for pageSize.. 
13630 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20   */.  zMaster = 
13640 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
13650 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61  e;.  rc = readMa
13660 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
13670 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
13680 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
13690 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
136a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
136b0 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d  OK && zMaster[0]
136c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
136d0 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
136e0 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49  s, zMaster, SQLI
136f0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
13700 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a  , &res);.  }.  z
13710 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66  Master = 0;.  if
13720 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13730 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67  || !res ){.    g
13740 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
13750 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
13760 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
13770 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74    needPagerReset
13780 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20   = isHot;..  /* 
13790 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  This loop termin
137a0 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e  ates either when
137b0 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   a readJournalHd
137c0 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67  r() or .  ** pag
137d0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
137e0 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75  page() call retu
137f0 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
13800 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  or an IO error .
13810 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20    ** occurs. .  
13820 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  */.  while( 1 ){
13830 0a 20 20 20 20 69 6e 74 20 69 73 55 6e 73 79 6e  .    int isUnsyn
13840 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 52  c = 0;..    /* R
13850 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75  ead the next jou
13860 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d  rnal header from
13870 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13880 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  e.  If there are
13890 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75  .    ** not enou
138a0 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  gh bytes left in
138b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
138c0 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65  e for a complete
138d0 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20   header, or.    
138e0 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74  ** it is corrupt
138f0 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65  ed, then a proce
13900 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65  ss must of faile
13910 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  d while writing 
13920 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  it..    ** This 
13930 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e  indicates nothin
13940 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20  g more needs to 
13950 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
13960 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
13970 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
13980 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a  Pager, isHot, sz
13990 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29  J, &nRec, &mxPg)
139a0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
139b0 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20  LITE_OK ){ .    
139c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
139d0 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
139e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
139f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
13a00 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
13a10 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
13a20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66  If nRec is 0xfff
13a30 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73  fffff, then this
13a40 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65   journal was cre
13a50 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
13a60 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67  s.    ** working
13a70 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
13a80 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
13a90 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  t the rest of th
13aa0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
13ab0 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f   file consists o
13ac0 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61  f pages, there a
13ad0 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e  re no more journ
13ae0 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70  al headers. Comp
13af0 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76  ute.    ** the v
13b00 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73  alue of nRec bas
13b10 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d  ed on this assum
13b20 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
13b30 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66    if( nRec==0xff
13b40 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20  ffffff ){.      
13b50 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
13b60 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
13b70 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
13b80 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63  r) );.      nRec
13b90 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20   = (int)((szJ - 
13ba0 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
13bb0 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f  Pager))/JOURNAL_
13bc0 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a  PG_SZ(pPager));.
13bd0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
13be0 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74   nRec is 0 and t
13bf0 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  his rollback is 
13c00 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
13c10 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73   created by this
13c20 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  .    ** process 
13c30 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 74  and if this is t
13c40 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20  he final header 
13c50 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  in the journal, 
13c60 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20  then it means.  
13c70 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70    ** that this p
13c80 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
13c90 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c  al was being fil
13ca0 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20  led but has not 
13cb0 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20  yet been.    ** 
13cc0 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20  synced to disk. 
13cd0 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d   Compute the num
13ce0 62 65 72 20 6f 66 20 70 61 67 65 73 20 62 61 73  ber of pages bas
13cf0 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e  ed on the remain
13d00 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20  ing.    ** size 
13d10 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  of the file..   
13d20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74   **.    ** The t
13d30 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65  hird term of the
13d40 20 74 65 73 74 20 77 61 73 20 61 64 64 65 64 20   test was added 
13d50 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23 32  to fix ticket #2
13d60 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e  565..    ** When
13d70 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
13d80 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65  hot journal, nRe
13d90 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e  c==0 always mean
13da0 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a  s that the next.
13db0 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20      ** chunk of 
13dc0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74  the journal cont
13dd0 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20  ains zero pages 
13de0 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
13df0 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77  k.  But.    ** w
13e00 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c  hen doing a ROLL
13e10 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65  BACK and the nRe
13e20 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68  c==0 chunk is th
13e30 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a  e last chunk in.
13e40 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
13e50 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  al, it means tha
13e60 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  t the journal mi
13e70 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69  ght contain addi
13e80 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61  tional.    ** pa
13e90 67 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ges that need to
13ea0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
13eb0 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d  and that the num
13ec0 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20  ber of pages .  
13ed0 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63    ** should be c
13ee0 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e  omputed based on
13ef0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13f00 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  e size..    */. 
13f10 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 52 65     testcase( nRe
13f20 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 0a 20  c==0 && !isHot. 
13f30 20 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65          && pPage
13f40 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
13f50 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
13f60 67 65 72 29 21 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)!=pPager->jo
13f70 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 20 20 20  urnalOff.       
13f80 20 20 26 26 20 28 28 73 7a 4a 20 2d 20 70 50 61    && ((szJ - pPa
13f90 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
13fa0 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   / JOURNAL_PG_SZ
13fb0 28 70 50 61 67 65 72 29 29 3e 30 0a 20 20 20 20  (pPager))>0.    
13fc0 20 20 20 20 20 26 26 20 70 61 67 65 72 4e 65 78       && pagerNex
13fd0 74 4a 6f 75 72 6e 61 6c 50 61 67 65 49 73 56 61  tJournalPageIsVa
13fe0 6c 69 64 28 70 50 61 67 65 72 29 0a 20 20 20 20  lid(pPager).    
13ff0 29 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  );.    if( nRec=
14000 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a  =0 && !isHot &&.
14010 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
14020 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
14030 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
14040 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
14050 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e  alOff ){.      n
14060 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a  Rec = (int)((szJ
14070 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
14080 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c  alOff) / JOURNAL
14090 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
140a0 0a 20 20 20 20 20 20 69 73 55 6e 73 79 6e 63 20  .      isUnsync 
140b0 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
140c0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
140d0 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72  e first header r
140e0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
140f0 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74  rnal, truncate t
14100 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
14110 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20  se file back to 
14120 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
14130 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
14140 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
14150 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
14160 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
14170 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
14180 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
14190 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69  , mxPg);.      i
141a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
141b0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
141c0 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
141d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
141e0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78  ger->dbSize = mx
141f0 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  Pg;.    }..    /
14200 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
14210 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
14220 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
14230 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20  k into the .    
14240 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
14250 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63   and/or page cac
14260 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  he..    */.    f
14270 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20  or(u=0; u<nRec; 
14280 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  u++){.      if( 
14290 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20 29  needPagerReset )
142a0 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
142b0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
142c0 20 20 20 20 20 20 20 6e 65 65 64 50 61 67 65 72         needPager
142d0 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  Reset = 0;.     
142e0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61   }.      rc = pa
142f0 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
14300 5f 70 61 67 65 28 70 50 61 67 65 72 2c 31 2c 69  _page(pPager,1,i
14310 73 55 6e 73 79 6e 63 2c 26 70 50 61 67 65 72 2d  sUnsync,&pPager-
14320 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 30 29  >journalOff,0,0)
14330 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
14340 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14350 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
14360 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
14370 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
14380 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
14390 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
143a0 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20  ff = szJ;.      
143b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
143c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
143d0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
143e0 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62   unable to rollb
143f0 61 63 6b 2c 20 71 75 69 74 20 61 6e 64 20 72 65  ack, quit and re
14400 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 0a 20  turn the error. 
14410 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65           ** code
14420 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75  .  This will cau
14430 73 65 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  se the pager to 
14440 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20  enter the error 
14450 73 74 61 74 65 0a 20 20 20 20 20 20 20 20 20 20  state.          
14460 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20 66 75  ** so that no fu
14470 72 74 68 65 72 20 68 61 72 6d 20 77 69 6c 6c 20  rther harm will 
14480 62 65 20 64 6f 6e 65 2e 20 20 50 65 72 68 61 70  be done.  Perhap
14490 73 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20  s the next.     
144a0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20       ** process 
144b0 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69  to come along wi
144c0 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f  ll be able to ro
144d0 6c 6c 62 61 63 6b 20 74 68 65 20 64 61 74 61 62  llback the datab
144e0 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
144f0 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  /.          goto
14500 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
14510 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14520 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e  .    }.  }.  /*N
14530 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73  OTREACHED*/.  as
14540 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f  sert( 0 );..end_
14550 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46  playback:.  /* F
14560 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62  ollowing a rollb
14570 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
14580 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
14590 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69   back in its ori
145a0 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65  ginal.  ** state
145b0 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
145c0 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
145d0 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b  action, so invok
145e0 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54  e the.  ** SQLIT
145f0 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41  E_FCNTL_DB_UNCHA
14600 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f  NGED file-contro
14610 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61  l method to disa
14620 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73  ble the.  ** ass
14630 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20  ertion that the 
14640 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
14650 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64  ter was modified
14660 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
14670 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 64 2d  .    pPager->fd-
14680 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20 7c 7c 0a  >pMethods==0 ||.
14690 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
146a0 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d  eControl(pPager-
146b0 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c  >fd,SQLITE_FCNTL
146c0 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29  _DB_UNCHANGED,0)
146d0 3e 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 3b  >=SQLITE_OK.  );
146e0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
146f0 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70 70 65  layback is happe
14700 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61 6c  ning automatical
14710 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ly as a result o
14720 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a  f an IO or .  **
14730 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68   malloc error th
14740 61 74 20 6f 63 63 75 72 72 65 64 20 61 66 74 65  at occurred afte
14750 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  r the change-cou
14760 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64  nter was updated
14770 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72   but .  ** befor
14780 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
14790 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c  n was committed,
147a0 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65   then the change
147b0 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d  -counter .  ** m
147c0 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20  odification may 
147d0 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 72  just have been r
147e0 65 76 65 72 74 65 64 2e 20 49 66 20 74 68 69 73  everted. If this
147f0 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c   happens in excl
14800 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65  usive .  ** mode
14810 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e  , then subsequen
14820 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 70  t transactions p
14830 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20  erformed by the 
14840 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20  connection will 
14850 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65 20  not.  ** update 
14860 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
14870 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73 20  er at all. This 
14880 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63 68  may lead to cach
14890 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a  e inconsistency.
148a0 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f    ** problems fo
148b0 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  r other processe
148c0 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20  s at some point 
148d0 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20 53  in the future. S
148e0 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20  o, just.  ** in 
148f0 63 61 73 65 20 74 68 69 73 20 68 61 73 20 68 61  case this has ha
14900 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74 68  ppened, clear th
14910 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
14920 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f  e flag now..  */
14930 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
14940 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
14950 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a  ger->tempFile;..
14960 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14970 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74  _OK ){.    zMast
14980 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
14990 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d  pSpace;.    rc =
149a0 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
149b0 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
149c0 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
149d0 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
149e0 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61  e+1);.    testca
149f0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
14a00 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  K );.  }.  if( r
14a10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
14a20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
14a30 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
14a40 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30  Pager, zMaster[0
14a50 5d 21 3d 27 5c 30 27 29 3b 0a 20 20 20 20 74 65  ]!='\0');.    te
14a60 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
14a70 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
14a80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14a90 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26   && zMaster[0] &
14aa0 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20  & res ){.    /* 
14ab0 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
14ac0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
14ad0 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
14ae0 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65  ill return succe
14af0 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69  ss,.    ** see i
14b00 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
14b10 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
14b20 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20  aster journal.. 
14b30 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
14b40 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70  ager_delmaster(p
14b50 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
14b60 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
14b70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
14b80 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61    }..  /* The Pa
14b90 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
14ba0 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65  ariable may have
14bb0 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68   been updated wh
14bc0 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a  ile rolling.  **
14bd0 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
14be0 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
14bf0 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66  cess with a diff
14c00 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a  erent sector siz
14c10 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65  e.  ** value. Re
14c20 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f  set it to the co
14c30 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20  rrect value for 
14c40 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20  this process..  
14c50 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69  */.  setSectorSi
14c60 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ze(pPager);.  re
14c70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14c80 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70  * Playback savep
14c90 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e  oint pSavepoint.
14ca0 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69   Or, if pSavepoi
14cb0 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70  nt==NULL, then p
14cc0 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65  layback.** the e
14cd0 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
14ce0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63  rnal file. The c
14cf0 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d  ase pSavepoint==
14d00 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e  NULL occurs when
14d10 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20   .** a ROLLBACK 
14d20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e  TO command is in
14d30 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50  voked on a SAVEP
14d40 4f 49 4e 54 20 74 68 61 74 20 69 73 20 61 20 74  OINT that is a t
14d50 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73  ransaction .** s
14d60 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  avepoint..**.** 
14d70 57 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20  When pSavepoint 
14d80 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61  is not NULL (mea
14d90 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73  ning a non-trans
14da0 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74  action savepoint
14db0 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f   is .** being ro
14dc0 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e  lled back), then
14dd0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f   the rollback co
14de0 6e 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20  nsists of up to 
14df0 74 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a  three stages,.**
14e00 20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68   performed in th
14e10 65 20 6f 72 64 65 72 20 73 70 65 63 69 66 69 65  e order specifie
14e20 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67  d:.**.**   * Pag
14e30 65 73 20 61 72 65 20 70 6c 61 79 65 64 20 62 61  es are played ba
14e40 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
14e50 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
14e60 67 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20  g at byte.**    
14e70 20 6f 66 66 73 65 74 20 50 61 67 65 72 53 61 76   offset PagerSav
14e80 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61  epoint.iOffset a
14e90 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
14ea0 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61   .**     PagerSa
14eb0 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
14ec0 65 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e  et, or to the en
14ed0 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  d of the main jo
14ee0 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c  urnal.**     fil
14ef0 65 20 69 66 20 50 61 67 65 72 53 61 76 65 70 6f  e if PagerSavepo
14f00 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69  int.iHdrOffset i
14f10 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20  s zero..**.**   
14f20 2a 20 49 66 20 50 61 67 65 72 53 61 76 65 70 6f  * If PagerSavepo
14f30 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69  int.iHdrOffset i
14f40 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
14f50 20 70 61 67 65 73 20 61 72 65 20 70 6c 61 79 65   pages are playe
14f60 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74  d.**     back st
14f70 61 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  arting from the 
14f80 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
14f90 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
14fa0 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67  wing .**     Pag
14fb0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
14fc0 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e  Offset to the en
14fd0 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  d of the main jo
14fe0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
14ff0 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20  *   * Pages are 
15000 74 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  then played back
15010 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
15020 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72  urnal file, star
15030 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68  ting.**     with
15040 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
15050 69 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20  int.iSubRec and 
15060 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68  continuing to th
15070 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20  e end of.**     
15080 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
15090 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f  ..**.** Througho
150a0 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ut the rollback 
150b0 70 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69  process, each ti
150c0 6d 65 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c  me a page is rol
150d0 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a  led back, the.**
150e0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
150f0 69 74 20 69 73 20 73 65 74 20 69 6e 20 61 20 62  it is set in a b
15100 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20  itvec structure 
15110 28 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20  (variable pDone 
15120 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d  in the.** implem
15130 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e  entation below).
15140 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
15150 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 20 70   ensure that a p
15160 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72  age is only.** r
15170 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66  olled back the f
15180 69 72 73 74 20 74 69 6d 65 20 69 74 20 69 73 20  irst time it is 
15190 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65  encountered in e
151a0 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ither journal..*
151b0 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69  *.** If pSavepoi
151c0 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  nt is NULL, then
151d0 20 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20   pages are only 
151e0 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
151f0 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
15200 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65  rnal file. There
15210 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
15220 61 20 62 69 74 76 65 63 20 69 6e 20 74 68 69 73  a bitvec in this
15230 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20   case..**.** In 
15240 65 69 74 68 65 72 20 63 61 73 65 2c 20 62 65 66  either case, bef
15250 6f 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d  ore playback com
15260 6d 65 6e 63 65 73 20 74 68 65 20 50 61 67 65 72  mences the Pager
15270 2e 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65  .dbSize variable
15280 0a 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20  .** is reset to 
15290 74 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 69  the value that i
152a0 74 20 68 65 6c 64 20 61 74 20 74 68 65 20 73 74  t held at the st
152b0 61 72 74 20 6f 66 20 74 68 65 20 73 61 76 65 70  art of the savep
152c0 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61  oint .** (or tra
152d0 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61  nsaction). No pa
152e0 67 65 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e  ge with a page-n
152f0 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
15300 61 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a  an this value.**
15310 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   is played back.
15320 20 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75   If one is encou
15330 6e 74 65 72 65 64 20 69 74 20 69 73 20 73 69 6d  ntered it is sim
15340 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a  ply skipped..*/.
15350 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
15360 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e  PlaybackSavepoin
15370 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
15380 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
15390 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20  *pSavepoint){.  
153a0 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
153b0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65           /* Effe
153c0 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
153d0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  e main journal *
153e0 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
153f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15400 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65 67  End of first seg
15410 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75  ment of main-jou
15420 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a  rnal records */.
15430 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15440 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65  E_OK;      /* Re
15450 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42  turn code */.  B
15460 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30  itvec *pDone = 0
15470 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65  ;       /* Bitve
15480 63 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65  c to ensure page
15490 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e  s played back on
154a0 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73  ly once */..  as
154b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
154c0 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
154d0 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  D );..  /* Alloc
154e0 61 74 65 20 61 20 62 69 74 76 65 63 20 74 6f 20  ate a bitvec to 
154f0 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  use to store the
15500 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f   set of pages ro
15510 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  lled back */.  i
15520 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
15530 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c  .    pDone = sql
15540 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
15550 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72  (pSavepoint->nOr
15560 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44  ig);.    if( !pD
15570 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  one ){.      ret
15580 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
15590 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
155a0 2a 20 53 65 74 20 74 68 65 20 64 61 74 61 62 61  * Set the databa
155b0 73 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20  se size back to 
155c0 74 68 65 20 76 61 6c 75 65 20 69 74 20 77 61 73  the value it was
155d0 20 62 65 66 6f 72 65 20 74 68 65 20 73 61 76 65   before the save
155e0 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e  point .  ** bein
155f0 67 20 72 65 76 65 72 74 65 64 20 77 61 73 20 6f  g reverted was o
15600 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50  pened..  */.  pP
15610 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
15620 53 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76  Savepoint ? pSav
15630 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20  epoint->nOrig : 
15640 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
15650 7a 65 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50  ze;..  /* Use pP
15660 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15670 20 61 73 20 74 68 65 20 65 66 66 65 63 74 69 76   as the effectiv
15680 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61  e size of the ma
15690 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  in rollback.  **
156a0 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61   journal.  The a
156b0 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74  ctual file might
156c0 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
156d0 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47  this in.  ** PAG
156e0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
156f0 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52  RUNCATE or PAGER
15700 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
15710 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68  SIST.  But anyth
15720 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50  ing.  ** past pP
15730 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15740 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74   is off-limits t
15750 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a  o us..  */.  szJ
15760 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
15770 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 42 65 67  alOff;..  /* Beg
15780 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61  in by rolling ba
15790 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ck records from 
157a0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
157b0 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a   starting at.  *
157c0 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  * PagerSavepoint
157d0 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e  .iOffset and con
157e0 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e  tinuing to the n
157f0 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ext journal head
15800 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d  er..  ** There m
15810 69 67 68 74 20 62 65 20 72 65 63 6f 72 64 73 20  ight be records 
15820 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
15830 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20 61 20  nal that have a 
15840 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
15850 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
15860 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61  e current databa
15870 73 65 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d  se size (pPager-
15880 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f  >dbSize) but tho
15890 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  se.  ** will be 
158a0 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69  skipped automati
158b0 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72  cally.  Pages ar
158c0 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65  e added to pDone
158d0 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72   as they.  ** ar
158e0 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  e played back.. 
158f0 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
15900 6f 69 6e 74 20 29 7b 0a 20 20 20 20 69 48 64 72  oint ){.    iHdr
15910 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  Off = pSavepoint
15920 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70  ->iHdrOffset ? p
15930 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f  Savepoint->iHdrO
15940 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20  ffset : szJ;.   
15950 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15960 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  Off = pSavepoint
15970 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77  ->iOffset;.    w
15980 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
15990 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  _OK && pPager->j
159a0 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66  ournalOff<iHdrOf
159b0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
159c0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
159d0 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
159e0 31 2c 20 30 2c 20 26 70 50 61 67 65 72 2d 3e 6a  1, 0, &pPager->j
159f0 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 2c 20 70 44  ournalOff, 1, pD
15a00 6f 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  one);.    }.    
15a10 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
15a20 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c  TE_DONE );.  }el
15a30 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
15a40 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
15a50 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e    }..  /* Contin
15a60 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ue rolling back 
15a70 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66 20 74  records out of t
15a80 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
15a90 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a  starting at.  **
15aa0 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
15ab0 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e 20 61  al header seen a
15ac0 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e  nd continuing un
15ad0 74 69 6c 20 74 68 65 20 65 66 66 65 63 74 69 76  til the effectiv
15ae0 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68  e end.  ** of th
15af0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
15b00 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74  ile.  Continue t
15b10 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61  o skip out-of-ra
15b20 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a 20 20  nge pages and.  
15b30 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64 64 69  ** continue addi
15b40 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20  ng pages rolled 
15b50 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20  back to pDone.. 
15b60 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   */.  while( rc=
15b70 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
15b80 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15b90 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20  <szJ ){.    u32 
15ba0 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ii;            /
15bb0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
15bc0 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20  /.    u32 nJRec 
15bd0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  = 0;     /* Numb
15be0 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65  er of Journal Re
15bf0 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32  cords */.    u32
15c00 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d   dummy;.    rc =
15c10 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
15c20 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20  pPager, 0, szJ, 
15c30 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b  &nJRec, &dummy);
15c40 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
15c50 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
15c60 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
15c70 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72  he "pPager->jour
15c80 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
15c90 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
15ca0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
15cb0 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 69  f".    ** test i
15cc0 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74 69 63  s related to tic
15cd0 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65 65 20  ket #2565.  See 
15ce0 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20 69  the discussion i
15cf0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  n the.    ** pag
15d00 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 66 75  er_playback() fu
15d10 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74  nction for addit
15d20 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
15d30 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
15d40 73 65 72 74 28 20 21 28 6e 4a 52 65 63 3d 3d 30  sert( !(nJRec==0
15d50 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61  .         && pPa
15d60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
15d70 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
15d80 50 61 67 65 72 29 21 3d 70 50 61 67 65 72 2d 3e  Pager)!=pPager->
15d90 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 20  journalOff.     
15da0 20 20 20 20 26 26 20 28 28 73 7a 4a 20 2d 20 70      && ((szJ - p
15db0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
15dc0 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  f) / JOURNAL_PG_
15dd0 53 5a 28 70 50 61 67 65 72 29 29 3e 30 0a 20 20  SZ(pPager))>0.  
15de0 20 20 20 20 20 20 20 26 26 20 70 61 67 65 72 4e         && pagerN
15df0 65 78 74 4a 6f 75 72 6e 61 6c 50 61 67 65 49 73  extJournalPageIs
15e00 56 61 6c 69 64 28 70 50 61 67 65 72 29 29 0a 20  Valid(pPager)). 
15e10 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4a     );.    if( nJ
15e20 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20  Rec==0 .     && 
15e30 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
15e40 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
15e50 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
15e60 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
15e70 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63    ){.      nJRec
15e80 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20   = (u32)((szJ - 
15e90 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15ea0 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ff)/JOURNAL_PG_S
15eb0 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
15ec0 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  }.    for(ii=0; 
15ed0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
15ee0 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61   ii<nJRec && pPa
15ef0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
15f00 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  szJ; ii++){.    
15f10 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
15f20 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
15f30 50 61 67 65 72 2c 20 31 2c 20 30 2c 20 26 70 50  Pager, 1, 0, &pP
15f40 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15f50 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20  , 1, pDone);.   
15f60 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
15f70 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
15f80 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
15f90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
15fa0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15fb0 4f 66 66 3d 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f  Off==szJ );..  /
15fc0 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c  * Finally,  roll
15fd0 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20  back pages from 
15fe0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
15ff0 20 20 50 61 67 65 20 74 68 61 74 20 77 65 72 65    Page that were
16000 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79  .  ** previously
16010 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74   rolled back out
16020 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
16030 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65  rnal (and are he
16040 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20  nce in pDone).  
16050 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70  ** will be skipp
16060 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67  ed.  Out-of-rang
16070 65 20 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f  e pages are also
16080 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20   skipped..  */. 
16090 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20   if( pSavepoint 
160a0 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20  ){.    u32 ii;  
160b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
160c0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
160d0 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70 53   i64 offset = pS
160e0 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65  avepoint->iSubRe
160f0 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  c*(4+pPager->pag
16100 65 53 69 7a 65 29 3b 0a 20 20 20 20 66 6f 72 28  eSize);.    for(
16110 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69  ii=pSavepoint->i
16120 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49  SubRec; rc==SQLI
16130 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67  TE_OK && ii<pPag
16140 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b  er->nSubRec; ii+
16150 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
16160 28 20 6f 66 66 73 65 74 3d 3d 69 69 2a 28 34 2b  ( offset==ii*(4+
16170 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
16180 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
16190 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
161a0 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
161b0 30 2c 20 30 2c 20 26 6f 66 66 73 65 74 2c 20 31  0, 0, &offset, 1
161c0 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20 20 7d 0a  , pDone);.    }.
161d0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
161e0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
161f0 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74   }..  sqlite3Bit
16200 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65  vecDestroy(pDone
16210 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
16220 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
16230 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
16240 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 72 65   = szJ;.  }.  re
16250 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
16260 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78  * Change the max
16270 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69  imum number of i
16280 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74  n-memory pages t
16290 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e  hat are allowed.
162a0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
162b0 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
162c0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
162d0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
162e0 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
162f0 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72  Cachesize(pPager
16300 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67  ->pPCache, mxPag
16310 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a  e);.}../*.** Adj
16320 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65  ust the robustne
16330 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ss of the databa
16340 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65  se to damage due
16350 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a   to OS crashes.*
16360 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75  * or power failu
16370 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20  res by changing 
16380 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79  the number of sy
16390 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74  ncs()s when writ
163a0 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  ing.** the rollb
163b0 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ack journal.  Th
163c0 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65  ere are three le
163d0 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  vels:.**.**    O
163e0 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  FF       sqlite3
163f0 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65  OsSync() is neve
16400 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20  r called.  This 
16410 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a  is the default.*
16420 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  *              f
16430 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64  or temporary and
16440 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73   transient files
16450 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41  ..**.**    NORMA
16460 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c  L    The journal
16470 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20   is synced once 
16480 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
16490 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
164a0 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
164b0 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f  ase.  This is no
164c0 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20  rmally adequate 
164d0 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a  protection, but.
164e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
164f0 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61  it is theoretica
16500 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68  lly possible, th
16510 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65  ough very unlike
16520 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ly,.**          
16530 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70      that an inop
16540 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69  ertune power fai
16550 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65  lure could leave
16560 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
16570 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20               in 
16580 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f  a state which wo
16590 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65  uld cause damage
165a0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
165b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
165c0 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c   when it is roll
165d0 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ed back..**.**  
165e0 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20    FULL      The 
165f0 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
16600 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77  d twice before w
16610 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
16620 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
16630 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74     database (wit
16640 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61  h some additiona
16650 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  l information - 
16660 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a  the nRec field.*
16670 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  *              o
16680 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
16690 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69  ader - being wri
166a0 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20  tten in between 
166b0 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20  the two.**      
166c0 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20          syncs). 
166d0 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68   If we assume th
166e0 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20  at writing a.** 
166f0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e               sin
16700 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20  gle disk sector 
16710 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20  is atomic, then 
16720 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64  this mode provid
16730 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  es.**           
16740 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61     assurance tha
16750 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69  t the journal wi
16760 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70  ll not be corrup
16770 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20  ted to the.**   
16780 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74             point
16790 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61   of causing dama
167a0 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
167b0 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  se during rollba
167c0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69  ck..**.** Numeri
167d0 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61  c values associa
167e0 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73  ted with these s
167f0 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31  tates are OFF==1
16800 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61  , NORMAL=2,.** a
16810 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69  nd FULL=3..*/.#i
16820 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16830 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
16840 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
16850 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  rSetSafetyLevel(
16860 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
16870 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 62 46  nt level, int bF
16880 75 6c 6c 46 73 79 6e 63 29 7b 0a 20 20 70 50 61  ullFsync){.  pPa
16890 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28  ger->noSync =  (
168a0 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67  level==1 || pPag
168b0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31  er->tempFile) ?1
168c0 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  :0;.  pPager->fu
168d0 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d  llSync = (level=
168e0 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  =3 && !pPager->t
168f0 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20  empFile) ?1:0;. 
16900 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
16910 61 67 73 20 3d 20 28 62 46 75 6c 6c 46 73 79 6e  ags = (bFullFsyn
16920 63 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  c?SQLITE_SYNC_FU
16930 4c 4c 3a 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  LL:SQLITE_SYNC_N
16940 4f 52 4d 41 4c 29 3b 0a 20 20 69 66 28 20 70 50  ORMAL);.  if( pP
16950 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70  ager->noSync ) p
16960 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
16970 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  = 0;.}.#endif../
16980 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
16990 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
169a0 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  le is incremente
169b0 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c  d whenever the l
169c0 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70  ibrary.** attemp
169d0 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  ts to open a tem
169e0 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68  porary file.  Th
169f0 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
16a00 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65  s used for.** te
16a10 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
16a20 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69  is only.  .*/.#i
16a30 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
16a40 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
16a50 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b  ntemp_count = 0;
16a60 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
16a70 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
16a80 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74  file..**.** Writ
16a90 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
16aa0 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c  iptor into *pFil
16ab0 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  e. Return SQLITE
16ac0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 0a  _OK on success .
16ad0 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ** or some other
16ae0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
16af0 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77  e fail. The OS w
16b00 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
16b10 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65  y .** delete the
16b20 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
16b30 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
16b40 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  d..**.** The fla
16b50 67 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  gs passed to the
16b60 20 56 46 53 20 6c 61 79 65 72 20 78 4f 70 65 6e   VFS layer xOpen
16b70 28 29 20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73  () call are thos
16b80 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62  e specified.** b
16b90 79 20 70 61 72 61 6d 65 74 65 72 20 76 66 73 46  y parameter vfsF
16ba0 6c 61 67 73 20 4f 52 65 64 20 77 69 74 68 20 74  lags ORed with t
16bb0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
16bc0 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
16bd0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a  PEN_READWRITE.**
16be0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
16bf0 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20 20 20 53  _CREATE.**     S
16c00 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
16c10 53 49 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  SIVE.**     SQLI
16c20 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
16c30 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20  CLOSE.*/.static 
16c40 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d  int pagerOpentem
16c50 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  p(.  Pager *pPag
16c60 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  er,        /* Th
16c70 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  e pager object *
16c80 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
16c90 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69   *pFile,  /* Wri
16ca0 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  te the file desc
16cb0 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20  riptor here */. 
16cc0 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20   int vfsFlags   
16cd0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
16ce0 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
16cf0 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a  o the VFS */.){.
16d00 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
16d10 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
16d20 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65  n code */..#ifde
16d30 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
16d40 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
16d50 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73  _count++;  /* Us
16d60 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
16d70 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
16d80 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66   */.#endif..  vf
16d90 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54  sFlags |=  SQLIT
16da0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
16db0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
16dc0 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20  REATE |.        
16dd0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
16de0 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49  EXCLUSIVE | SQLI
16df0 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
16e00 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71  CLOSE;.  rc = sq
16e10 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61 67  lite3OsOpen(pPag
16e20 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46 69  er->pVfs, 0, pFi
16e30 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29  le, vfsFlags, 0)
16e40 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
16e50 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
16e60 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20 20  pen(pFile) );.  
16e70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16e80 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79  .** Set the busy
16e90 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f   handler functio
16ea0 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  n..**.** The pag
16eb0 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 62  er invokes the b
16ec0 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20 73  usy-handler if s
16ed0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72  qlite3OsLock() r
16ee0 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54  eturns .** SQLIT
16ef0 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79 69  E_BUSY when tryi
16f00 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ng to upgrade fr
16f10 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20  om no-lock to a 
16f20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20  SHARED lock,.** 
16f30 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74  or when trying t
16f40 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61  o upgrade from a
16f50 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74   RESERVED lock t
16f60 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a  o an EXCLUSIVE .
16f70 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73  ** lock. It does
16f80 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68   *not* invoke th
16f90 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77  e busy handler w
16fa0 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72  hen upgrading fr
16fb0 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f 20  om.** SHARED to 
16fc0 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68 65  RESERVED, or whe
16fd0 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d  n upgrading from
16fe0 20 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c 55   SHARED to EXCLU
16ff0 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f  SIVE.** (which o
17000 63 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f 74  ccurs during hot
17010 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
17020 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a  k). Summary:.**.
17030 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e 20  **   Transition 
17040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17050 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73         | Invokes
17060 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a   xBusyHandler.**
17070 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
17080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
170a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
170b0 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d   NO_LOCK       -
170c0 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20  > SHARED_LOCK   
170d0 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48     | Yes.**   SH
170e0 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52  ARED_LOCK   -> R
170f0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20  ESERVED_LOCK    
17100 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44  | No.**   SHARED
17110 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55  _LOCK   -> EXCLU
17120 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f  SIVE_LOCK   | No
17130 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f 4c  .**   RESERVED_L
17140 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  OCK -> EXCLUSIVE
17150 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a  _LOCK   | Yes.**
17160 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79 2d  .** If the busy-
17170 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
17180 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
17190 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a  o, the lock is .
171a0 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20 69  ** retried. If i
171b0 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20  t returns zero, 
171c0 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  then the SQLITE_
171d0 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a  BUSY error is.**
171e0 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
171f0 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20 70   caller of the p
17200 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f  ager API functio
17210 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
17220 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
17230 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a  ndler(.  Pager *
17240 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
17250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17260 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
17270 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61  .  int (*xBusyHa
17280 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c 20  ndler)(void *), 
17290 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
172a0 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c  er to busy-handl
172b0 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  er function */. 
172c0 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64   void *pBusyHand
172d0 6c 65 72 41 72 67 20 20 20 20 20 20 20 20 20 20  lerArg          
172e0 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
172f0 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42 75  t to pass to xBu
17300 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20  syHandler */.){ 
17310 20 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73   .  pPager->xBus
17320 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79  yHandler = xBusy
17330 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65  Handler;.  pPage
17340 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
17350 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65  rg = pBusyHandle
17360 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rArg;.}../*.** S
17370 65 74 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  et the reinitial
17380 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  izer for this pa
17390 67 65 72 2e 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  ger. If not NULL
173a0 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69  , the reinitiali
173b0 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  zer.** is called
173c0 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   when the conten
173d0 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63  t of a page in c
173e0 61 63 68 65 20 69 73 20 6d 6f 64 69 66 69 65 64  ache is modified
173f0 20 28 72 65 73 74 6f 72 65 64 29 0a 2a 2a 20 61   (restored).** a
17400 73 20 70 61 72 74 20 6f 66 20 61 20 74 72 61 6e  s part of a tran
17410 73 61 63 74 69 6f 6e 20 6f 72 20 73 61 76 65 70  saction or savep
17420 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 20 54  oint rollback. T
17430 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65  he callback give
17440 73 20 0a 2a 2a 20 68 69 67 68 65 72 2d 6c 65 76  s .** higher-lev
17450 65 6c 20 63 6f 64 65 20 61 6e 20 6f 70 70 6f 72  el code an oppor
17460 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72  tunity to restor
17470 65 20 74 68 65 20 45 58 54 52 41 20 73 65 63 74  e the EXTRA sect
17480 69 6f 6e 20 74 6f 20 0a 2a 2a 20 61 67 72 65 65  ion to .** agree
17490 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
174a0 65 64 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  ed page data..*/
174b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
174c0 65 72 53 65 74 52 65 69 6e 69 74 65 72 28 50 61  erSetReiniter(Pa
174d0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69  ger *pPager, voi
174e0 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50  d (*xReinit)(DbP
174f0 61 67 65 2a 29 29 7b 0a 20 20 70 50 61 67 65 72  age*)){.  pPager
17500 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52  ->xReiniter = xR
17510 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  einit;.}../*.** 
17520 52 65 70 6f 72 74 20 74 68 65 20 63 75 72 72 65  Report the curre
17530 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64  nt page size and
17540 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
17550 76 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a 2a  ved bytes back.*
17560 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e 0a  * to the codec..
17570 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
17580 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74 69  _HAS_CODEC.stati
17590 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 70 6f  c void pagerRepo
175a0 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  rtSize(Pager *pP
175b0 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
175c0 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43  ger->xCodecSizeC
175d0 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67 65  hng ){.    pPage
175e0 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e  r->xCodecSizeChn
175f0 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63  g(pPager->pCodec
17600 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
17610 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
17620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
17630 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65 73  int)pPager->nRes
17640 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  erve);.  }.}.#el
17650 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  se.# define page
17660 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20 20  rReportSize(X)  
17670 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20 77     /* No-op if w
17680 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  e do not support
17690 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e 64   a codec */.#end
176a0 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  if../*.** Change
176b0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 75   the page size u
176c0 73 65 64 20 62 79 20 74 68 65 20 50 61 67 65 72  sed by the Pager
176d0 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77   object. The new
176e0 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69   page size .** i
176f0 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61  s passed in *pPa
17700 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  geSize..**.** If
17710 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
17720 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
17730 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
17740 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
17750 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  t.** is a no-op.
17760 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
17770 6e 65 64 20 69 73 20 74 68 65 20 65 72 72 6f 72  ned is the error
17780 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64   state error cod
17790 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20  e (i.e. .** one 
177a0 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  of SQLITE_IOERR,
177b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
177c0 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e  or SQLITE_FULL).
177d0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
177e0 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  , if all of the 
177f0 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
17800 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  ue:.**.**   * th
17810 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  e new page size 
17820 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65  (value of *pPage
17830 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28  Size) is valid (
17840 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20  a power .**     
17850 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35  of two between 5
17860 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41  12 and SQLITE_MA
17870 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63  X_PAGE_SIZE, inc
17880 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a  lusive), and.**.
17890 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72 65  **   * there are
178a0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
178b0 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c  page references,
178c0 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   and.**.**   * t
178d0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
178e0 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d  ither not an in-
178f0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
17900 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20  or it is.**     
17910 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
17920 61 62 61 73 65 20 74 68 61 74 20 63 75 72 72 65  abase that curre
17930 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66  ntly consists of
17940 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a   zero pages..**.
17950 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  ** then the page
17960 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69  r object page si
17970 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50  ze is set to *pP
17980 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ageSize..**.** I
17990 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
179a0 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e  is changed, then
179b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75   this function u
179c0 73 65 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ses sqlite3Pager
179d0 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20  Malloc() .** to 
179e0 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67  obtain a new Pag
179f0 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66  er.pTmpSpace buf
17a00 66 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c  fer. If this all
17a10 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
17a20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
17a30 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
17a40 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65  ned and the page
17a50 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e   size remains un
17a60 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20  changed. .** In 
17a70 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c  all other cases,
17a80 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
17a90 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
17aa0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
17ab0 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65  s not changed, e
17ac0 69 74 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e  ither because on
17ad0 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61  e of the enumera
17ae0 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e  ted.** condition
17af0 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74  s above is not t
17b00 72 75 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  rue, the pager w
17b10 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  as in error stat
17b20 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66  e when this.** f
17b30 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
17b40 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74  ed, or because t
17b50 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
17b60 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69  tion attempt fai
17b70 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70  led, .** then *p
17b80 50 61 67 65 53 69 7a 65 20 69 73 20 73 65 74 20  PageSize is set 
17b90 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61  to the old, reta
17ba0 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20 62  ined page size b
17bb0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
17bc0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
17bd0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
17be0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75  Pager *pPager, u
17bf0 31 36 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69  16 *pPageSize, i
17c00 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20  nt nReserve){.  
17c10 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d  int rc = pPager-
17c20 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69 66 28 20  >errCode;.  if( 
17c30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17c40 0a 20 20 20 20 75 31 36 20 70 61 67 65 53 69 7a  .    u16 pageSiz
17c50 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a  e = *pPageSize;.
17c60 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
17c70 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65  Size==0 || (page
17c80 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
17c90 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
17ca0 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a  X_PAGE_SIZE) );.
17cb0 20 20 20 20 69 66 28 20 70 61 67 65 53 69 7a 65      if( pageSize
17cc0 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 70 50   && pageSize!=pP
17cd0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a  ager->pageSize .
17ce0 20 20 20 20 20 26 26 20 28 70 50 61 67 65 72 2d       && (pPager-
17cf0 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61  >memDb==0 || pPa
17d00 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a  ger->dbSize==0).
17d10 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
17d20 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
17d30 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
17d40 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0 .    ){.      
17d50 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 28 63 68  char *pNew = (ch
17d60 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ar *)sqlite3Page
17d70 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29  Malloc(pageSize)
17d80 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65  ;.      if( !pNe
17d90 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  w ){.        rc 
17da0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
17db0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17dc0 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
17dd0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
17de0 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
17df0 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
17e00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
17e10 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
17e20 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20  TmpSpace);.     
17e30 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53     pPager->pTmpS
17e40 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  pace = pNew;.   
17e50 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
17e60 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 50  heSetPageSize(pP
17e70 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
17e80 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
17e90 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 50 61  }.    }.    *pPa
17ea0 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70 50  geSize = (u16)pP
17eb0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
17ec0 20 20 20 20 69 66 28 20 6e 52 65 73 65 72 76 65      if( nReserve
17ed0 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20  <0 ) nReserve = 
17ee0 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
17ef0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 52  ;.    assert( nR
17f00 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65  eserve>=0 && nRe
17f10 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20  serve<1000 );.  
17f20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72    pPager->nReser
17f30 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72  ve = (i16)nReser
17f40 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70  ve;.    pagerRep
17f50 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b  ortSize(pPager);
17f60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
17f70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
17f80 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
17f90 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61  he "temporary pa
17fa0 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20  ge" buffer held 
17fb0 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79  internally.** by
17fc0 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69   the pager.  Thi
17fd0 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68  s is a buffer th
17fe0 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68  at is big enough
17ff0 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20   to hold the.** 
18000 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f  entire content o
18010 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  f a database pag
18020 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20  e.  This buffer 
18030 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  is used internal
18040 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c  ly.** during rol
18050 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62  lback and will b
18060 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68  e overwritten wh
18070 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63  enever a rollbac
18080 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75  k.** occurs.  Bu
18090 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20  t other modules 
180a0 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20  are free to use 
180b0 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20  it too, as long 
180c0 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63  as.** no rollbac
180d0 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67  ks are happening
180e0 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
180f0 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
18100 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
18110 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
18120 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a  ->pTmpSpace;.}..
18130 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
18140 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   set the maximum
18150 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
18160 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69  ount if mxPage i
18170 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20  s positive. .** 
18180 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  Make no changes 
18190 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72  if mxPage is zer
181a0 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20  o or negative.  
181b0 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65  And never reduce
181c0 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20   the.** maximum 
181d0 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77  page count below
181e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
181f0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
18200 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c  e..**.** Regardl
18210 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  ess of mxPage, r
18220 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
18230 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  t maximum page c
18240 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
18250 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
18260 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  Count(Pager *pPa
18270 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
18280 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30  {.  if( mxPage>0
18290 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
182a0 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b  mxPgno = mxPage;
182b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61  .  }.  sqlite3Pa
182c0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
182d0 67 65 72 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  ger, 0);.  retur
182e0 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  n pPager->mxPgno
182f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
18300 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20  ollowing set of 
18310 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
18320 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
18330 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f   simulated.** I/
18340 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73  O error mechanis
18350 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e  m.  These routin
18360 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  es are used to a
18370 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a  void simulated.*
18380 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63  * errors in plac
18390 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  es where we do n
183a0 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72  ot care about er
183b0 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65  rors..**.** Unle
183c0 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54  ss -DSQLITE_TEST
183d0 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73  =1 is used, thes
183e0 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61  e routines are a
183f0 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64  ll no-ops.** and
18400 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64   generate no cod
18410 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
18420 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20  ITE_TEST.extern 
18430 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
18440 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78  rror_pending;.ex
18450 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
18460 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73  _io_error_hit;.s
18470 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f  tatic int saved_
18480 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c  cnt;.void disabl
18490 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
184a0 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
184b0 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74  aved_cnt = sqlit
184c0 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
184d0 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ing;.  sqlite3_i
184e0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
184f0 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61  = -1;.}.void ena
18500 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
18510 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
18520 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
18530 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65  r_pending = save
18540 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23  d_cnt;.}.#else.#
18550 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f   define disable_
18560 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
18570 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65  ors().# define e
18580 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
18590 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64  io_errors().#end
185a0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  if../*.** Read t
185b0 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73  he first N bytes
185c0 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e   from the beginn
185d0 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ing of the file 
185e0 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74  into memory.** t
185f0 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73  hat pDest points
18600 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74   to. .**.** If t
18610 68 65 20 70 61 67 65 72 20 77 61 73 20 6f 70 65  he pager was ope
18620 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65  ned on a transie
18630 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61  nt file (zFilena
18640 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f  me==""), or.** o
18650 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20  pened on a file 
18660 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65  less than N byte
18670 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f  s in size, the o
18680 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73 0a  utput buffer is.
18690 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51  ** zeroed and SQ
186a0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
186b0 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20  . The rationale 
186c0 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74  for this is that
186d0 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
186e0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  on is used to re
186f0 61 64 20 64 61 74 61 62 61 73 65 20 68 65 61 64  ad database head
18700 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 74  ers, and a new t
18710 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a  ransient or.** z
18720 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62 61  ero sized databa
18730 73 65 20 68 61 73 20 61 20 68 65 61 64 65 72 20  se has a header 
18740 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e  than consists en
18750 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73  tirely of zeroes
18760 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49  ..**.** If any I
18770 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20 66 72  O error apart fr
18780 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  om SQLITE_IOERR_
18790 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65 6e  SHORT_READ is en
187a0 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68  countered,.** th
187b0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
187c0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
187d0 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20 63  caller and the c
187e0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
187f0 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  * output buffer 
18800 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e  undefined..*/.in
18810 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
18820 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67  adFileheader(Pag
18830 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
18840 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  N, unsigned char
18850 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20   *pDest){.  int 
18860 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
18870 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20    memset(pDest, 
18880 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28  0, N);.  assert(
18890 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
188a0 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
188b0 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 69 66 28  empFile );.  if(
188c0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
188d0 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41  fd) ){.    IOTRA
188e0 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20  CE(("DBHDR %p 0 
188f0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e  %d\n", pPager, N
18900 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
18910 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
18920 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20  ->fd, pDest, N, 
18930 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
18940 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
18950 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
18960 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
18970 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
18980 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18990 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61   Return the tota
189a0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
189b0 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
189c0 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  e file associate
189d0 64 20 0a 2a 2a 20 77 69 74 68 20 70 50 61 67 65  d .** with pPage
189e0 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69  r. Normally, thi
189f0 73 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20  s is calculated 
18a00 61 73 20 28 3c 64 62 20 66 69 6c 65 20 73 69 7a  as (<db file siz
18a10 65 3e 2f 3c 70 61 67 65 2d 73 69 7a 65 3e 29 2e  e>/<page-size>).
18a20 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20  .** However, if 
18a30 74 68 65 20 66 69 6c 65 20 69 73 20 62 65 74 77  the file is betw
18a40 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d  een 1 and <page-
18a50 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73  size> bytes in s
18a60 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68  ize, then .** th
18a70 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  is is considered
18a80 20 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a   a 1 page file..
18a90 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
18aa0 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72 20 73  er is in error s
18ab0 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
18ac0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
18ad0 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 65  d, then the.** e
18ae0 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72  rror state error
18af0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
18b00 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 6c 65  d and *pnPage le
18b10 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 20 4f 72  ft unchanged. Or
18b20 2c 0a 2a 2a 20 69 66 20 74 68 65 20 66 69 6c 65  ,.** if the file
18b30 20 73 79 73 74 65 6d 20 68 61 73 20 74 6f 20 62   system has to b
18b40 65 20 71 75 65 72 69 65 64 20 66 6f 72 20 74 68  e queried for th
18b50 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
18b60 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 71 75  le and.** the qu
18b70 65 72 79 20 61 74 74 65 6d 70 74 20 72 65 74 75  ery attempt retu
18b80 72 6e 73 20 61 6e 20 49 4f 20 65 72 72 6f 72 2c  rns an IO error,
18b90 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
18ba0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  de is returned.*
18bb0 2a 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73  * and *pnPage is
18bc0 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
18bd0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
18be0 2c 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  , if everything 
18bf0 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  is successful, t
18c00 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  hen SQLITE_OK is
18c10 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64   returned.** and
18c20 20 2a 70 6e 50 61 67 65 20 69 73 20 73 65 74 20   *pnPage is set 
18c30 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
18c40 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
18c50 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  tabase..*/.int s
18c60 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
18c70 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
18c80 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29  er, int *pnPage)
18c90 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20  {.  Pgno nPage; 
18ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18cb0 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
18cc0 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a   via *pnPage */.
18cd0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
18ce0 65 72 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  er is already in
18cf0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
18d00 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  , return the err
18d10 6f 72 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 69 66  or code. */.  if
18d20 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
18d30 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
18d40 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
18d50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72  .  }..  /* Deter
18d60 6d 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mine the number 
18d70 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
18d80 66 69 6c 65 2e 20 53 74 6f 72 65 20 74 68 69 73  file. Store this
18d90 20 69 6e 20 6e 50 61 67 65 2e 20 2a 2f 0a 20 20   in nPage. */.  
18da0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
18db0 7a 65 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 6e  zeValid ){.    n
18dc0 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Page = pPager->d
18dd0 62 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  bSize;.  }else{.
18de0 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20      int rc;     
18df0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
18e00 72 72 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79  rror returned by
18e10 20 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f   OsFileSize() */
18e20 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20  .    i64 n = 0; 
18e30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18e40 46 69 6c 65 20 73 69 7a 65 20 69 6e 20 62 79 74  File size in byt
18e50 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  es returned by O
18e60 73 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 0a  sFileSize() */..
18e70 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
18e80 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
18e90 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
18ea0 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73  le );.    if( is
18eb0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
18ec0 20 26 26 20 28 30 20 21 3d 20 28 72 63 20 3d 20   && (0 != (rc = 
18ed0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
18ee0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
18ef0 29 29 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67  ))) ){.      pag
18f00 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
18f10 20 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75   rc);.      retu
18f20 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
18f30 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50   if( n>0 && n<pP
18f40 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
18f50 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
18f60 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
18f70 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e      nPage = (Pgn
18f80 6f 29 28 6e 20 2f 20 70 50 61 67 65 72 2d 3e 70  o)(n / pPager->p
18f90 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
18fa0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
18fb0 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
18fc0 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OCK ){.      pPa
18fd0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
18fe0 61 67 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65  age;.      pPage
18ff0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
19000 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 70 50 61  nPage;.      pPa
19010 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
19020 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
19030 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
19040 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70  rent number of p
19050 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ages in the file
19060 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
19070 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f 6e 66 69   the .  ** confi
19080 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61  gured maximum pa
19090 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72  ger number, incr
190a0 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64  ease the allowed
190b0 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74   limit so.  ** t
190c0 68 61 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e  hat the file can
190d0 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20   be read..  */. 
190e0 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65   if( nPage>pPage
190f0 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20  r->mxPgno ){.   
19100 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
19110 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20  = (Pgno)nPage;. 
19120 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
19130 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
19140 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
19150 54 45 5f 4f 4b 20 2a 2f 0a 20 20 69 66 28 20 70  TE_OK */.  if( p
19160 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 6e  nPage ){.    *pn
19170 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Page = nPage;.  
19180 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
19190 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
191a0 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  Try to obtain a 
191b0 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63  lock of type loc
191c0 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74  ktype on the dat
191d0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a  abase file. If.*
191e0 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67  * a similar or g
191f0 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61  reater lock is a
19200 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69  lready held, thi
19210 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
19220 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e  no-op.** (return
19230 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d  ing SQLITE_OK im
19240 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a  mediately)..**.*
19250 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74  * Otherwise, att
19260 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74  empt to obtain t
19270 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71  he lock using sq
19280 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49  lite3OsLock(). I
19290 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75  nvoke .** the bu
192a0 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
192b0 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65  he lock is curre
192c0 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62  ntly not availab
192d0 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75  le. Repeat .** u
192e0 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61  ntil the busy ca
192f0 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66  llback returns f
19300 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68  alse or until th
19310 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a  e attempt to .**
19320 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b   obtain the lock
19330 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a   succeeds..**.**
19340 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
19350 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  K on success and
19360 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
19370 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61  f we cannot obta
19380 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20  in.** the lock. 
19390 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f  If the lock is o
193a0 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73 66  btained successf
193b0 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61  ully, set the Pa
193c0 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61  ger.state .** va
193d0 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79  riable to lockty
193e0 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  pe before return
193f0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
19400 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  nt pager_wait_on
19410 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  _lock(Pager *pPa
19420 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  ger, int locktyp
19430 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  e){.  int rc;   
19440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
19460 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
19470 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76  /* The OS lock v
19480 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 74 68  alues must be th
19490 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 50 61  e same as the Pa
194a0 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20  ger lock values 
194b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  */.  assert( PAG
194c0 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45  ER_SHARED==SHARE
194d0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
194e0 72 74 28 20 50 41 47 45 52 5f 52 45 53 45 52 56  rt( PAGER_RESERV
194f0 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ED==RESERVED_LOC
19500 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  K );.  assert( P
19510 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d  AGER_EXCLUSIVE==
19520 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
19530 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66  ;..  /* If the f
19540 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ile is currently
19550 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74   unlocked then t
19560 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  he size must be 
19570 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73  unknown */.  ass
19580 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
19590 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
195a0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69   || pPager->dbSi
195b0 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 0a 20  zeValid==0 );.. 
195c0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
195d0 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20  his is either a 
195e0 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74  no-op (because t
195f0 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
19600 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61  k is .  ** alrea
19610 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65 20  dy held, or one 
19620 6f 66 20 74 68 65 20 74 72 61 6e 73 69 73 74 69  of the transisti
19630 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73  ons that the bus
19640 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d  y-handler.  ** m
19650 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75  ay be invoked du
19660 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20  ring, according 
19670 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  to the comment a
19680 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65  bove.  ** sqlite
19690 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
196a0 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61  dler()..  */.  a
196b0 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
196c0 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 29  state>=locktype)
196d0 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  .       || (pPag
196e0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
196f0 5f 55 4e 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74  _UNLOCK && lockt
19700 79 70 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ype==PAGER_SHARE
19710 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50  D).       || (pP
19720 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
19730 45 52 5f 52 45 53 45 52 56 45 44 20 26 26 20 6c  ER_RESERVED && l
19740 6f 63 6b 74 79 70 65 3d 3d 50 41 47 45 52 5f 45  ocktype==PAGER_E
19750 58 43 4c 55 53 49 56 45 29 0a 20 20 29 3b 0a 0a  XCLUSIVE).  );..
19760 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
19770 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ate>=locktype ){
19780 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
19790 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
197a0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20    do {.      rc 
197b0 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
197c0 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b  pPager->fd, lock
197d0 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c  type);.    }whil
197e0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
197f0 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42  SY && pPager->xB
19800 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65  usyHandler(pPage
19810 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
19820 72 67 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72  rg) );.    if( r
19830 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19840 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
19850 61 74 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79  ate = (u8)lockty
19860 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  pe;.      IOTRAC
19870 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e  E(("LOCK %p %d\n
19880 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74  ", pPager, lockt
19890 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a  ype)).    }.  }.
198a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
198b0 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
198c0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  he in-memory dat
198d0 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65  abase file image
198e0 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e   to nPage pages.
198f0 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
19900 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75  on does not actu
19910 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20  ally modify the 
19920 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
19930 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75   disk. It .** ju
19940 73 74 20 73 65 74 73 20 74 68 65 20 69 6e 74 65  st sets the inte
19950 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68  rnal state of th
19960 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73  e pager object s
19970 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74  o that the .** t
19980 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62  runcation will b
19990 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20  e done when the 
199a0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
199b0 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
199c0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
199d0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
199e0 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
199f0 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
19a00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19a10 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b  ->dbSizeValid );
19a20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
19a30 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65  r->dbSize>=nPage
19a40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
19a50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
19a60 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
19a70 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
19a80 3d 20 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  = nPage;.}../*.*
19a90 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
19aa0 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65  age cache.  Free
19ab0 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20   all memory and 
19ac0 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e  close all files.
19ad0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
19ae0 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70  saction was in p
19af0 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69  rogress when thi
19b00 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
19b10 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61  led, that.** tra
19b20 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
19b30 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75  ed back.  All ou
19b40 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
19b50 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a  are invalidated.
19b60 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d  ** and their mem
19b70 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41  ory is freed.  A
19b80 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
19b90 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61  e a page associa
19ba0 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73  ted.** with this
19bb0 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65   page cache afte
19bc0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
19bd0 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b  returns will lik
19be0 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  ely.** result in
19bf0 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a   a coredump..**.
19c00 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
19c10 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
19c20 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
19c30 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20  on is active an 
19c40 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61  attempt.** is ma
19c50 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  de to roll it ba
19c60 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ck. If an error 
19c70 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
19c80 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61  e rollback .** a
19c90 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79   hot journal may
19ca0 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
19cb0 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e  filesystem but n
19cc0 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  o error is retur
19cd0 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61  ned.** to the ca
19ce0 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ller..*/.int sql
19cf0 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50  ite3PagerClose(P
19d00 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
19d10 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
19d20 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
19d30 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
19d40 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
19d50 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
19d60 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  = 0;.  pPager->e
19d70 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30  xclusiveMode = 0
19d80 3b 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28  ;.  pager_reset(
19d90 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 4d  pPager);.  if( M
19da0 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65  EMDB ){.    page
19db0 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
19dc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
19dd0 2a 20 53 65 74 20 50 61 67 65 72 2e 6a 6f 75 72  * Set Pager.jour
19de0 6e 61 6c 48 64 72 20 74 6f 20 2d 31 20 66 6f 72  nalHdr to -1 for
19df0 20 74 68 65 20 62 65 6e 65 66 69 74 20 6f 66 20   the benefit of 
19e00 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61  the pager_playba
19e10 63 6b 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c  ck() .    ** cal
19e20 6c 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 6d  l which may be m
19e30 61 64 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  ade from within 
19e40 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
19e50 6c 6c 62 61 63 6b 28 29 2e 20 49 66 20 69 74 0a  llback(). If it.
19e60 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 2d 31      ** is not -1
19e70 2c 20 74 68 65 6e 20 74 68 65 20 75 6e 73 79 6e  , then the unsyn
19e80 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 61  ced portion of a
19e90 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66  n open journal f
19ea0 69 6c 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20 62  ile may.    ** b
19eb0 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e  e played back in
19ec0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
19ed0 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c   If a power fail
19ee0 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ure occurs while
19ef0 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20  .    ** this is 
19f00 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64  happening, the d
19f10 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 63 6f  atabase may beco
19f20 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20  me corrupt..    
19f30 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  */.    pPager->j
19f40 6f 75 72 6e 61 6c 48 64 72 20 3d 20 2d 31 3b 0a  ournalHdr = -1;.
19f50 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
19f60 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
19f70 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
19f80 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
19f90 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ();.  enable_sim
19fa0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
19fb0 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ();.  PAGERTRACE
19fc0 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20  (("CLOSE %d\n", 
19fd0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
19fe0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43  );.  IOTRACE(("C
19ff0 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67  LOSE %p\n", pPag
1a000 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73  er)).  sqlite3Os
1a010 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
1a020 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
1a030 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  Free(pPager->pTm
1a040 70 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69 74  pSpace);.  sqlit
1a050 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50  e3PcacheClose(pP
1a060 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1a070 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
1a080 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70  AS_CODEC.  if( p
1a090 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65  Pager->xCodecFre
1a0a0 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  e ) pPager->xCod
1a0b0 65 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  ecFree(pPager->p
1a0c0 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a  Codec);.#endif..
1a0d0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
1a0e0 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26  r->aSavepoint &&
1a0f0 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75   !pPager->pInJou
1a100 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
1a110 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
1a120 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65  ->jfd) && !isOpe
1a130 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
1a140 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  );..  sqlite3_fr
1a150 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ee(pPager);.  re
1a160 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a170 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
1a180 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  NDEBUG) || defin
1a190 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
1a1a0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1a1b0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
1a1c0 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67   page pPg..*/.Pg
1a1d0 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  no sqlite3PagerP
1a1e0 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65  agenumber(DbPage
1a1f0 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
1a200 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65   pPg->pgno;.}.#e
1a210 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  ndif../*.** Incr
1a220 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
1a230 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61  nce count for pa
1a240 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20  ge pPg..*/.void 
1a250 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
1a260 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
1a270 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
1a280 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (pPg);.}../*.** 
1a290 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
1a2a0 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
1a2b0 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  , make sure all 
1a2c0 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68  the pages that h
1a2d0 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74  ave.** been writ
1a2e0 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
1a2f0 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79  al have actually
1a300 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72   reached the sur
1a310 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  face of the.** d
1a320 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72  isk and can be r
1a330 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65  estored in the e
1a340 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f  vent of a hot-jo
1a350 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a  urnal rollback..
1a360 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67  **.** If the Pag
1a370 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
1a380 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74 68 65   is not set, the
1a390 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1a3a0 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f  is a.** no-op. O
1a3b0 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63  therwise, the ac
1a3c0 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64  tions required d
1a3d0 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75  epend on the jou
1a3e0 72 6e 61 6c 2d 6d 6f 64 65 0a 2a 2a 20 61 6e 64  rnal-mode.** and
1a3f0 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72   the device char
1a400 61 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74  acteristics of t
1a410 68 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  he the file-syst
1a420 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  em, as follows:.
1a430 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  **.**   * If the
1a440 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
1a450 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
1a460 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61  urnal file, no a
1a470 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20  ction need.**   
1a480 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a    be taken..**.*
1a490 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c  *   * Otherwise,
1a4a0 20 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64   if the device d
1a4b0 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
1a4c0 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20  the SAFE_APPEND 
1a4d0 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20  property,.**    
1a4e0 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
1a4f0 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74  ield of the most
1a500 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65   recently writte
1a510 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  n journal header
1a520 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74  .**     is updat
1a530 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ed to contain th
1a540 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72  e number of jour
1a550 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74  nal records that
1a560 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65   have.**     bee
1a570 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77  n written follow
1a580 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70  ing it. If the p
1a590 61 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e  ager is operatin
1a5a0 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a  g in full-sync.*
1a5b0 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e  *     mode, then
1a5c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1a5d0 65 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f  e is synced befo
1a5e0 72 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73  re this field is
1a5f0 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
1a600 20 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63    * If the devic
1a610 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  e does not suppo
1a620 72 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41  rt the SEQUENTIA
1a630 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e  L property, then
1a640 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c   .**     journal
1a650 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e   file is synced.
1a660 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73  .**.** Or, in ps
1a670 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a  eudo-code:.**.**
1a680 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d     if( NOT <in-m
1a690 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29  emory journal> )
1a6a0 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54  {.**     if( NOT
1a6b0 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a   SAFE_APPEND ){.
1a6c0 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75  **       if( <fu
1a6d0 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20  ll-sync mode> ) 
1a6e0 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66  xSync(<journal f
1a6f0 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20  ile>);.**       
1a700 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65  <update nRec fie
1a710 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a  ld>.**     } .**
1a720 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51       if( NOT SEQ
1a730 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28  UENTIAL ) xSync(
1a740 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b  <journal file>);
1a750 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68  .**   }.**.** Th
1a760 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
1a770 20 66 6c 61 67 20 69 73 20 6e 65 76 65 72 20 62   flag is never b
1a780 65 20 73 65 74 20 66 6f 72 20 74 65 6d 70 6f 72  e set for tempor
1a790 61 72 79 20 66 69 6c 65 73 2c 20 6f 72 20 61 6e  ary files, or an
1a7a0 79 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 72 61 74  y.** file operat
1a7b0 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  ing in no-sync m
1a7c0 6f 64 65 20 28 50 61 67 65 72 2e 6e 6f 53 79 6e  ode (Pager.noSyn
1a7d0 63 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72  c set to non-zer
1a7e0 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  o)..**.** If suc
1a7f0 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f  cessful, this ro
1a800 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
1a810 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
1a820 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a   flag of every .
1a830 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c  ** page currentl
1a840 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79  y held in memory
1a850 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1a860 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  g SQLITE_OK. If 
1a870 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69  an IO.** error i
1a880 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
1a890 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
1a8a0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1a8b0 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
1a8c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1a8d0 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
1a8e0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
1a8f0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
1a900 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  c ){.    assert(
1a910 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
1a920 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  le );.    if( pP
1a930 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
1a940 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
1a950 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
1a960 20 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20       int rc;    
1a970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1a990 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20  urn code */.    
1a9a0 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20    const int iDc 
1a9b0 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
1a9c0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1a9d0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
1a9e0 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
1a9f0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
1aa00 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d  );..      if( 0=
1aa10 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
1aa20 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
1aa30 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1aa40 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77  is block deals w
1aa50 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70  ith an obscure p
1aa60 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c  roblem. If the l
1aa70 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20  ast connection. 
1aa80 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
1aa90 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61 74  rote to this dat
1aaa0 61 62 61 73 65 20 77 61 73 20 6f 70 65 72 61 74  abase was operat
1aab0 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e  ing in persisten
1aac0 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  t-journal.      
1aad0 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20    ** mode, then 
1aae0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1aaf0 20 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f 69   may at this poi
1ab00 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c  nt actually be l
1ab10 61 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  arger.        **
1ab20 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72   than Pager.jour
1ab30 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66  nalOff bytes. If
1ab40 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20   the next thing 
1ab50 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  in the journal. 
1ab60 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68         ** file h
1ab70 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a  appens to be a j
1ab80 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77  ournal-header (w
1ab90 72 69 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f  ritten as part o
1aba0 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
1abb0 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63   previous connec
1abc0 74 69 6f 6e 73 20 74 72 61 6e 73 61 63 74 69 6f  tions transactio
1abd0 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20  n), and a crash 
1abe0 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  or power-failure
1abf0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63   .        ** occ
1ac00 75 72 73 20 61 66 74 65 72 20 6e 52 65 63 20 69  urs after nRec i
1ac10 73 20 75 70 64 61 74 65 64 20 62 75 74 20 62 65  s updated but be
1ac20 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63  fore this connec
1ac30 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20  tion writes .   
1ac40 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67       ** anything
1ac50 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75   else to the jou
1ac60 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f  rnal file (or co
1ac70 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b  mmits/rolls back
1ac80 20 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a   its .        **
1ac90 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74   transaction), t
1aca0 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62  hen SQLite may b
1acb0 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77  ecome confused w
1acc0 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20  hen doing the . 
1acd0 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f         ** hot-jo
1ace0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66  urnal rollback f
1acf0 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72  ollowing recover
1ad00 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62  y. It may roll b
1ad10 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20  ack all.        
1ad20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65  ** of this conne
1ad30 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65  ctions data, the
1ad40 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c  n proceed to rol
1ad50 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c  ling back the ol
1ad60 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  d,.        ** ou
1ad70 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74  t-of-date data t
1ad80 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20  hat follows it. 
1ad90 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
1ada0 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ion..        **.
1adb0 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f          ** To wo
1adc0 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20  rk around this, 
1add0 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  if the journal f
1ade0 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72 20  ile does appear 
1adf0 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20  to contain.     
1ae00 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65     ** a valid he
1ae10 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50  ader following P
1ae20 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ager.journalOff,
1ae30 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 30 78   then write a 0x
1ae40 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79  00.        ** by
1ae50 74 65 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  te to the start 
1ae60 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74  of it to prevent
1ae70 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72   it from being r
1ae80 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20  ecognized..     
1ae90 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
1aea0 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48   Variable iNextH
1aeb0 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
1aec0 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61 74  to the offset at
1aed0 20 77 68 69 63 68 20 74 68 69 73 0a 20 20 20 20   which this.    
1aee0 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74      ** problemat
1aef0 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f  ic header will o
1af00 63 63 75 72 2c 20 69 66 20 69 74 20 65 78 69 73  ccur, if it exis
1af10 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73  ts. aMagic is us
1af20 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ed .        ** a
1af30 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75  s a temporary bu
1af40 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20  ffer to inspect 
1af50 74 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65  the first couple
1af60 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20   of bytes of.   
1af70 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65       ** the pote
1af80 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65  ntial journal he
1af90 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ader..        */
1afa0 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65  .        i64 iNe
1afb0 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  xtHdrOffset;.   
1afc0 20 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38       u8 aMagic[8
1afd0 5d 3b 0a 09 75 38 20 7a 48 65 61 64 65 72 5b 73  ];..u8 zHeader[s
1afe0 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
1aff0 67 69 63 29 2b 34 5d 3b 0a 0a 09 6d 65 6d 63 70  gic)+4];...memcp
1b000 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72  y(zHeader, aJour
1b010 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
1b020 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
1b030 3b 0a 09 70 75 74 33 32 62 69 74 73 28 26 7a 48  ;..put32bits(&zH
1b040 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
1b050 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50  urnalMagic)], pP
1b060 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20  ager->nRec);..  
1b070 20 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66        iNextHdrOf
1b080 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  fset = journalHd
1b090 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
1b0a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1b0b0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
1b0c0 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
1b0d0 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73   8, iNextHdrOffs
1b0e0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  et);.        if(
1b0f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1b100 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67  & 0==memcmp(aMag
1b110 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
1b120 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20  c, 8) ){.       
1b130 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1b140 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b  u8 zerobyte = 0;
1b150 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1b160 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1b170 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72  Pager->jfd, &zer
1b180 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48  obyte, 1, iNextH
1b190 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  drOffset);.     
1b1a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1b1b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
1b1c0 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
1b1d0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
1b1e0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1b1f0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
1b200 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  .        /* Writ
1b210 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
1b220 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
1b230 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49  l file header. I
1b240 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f in.        ** 
1b250 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73  full-synchronous
1b260 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
1b270 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54  journal first. T
1b280 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
1b290 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20  .        ** all 
1b2a0 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20  data has really 
1b2b0 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66  hit the disk bef
1b2c0 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61  ore nRec is upda
1b2d0 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20  ted to mark.    
1b2e0 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63      ** it as a c
1b2f0 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c  andidate for rol
1b300 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a  lback..        *
1b310 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
1b320 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
1b330 64 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74  d if the persist
1b340 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72  ent media suppor
1b350 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ts the.        *
1b360 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72  * SAFE_APPEND pr
1b370 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20  operty. Because 
1b380 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  in this case it 
1b390 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
1b3a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  .        ** for 
1b3b0 67 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20  garbage data to 
1b3c0 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  be appended to t
1b3d0 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65  he file, the nRe
1b3e0 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20  c field.        
1b3f0 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  ** is populated 
1b400 77 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20  with 0xFFFFFFFF 
1b410 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
1b420 20 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74   header is writt
1b430 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  en.        ** an
1b440 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f  d never needs to
1b450 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20   be updated..   
1b460 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1b470 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
1b480 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26  Sync && 0==(iDc&
1b490 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
1b4a0 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20  UENTIAL) ){.    
1b4b0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1b4c0 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  (("SYNC journal 
1b4d0 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
1b4e0 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
1b4f0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
1b500 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
1b510 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20  ager)).         
1b520 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
1b530 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
1b540 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
1b550 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ags);.          
1b560 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b570 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1b580 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b590 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
1b5a0 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67  %p %lld\n", pPag
1b5b0 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er, pPager->jour
1b5c0 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20 20 20  nalHdr));.      
1b5d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1b5e0 57 72 69 74 65 28 0a 20 20 20 20 20 20 20 20 20  Write(.         
1b5f0 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20     pPager->jfd, 
1b600 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28  zHeader, sizeof(
1b610 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67 65 72  zHeader), pPager
1b620 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 09 29 3b  ->journalHdr..);
1b630 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1b640 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1b650 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1b660 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
1b670 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
1b680 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
1b690 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1b6a0 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  (("SYNC journal 
1b6b0 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
1b6c0 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
1b6d0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
1b6e0 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
1b6f0 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20  er)).        rc 
1b700 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
1b710 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
1b720 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 7c  ger->sync_flags|
1b730 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61   .          (pPa
1b740 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 3d  ger->sync_flags=
1b750 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
1b760 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  L?SQLITE_SYNC_DA
1b770 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20  TAONLY:0).      
1b780 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
1b790 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b7a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b7b0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1b7c0 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
1b7d0 6c 65 20 77 61 73 20 6a 75 73 74 20 73 75 63 63  le was just succ
1b7e0 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e  essfully synced.
1b7f0 20 53 65 74 20 50 61 67 65 72 2e 6e 65 65 64 53   Set Pager.needS
1b800 79 6e 63 20 0a 20 20 20 20 2a 2a 20 74 6f 20 7a  ync .    ** to z
1b810 65 72 6f 20 61 6e 64 20 63 6c 65 61 72 20 74 68  ero and clear th
1b820 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
1b830 43 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20 70 61  C flag on all pa
1b840 67 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  gess..    */.   
1b850 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
1b860 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  c = 0;.    pPage
1b870 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
1b880 64 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74  d = 1;.    sqlit
1b890 65 33 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e  e3PcacheClearSyn
1b8a0 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70  cFlags(pPager->p
1b8b0 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20  PCache);.  }..  
1b8c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b8d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  ;.}../*.** The a
1b8e0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66  rgument is the f
1b8f0 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64  irst in a linked
1b900 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70   list of dirty p
1b910 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a  ages connected.*
1b920 2a 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70  * by the PgHdr.p
1b930 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54  Dirty pointer. T
1b940 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  his function wri
1b950 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20  tes each one of 
1b960 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  the.** in-memory
1b970 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69   pages in the li
1b980 73 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  st to the databa
1b990 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67  se file. The arg
1b9a0 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20  ument may.** be 
1b9b0 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69  NULL, representi
1b9c0 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74  ng an empty list
1b9d0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
1b9e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
1b9f0 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  ** a no-op..**.*
1ba00 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74  * The pager must
1ba10 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61   hold at least a
1ba20 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77   RESERVED lock w
1ba30 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1ba40 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20  n.** is called. 
1ba50 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61  Before writing a
1ba60 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64  nything to the d
1ba70 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
1ba80 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70  is lock.** is up
1ba90 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43  graded to an EXC
1baa0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
1bab0 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20  the lock cannot 
1bac0 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20  be obtained,.** 
1bad0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
1bae0 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64  eturned and no d
1baf0 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
1bb00 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1bb10 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  ile..** .** If t
1bb20 68 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65  he pager is a te
1bb30 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e  mp-file pager an
1bb40 64 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c  d the actual fil
1bb50 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a  e-system file.**
1bb60 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e   is not yet open
1bb70 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20  , it is created 
1bb80 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72  and opened befor
1bb90 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a  e any data is .*
1bba0 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a  * written out..*
1bbb0 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f  *.** Once the lo
1bbc0 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72  ck has been upgr
1bbd0 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63  aded and, if nec
1bbe0 65 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65  essary, the file
1bbf0 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20   opened,.** the 
1bc00 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65  pages are writte
1bc10 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  n out to the dat
1bc20 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69  abase file in li
1bc30 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e  st order. Writin
1bc40 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73  g.** a page is s
1bc50 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65  kipped if it mee
1bc60 74 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  ts either of the
1bc70 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65   following crite
1bc80 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ria:.**.**   * T
1bc90 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
1bca0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50  s greater than P
1bcb0 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a  ager.dbSize, or.
1bcc0 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52  **   * The PGHDR
1bcd0 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67  _DONT_WRITE flag
1bce0 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70   is set on the p
1bcf0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72  age..**.** If wr
1bd00 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65  iting out a page
1bd10 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61   causes the data
1bd20 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f  base file to gro
1bd30 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53  w, Pager.dbFileS
1bd40 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65  ize.** is update
1bd50 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49  d accordingly. I
1bd60 66 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74  f page 1 is writ
1bd70 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68  ten out, then th
1bd80 65 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a  e value cached.*
1bd90 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c  * in Pager.dbFil
1bda0 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74  eVers[] is updat
1bdb0 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ed to match the 
1bdc0 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64  new value stored
1bdd0 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   in.** the datab
1bde0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
1bdf0 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  If everything is
1be00 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
1be10 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1be20 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
1be30 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61  or .** occurs, a
1be40 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
1be50 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c  is returned. Or,
1be60 20 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56   if the EXCLUSIV
1be70 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a  E lock cannot.**
1be80 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51   be obtained, SQ
1be90 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
1bea0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1beb0 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
1bec0 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20  _pagelist(PgHdr 
1bed0 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72  *pList){.  Pager
1bee0 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20   *pPager;       
1bef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf00 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
1bf10 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
1bf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1bf40 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69  urn code */..  i
1bf50 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1bf60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1bf70 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74    pPager = pList
1bf80 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
1bf90 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
1bfa0 65 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65  ere may be eithe
1bfb0 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
1bfc0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
1bfd0 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
1bfe0 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
1bff0 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
1c000 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
1c010 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
1c020 20 2a 2a 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f   ** call is a no
1c030 2d 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  -op..  **.  ** M
1c040 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66  oving the lock f
1c050 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f 20  rom RESERVED to 
1c060 45 58 43 4c 55 53 49 56 45 20 61 63 74 75 61 6c  EXCLUSIVE actual
1c070 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e  ly involves goin
1c080 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61  g.  ** through a
1c090 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  n intermediate s
1c0a0 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20 20  tate PENDING.   
1c0b0 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70  A PENDING lock p
1c0c0 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a  revents new.  **
1c0d0 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61 74   readers from at
1c0e0 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20 64  taching to the d
1c0f0 61 74 61 62 61 73 65 20 62 75 74 20 69 73 20 75  atabase but is u
1c100 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20  nsufficient for 
1c110 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65  us to.  ** write
1c120 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66 20 61  .  The idea of a
1c130 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
1c140 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77 20   to prevent new 
1c150 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a  readers from.  *
1c160 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c  * coming in whil
1c170 65 20 77 65 20 77 61 69 74 20 66 6f 72 20 65 78  e we wait for ex
1c180 69 73 74 69 6e 67 20 72 65 61 64 65 72 73 20 74  isting readers t
1c190 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20  o clear..  **.  
1c1a0 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61 67  ** While the pag
1c1b0 65 72 20 69 73 20 69 6e 20 74 68 65 20 52 45 53  er is in the RES
1c1c0 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65  ERVED state, the
1c1d0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
1c1e0 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20  se file.  ** is 
1c1f0 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77 65  unchanged and we
1c200 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69   can rollback wi
1c210 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
1c220 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20 2a  playback the.  *
1c230 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74  * journal into t
1c240 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
1c250 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65  base file.  Once
1c260 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74   we transition t
1c270 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45  o.  ** EXCLUSIVE
1c280 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 64  , it means the d
1c290 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
1c2a0 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61 6e   been changed an
1c2b0 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20  d any rollback. 
1c2c0 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72 65   ** will require
1c2d0 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62   a journal playb
1c2e0 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ack..  */.  asse
1c2f0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1c300 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
1c310 44 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65  D );.  rc = page
1c320 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
1c330 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
1c340 5f 4c 4f 43 4b 29 3b 0a 0a 20 20 2f 2a 20 49 66  _LOCK);..  /* If
1c350 20 74 68 65 20 66 69 6c 65 20 69 73 20 61 20 74   the file is a t
1c360 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74  emp-file has not
1c370 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
1c380 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49  , open it now. I
1c390 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f  t.  ** is not po
1c3a0 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f  ssible for rc to
1c3b0 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53   be other than S
1c3c0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73  QLITE_OK if this
1c3d0 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20   branch.  ** is 
1c3e0 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f  taken, as pager_
1c3f0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69  wait_on_lock() i
1c400 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65  s a no-op for te
1c410 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20  mp-files..  */. 
1c420 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
1c430 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
1c440 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1c450 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d  tempFile && rc==
1c460 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
1c470 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74   rc = pagerOpent
1c480 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67  emp(pPager, pPag
1c490 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
1c4a0 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a  vfsFlags);.  }..
1c4b0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
1c4c0 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20  ITE_OK && pList 
1c4d0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
1c4e0 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a   = pList->pgno;.
1c4f0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1c500 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73   are dirty pages
1c510 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
1c520 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  he with page num
1c530 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20  bers greater.   
1c540 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64   ** than Pager.d
1c550 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e  bSize, this mean
1c560 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  s sqlite3PagerTr
1c570 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77 61  uncateImage() wa
1c580 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20  s called to.    
1c590 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65  ** make the file
1c5a0 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d   smaller (presum
1c5b0 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63  ably by auto-vac
1c5c0 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f  uum code). Do no
1c5d0 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61  t write.    ** a
1c5e0 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f  ny such pages to
1c5f0 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
1c600 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64  *.    ** Also, d
1c610 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20  o not write out 
1c620 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 68 61  any page that ha
1c630 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54  s the PGHDR_DONT
1c640 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20  _WRITE flag.    
1c650 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79 20 73  ** set (set by s
1c660 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
1c670 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a  rite())..    */.
1c680 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50      if( pgno<=pP
1c690 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20  ager->dbSize && 
1c6a0 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73  0==(pList->flags
1c6b0 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54  &PGHDR_DONT_WRIT
1c6c0 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  E) ){.      i64 
1c6d0 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  offset = (pgno-1
1c6e0 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
1c6f0 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66  ageSize;   /* Of
1c700 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f  fset to write */
1c710 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
1c720 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
1c730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c740 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f        /* Data to
1c750 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20   write */    .. 
1c760 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74       /* Encode t
1c770 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
1c780 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
1c790 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61  er, pList->pData
1c7a0 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72  , pgno, 6, retur
1c7b0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  n SQLITE_NOMEM, 
1c7c0 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f  pData);..      /
1c7d0 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68 65 20  * Write out the 
1c7e0 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20  page data. */.  
1c7f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c800 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
1c810 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65  fd, pData, pPage
1c820 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
1c830 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  set);..      /* 
1c840 49 66 20 70 61 67 65 20 31 20 77 61 73 20 6a 75  If page 1 was ju
1c850 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61  st written, upda
1c860 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  te Pager.dbFileV
1c870 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20  ers to match.   
1c880 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
1c890 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68  now stored in th
1c8a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1c8b0 20 49 66 20 77 72 69 74 69 6e 67 20 74 68 69 73   If writing this
1c8c0 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20   .      ** page 
1c8d0 63 61 75 73 65 64 20 74 68 65 20 64 61 74 61 62  caused the datab
1c8e0 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77  ase file to grow
1c8f0 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c 65 53  , update dbFileS
1c900 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  ize. .      */. 
1c910 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31       if( pgno==1
1c920 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
1c930 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
1c940 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32  leVers, &pData[2
1c950 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  4], sizeof(pPage
1c960 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
1c970 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1c980 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
1c990 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
1c9a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
1c9b0 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b  FileSize = pgno;
1c9c0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1c9d0 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62 61  /* Update any ba
1c9e0 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70  ckup objects cop
1c9f0 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
1ca00 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e  s of this pager.
1ca10 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1ca20 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
1ca30 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
1ca40 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d  gno, (u8*)pList-
1ca50 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20  >pData);..      
1ca60 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4f  PAGERTRACE(("STO
1ca70 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61  RE %d page %d ha
1ca80 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
1ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1caa0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1cab0 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67   pgno, pager_pag
1cac0 65 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a  ehash(pList)));.
1cad0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1cae0 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20  PGOUT %p %d\n", 
1caf0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
1cb00 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
1cb10 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
1cb20 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  ritedb_count);. 
1cb30 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
1cb40 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b  pPager->nWrite);
1cb50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1cb60 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e    PAGERTRACE(("N
1cb70 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  OSTORE %d page %
1cb80 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1cb90 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20  ager), pgno));. 
1cba0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
1cbb0 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
1cbc0 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61     pList->pageHa
1cbd0 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
1cbe0 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64  ash(pList);.#end
1cbf0 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  if.    pList = p
1cc00 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
1cc10 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1cc20 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
1cc30 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20  a record of the 
1cc40 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
1cc50 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65   page pPg to the
1cc60 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a   sub-journal. .*
1cc70 2a 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c  * It is the call
1cc80 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  ers responsibili
1cc90 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52 65  ty to use subjRe
1cca0 71 75 69 72 65 73 50 61 67 65 28 29 20 74 6f 20  quiresPage() to 
1ccb0 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69  check .** that i
1ccc0 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71 75  t is really requ
1ccd0 69 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c  ired before call
1cce0 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
1ccf0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  n..**.** If succ
1cd00 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20  essful, set the 
1cd10 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
1cd20 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69  g to pPg->pgno i
1cd30 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a  n the bitvecs.**
1cd40 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61   for all open sa
1cd50 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20  vepoints before 
1cd60 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
1cd70 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
1cd80 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
1cd90 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
1cda0 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e  s successful, an
1cdb0 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   IO.** error cod
1cdc0 65 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74  e if the attempt
1cdd0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
1cde0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69   sub-journal fai
1cdf0 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54  ls, or .** SQLIT
1ce00 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
1ce10 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20  loc fails while 
1ce20 73 65 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e  setting a bit in
1ce30 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20   a savepoint.** 
1ce40 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69  bitvec..*/.stati
1ce50 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  c int subjournal
1ce60 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
1ce70 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1ce80 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
1ce90 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1cea0 50 61 67 65 72 3b 0a 20 20 69 66 28 20 69 73 4f  Pager;.  if( isO
1ceb0 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
1cec0 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70  ) ){.    void *p
1ced0 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
1cee0 61 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  a;.    i64 offse
1cef0 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75 62  t = pPager->nSub
1cf00 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  Rec*(4+pPager->p
1cf10 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 63 68  ageSize);.    ch
1cf20 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20  ar *pData2;..   
1cf30 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
1cf40 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
1cf50 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 7, return SQLI
1cf60 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32  TE_NOMEM, pData2
1cf70 29 3b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  );.    PAGERTRAC
1cf80 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E(("STMT-JOURNAL
1cf90 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
1cfa0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1cfb0 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
1cfc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67  .    assert( pag
1cfd0 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20  eInJournal(pPg) 
1cfe0 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  || pPg->pgno>pPa
1cff0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
1d000 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74  );.    rc = writ
1d010 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
1d020 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50  sjfd, offset, pP
1d030 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  g->pgno);.    if
1d040 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d050 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1d060 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
1d070 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61  ger->sjfd, pData
1d080 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
1d090 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a  ize, offset+4);.
1d0a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1d0b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d0c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75  .    pPager->nSu
1d0d0 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65  bRec++;.    asse
1d0e0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  rt( pPager->nSav
1d0f0 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20  epoint>0 );.    
1d100 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  rc = addToSavepo
1d110 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
1d120 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
1d130 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1d140 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1d150 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1d160 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
1d170 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1d180 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20 6c   by the pcache l
1d190 61 79 65 72 20 77 68 65 6e 20 69 74 20 68 61 73  ayer when it has
1d1a0 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a   reached some.**
1d1b0 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d   soft memory lim
1d1c0 69 74 2e 20 54 68 65 20 66 69 72 73 74 20 61 72  it. The first ar
1d1d0 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
1d1e0 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f  ter to a Pager o
1d1f0 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61  bject.** (cast a
1d200 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20  s a void*). The 
1d210 70 61 67 65 72 20 69 73 20 61 6c 77 61 79 73 20  pager is always 
1d220 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74  'purgeable' (not
1d230 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a   an in-memory.**
1d240 20 64 61 74 61 62 61 73 65 29 2e 20 54 68 65 20   database). The 
1d250 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
1d260 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
1d270 6f 20 61 20 70 61 67 65 20 74 68 61 74 20 69 73  o a page that is
1d280 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64   .** currently d
1d290 69 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20  irty but has no 
1d2a0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
1d2b0 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65  rences. The page
1d2c0 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73  .** is always as
1d2d0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1d2e0 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70  e Pager object p
1d2f0 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
1d300 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  st .** argument.
1d310 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f  .**.** The job o
1d320 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
1d330 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63  is to make pPg c
1d340 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20  lean by writing 
1d350 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  its contents.** 
1d360 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
1d370 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73  ase file, if pos
1d380 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20  sible. This may 
1d390 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20  involve syncing 
1d3a0 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
1d3b0 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ile. .**.** If s
1d3c0 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74  uccessful, sqlit
1d3d0 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
1d3e0 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  n() is called on
1d3f0 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a   the page and.**
1d400 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
1d410 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
1d420 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
1d430 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20   trying to make 
1d440 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61  the.** page clea
1d450 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  n, the IO error 
1d460 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1d470 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 63 61  . If the page ca
1d480 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20  nnot be.** made 
1d490 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f  clean for some o
1d4a0 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74  ther reason, but
1d4b0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
1d4c0 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
1d4d0 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
1d4e0 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  by sqlite3Pcache
1d4f0 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e  MakeClean() is n
1d500 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  ot called..*/.st
1d510 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74  atic int pagerSt
1d520 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67  ress(void *p, Pg
1d530 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
1d540 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61  er *pPager = (Pa
1d550 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72  ger *)p;.  int r
1d560 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1d570 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
1d580 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
1d590 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
1d5a0 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
1d5b0 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64  Y );..  /* The d
1d5c0 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 69 73  oNotSync flag is
1d5d0 20 73 65 74 20 62 79 20 74 68 65 20 73 71 6c 69   set by the sqli
1d5e0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
1d5f0 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 69  function while i
1d600 74 0a 20 20 2a 2a 20 69 73 20 6a 6f 75 72 6e 61  t.  ** is journa
1d610 6c 6c 69 6e 67 20 61 20 73 65 74 20 6f 66 20 74  lling a set of t
1d620 77 6f 20 6f 72 20 6d 6f 72 65 20 64 61 74 61 62  wo or more datab
1d630 61 73 65 20 70 61 67 65 73 20 74 68 61 74 20 61  ase pages that a
1d640 72 65 20 73 74 6f 72 65 64 0a 20 20 2a 2a 20 6f  re stored.  ** o
1d650 6e 20 74 68 65 20 73 61 6d 65 20 64 69 73 6b 20  n the same disk 
1d660 73 65 63 74 6f 72 2e 20 53 79 6e 63 69 6e 67 20  sector. Syncing 
1d670 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
1d680 6f 74 20 61 6c 6c 6f 77 65 64 20 77 68 69 6c 65  ot allowed while
1d690 0a 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61  .  ** this is ha
1d6a0 70 70 65 6e 69 6e 67 20 61 73 20 69 74 20 69 73  ppening as it is
1d6b0 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
1d6c0 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20 73  all members of s
1d6d0 75 63 68 20 61 0a 20 20 2a 2a 20 73 65 74 20 6f  uch a.  ** set o
1d6e0 66 20 70 61 67 65 73 20 61 72 65 20 73 79 6e 63  f pages are sync
1d6f0 65 64 20 74 6f 20 64 69 73 6b 20 74 6f 67 65 74  ed to disk toget
1d700 68 65 72 2e 20 53 6f 2c 20 69 66 20 74 68 65 20  her. So, if the 
1d710 70 61 67 65 20 74 68 69 73 20 66 75 6e 63 74 69  page this functi
1d720 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 72 79 69 6e  on.  ** is tryin
1d730 67 20 74 6f 20 6d 61 6b 65 20 63 6c 65 61 6e 20  g to make clean 
1d740 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a  will require a j
1d750 6f 75 72 6e 61 6c 20 73 79 6e 63 20 61 6e 64 20  ournal sync and 
1d760 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 0a 20 20  the doNotSync.  
1d770 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  ** flag is set, 
1d780 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
1d790 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 54  oing anything. T
1d7a0 68 65 20 70 63 61 63 68 65 20 6c 61 79 65 72 20  he pcache layer 
1d7b0 77 69 6c 6c 0a 20 20 2a 2a 20 6a 75 73 74 20 68  will.  ** just h
1d7c0 61 76 65 20 74 6f 20 67 6f 20 61 68 65 61 64 20  ave to go ahead 
1d7d0 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e  and allocate a n
1d7e0 65 77 20 70 61 67 65 20 62 75 66 66 65 72 20 69  ew page buffer i
1d7f0 6e 73 74 65 61 64 20 6f 66 0a 20 20 2a 2a 20 72  nstead of.  ** r
1d800 65 75 73 69 6e 67 20 70 50 67 2e 0a 20 20 2a 2a  eusing pPg..  **
1d810 0a 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c  .  ** Similarly,
1d820 20 69 66 20 74 68 65 20 70 61 67 65 72 20 68 61   if the pager ha
1d830 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  s already entere
1d840 64 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  d the error stat
1d850 65 2c 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 74  e, do not.  ** t
1d860 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ry to write the 
1d870 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 67 20  contents of pPg 
1d880 74 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  to disk..  */.  
1d890 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
1d8a0 6f 64 65 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  ode || (pPager->
1d8b0 64 6f 4e 6f 74 53 79 6e 63 20 26 26 20 70 50 67  doNotSync && pPg
1d8c0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
1d8d0 45 44 5f 53 59 4e 43 29 20 29 7b 0a 20 20 20 20  ED_SYNC) ){.    
1d8e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d8f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 79 6e 63  ;.  }..  /* Sync
1d900 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1d910 65 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a  e if required. *
1d920 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61  /.  if( pPg->fla
1d930 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
1d940 4e 43 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  NC ){.    rc = s
1d950 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
1d960 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
1d970 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
1d980 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26  ger->fullSync &&
1d990 20 0a 20 20 20 20 20 20 21 28 70 50 61 67 65 72   .      !(pPager
1d9a0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
1d9b0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
1d9c0 5f 4d 45 4d 4f 52 59 29 20 26 26 0a 20 20 20 20  _MEMORY) &&.    
1d9d0 20 20 21 28 73 71 6c 69 74 65 33 4f 73 44 65 76    !(sqlite3OsDev
1d9e0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1d9f0 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53  cs(pPager->fd)&S
1da00 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
1da10 5f 41 50 50 45 4e 44 29 0a 20 20 20 20 29 7b 0a  _APPEND).    ){.
1da20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
1da30 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  ec = 0;.      rc
1da40 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
1da50 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
1da60 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
1da70 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
1da80 66 20 74 68 69 73 20 70 61 67 65 20 69 73 20 6c  f this page is l
1da90 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 63  arger than the c
1daa0 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20  urrent size of. 
1dab0 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
1dac0 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79 20 6e   image, it may n
1dad0 65 65 64 20 74 6f 20 62 65 20 77 72 69 74 74 65  eed to be writte
1dae0 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  n to the sub-jou
1daf0 72 6e 61 6c 2e 0a 20 20 2a 2a 20 54 68 69 73 20  rnal..  ** This 
1db00 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63  is because the c
1db10 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77 72 69  all to pager_wri
1db20 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20 62 65  te_pagelist() be
1db30 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a  low will not.  *
1db40 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 65  * actually write
1db50 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c   data to the fil
1db60 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
1db70 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 73 69 64    **.  ** Consid
1db80 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  er the following
1db90 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76 65   sequence of eve
1dba0 6e 74 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  nts:.  **.  **  
1dbb0 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20 20 20   BEGIN;.  **    
1dbc0 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58   <journal page X
1dbd0 3e 0a 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69  >.  **     <modi
1dbe0 66 79 20 70 61 67 65 20 58 3e 0a 20 20 2a 2a 20  fy page X>.  ** 
1dbf0 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70      SAVEPOINT sp
1dc00 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c 73 68  ;.  **       <sh
1dc10 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66 69  rink database fi
1dc20 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a 20  le to Y pages>. 
1dc30 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65 72 53   **       pagerS
1dc40 74 72 65 73 73 28 70 61 67 65 20 58 29 0a 20 20  tress(page X).  
1dc50 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20  **     ROLLBACK 
1dc60 54 4f 20 73 70 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  TO sp;.  **.  **
1dc70 20 49 66 20 28 58 3e 59 29 2c 20 74 68 65 6e 20   If (X>Y), then 
1dc80 77 68 65 6e 20 70 61 67 65 72 53 74 72 65 73 73  when pagerStress
1dc90 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67 65 20   is called page 
1dca0 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72  X will not be wr
1dcb0 69 74 74 65 6e 0a 20 20 2a 2a 20 6f 75 74 20 74  itten.  ** out t
1dcc0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1dcd0 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20 62 65  ile, but will be
1dce0 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 74 68   dropped from th
1dcf0 65 20 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20  e cache. Then,. 
1dd00 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68   ** following th
1dd10 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73  e "ROLLBACK TO s
1dd20 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20 72 65  p" statement, re
1dd30 61 64 69 6e 67 20 70 61 67 65 20 58 20 77 69 6c  ading page X wil
1dd40 6c 20 72 65 61 64 0a 20 20 2a 2a 20 64 61 74 61  l read.  ** data
1dd50 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1dd60 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 77 69  se file. This wi
1dd70 6c 6c 20 62 65 20 74 68 65 20 63 6f 70 79 20 6f  ll be the copy o
1dd80 66 20 70 61 67 65 20 58 20 61 73 20 69 74 0a 20  f page X as it. 
1dd90 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68 65   ** was when the
1dda0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
1ddb0 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74 20  rted, not as it 
1ddc0 77 61 73 20 77 68 65 6e 20 22 53 41 56 45 50 4f  was when "SAVEPO
1ddd0 49 4e 54 20 73 70 22 0a 20 20 2a 2a 20 77 61 73  INT sp".  ** was
1dde0 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a 0a   executed..  **.
1ddf0 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f    ** The solutio
1de00 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20 74 68  n is to write th
1de10 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 20 66  e current data f
1de20 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f 20 74  or page X into t
1de30 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f 75  he .  ** sub-jou
1de40 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20 28 69  rnal file now (i
1de50 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
1de60 61 64 79 20 74 68 65 72 65 29 2c 20 73 6f 20 74  ady there), so t
1de70 68 61 74 20 69 74 20 77 69 6c 6c 0a 20 20 2a 2a  hat it will.  **
1de80 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20   be restored to 
1de90 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75  its current valu
1dea0 65 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c  e when the "ROLL
1deb0 42 41 43 4b 20 54 4f 20 73 70 22 20 69 73 20 0a  BACK TO sp" is .
1dec0 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a 20    ** executed.. 
1ded0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
1dee0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e  LITE_OK && pPg->
1def0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53  pgno>pPager->dbS
1df00 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75 69  ize && subjRequi
1df10 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a  resPage(pPg) ){.
1df20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72      rc = subjour
1df30 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20  nalPage(pPg);.  
1df40 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  }..  /* Write th
1df50 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1df60 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68  e page out to th
1df70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1df80 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
1df90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
1dfa0 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  Pg->pDirty = 0;.
1dfb0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
1dfc0 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50  rite_pagelist(pP
1dfd0 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  g);.  }..  /* Ma
1dfe0 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63  rk the page as c
1dff0 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72  lean. */.  if( r
1e000 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e010 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
1e020 22 53 54 52 45 53 53 20 25 64 20 70 61 67 65 20  "STRESS %d page 
1e030 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1e040 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1e050 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  o));.    sqlite3
1e060 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
1e070 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pPg);.  }..  ret
1e080 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
1e090 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a  pPager, rc);.}..
1e0a0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
1e0b0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61  and initialize a
1e0c0 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65 63   new Pager objec
1e0d0 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e  t and put a poin
1e0e0 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20  ter to it.** in 
1e0f0 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20 70 61  *ppPager. The pa
1e100 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e 74  ger should event
1e110 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20 62  ually be freed b
1e120 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20  y passing it.** 
1e130 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
1e140 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  lose()..**.** Th
1e150 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75  e zFilename argu
1e160 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61 74 68  ment is the path
1e170 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1e180 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a   file to open..*
1e190 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
1e1a0 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61  s NULL then a ra
1e1b0 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d  ndomly-named tem
1e1c0 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63  porary file is c
1e1d0 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73  reated.** and us
1e1e0 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74  ed as the file t
1e1f0 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54 65 6d  o be cached. Tem
1e200 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72 65  porary files are
1e210 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61   be deleted.** a
1e220 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65  utomatically whe
1e230 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65  n they are close
1e240 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  d. If zFilename 
1e250 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
1e260 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72  en .** all infor
1e270 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69  mation is held i
1e280 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73 20 6e  n cache. It is n
1e290 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20  ever written to 
1e2a0 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63  disk. .** This c
1e2b0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d  an be used to im
1e2c0 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65  plement an in-me
1e2d0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
1e2e0 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 20  *.** The nExtra 
1e2f0 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69 66  parameter specif
1e300 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ies the number o
1e310 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
1e320 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c   allocated.** al
1e330 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20 70 61  ong with each pa
1e340 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68  ge reference. Th
1e350 69 73 20 73 70 61 63 65 20 69 73 20 61 76 61 69  is space is avai
1e360 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65  lable to the use
1e370 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c  r.** via the sql
1e380 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
1e390 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54  a() API..**.** T
1e3a0 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  he flags argumen
1e3b0 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 70 65  t is used to spe
1e3c0 63 69 66 79 20 70 72 6f 70 65 72 74 69 65 73 20  cify properties 
1e3d0 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65 0a  that affect the.
1e3e0 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ** operation of 
1e3f0 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 73 68  the pager. It sh
1e400 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 73  ould be passed s
1e410 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d 62  ome bitwise comb
1e420 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68  ination.** of th
1e430 65 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55  e PAGER_OMIT_JOU
1e440 52 4e 41 4c 20 61 6e 64 20 50 41 47 45 52 5f 4e  RNAL and PAGER_N
1e450 4f 5f 52 45 41 44 4c 4f 43 4b 20 66 6c 61 67 73  O_READLOCK flags
1e460 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46  ..**.** The vfsF
1e470 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 69  lags parameter i
1e480 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70  s a bitmask to p
1e490 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73  ass to the flags
1e4a0 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66   parameter.** of
1e4b0 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74   the xOpen() met
1e4c0 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c  hod of the suppl
1e4d0 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65  ied VFS when ope
1e4e0 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a  ning files. .**.
1e4f0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
1e500 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61  object is alloca
1e510 74 65 64 20 61 6e 64 20 74 68 65 20 73 70 65 63  ted and the spec
1e520 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65  ified file opene
1e530 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  d .** successful
1e540 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ly, SQLITE_OK is
1e550 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1e560 70 50 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f  pPager set to po
1e570 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65  int to.** the ne
1e580 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  w pager object. 
1e590 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1e5a0 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20  rs, *ppPager is 
1e5b0 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61  set to NULL.** a
1e5c0 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  nd error code re
1e5d0 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e  turned. This fun
1e5e0 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e  ction may return
1e5f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
1e600 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28   (sqlite3Malloc(
1e610 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  ) is used to all
1e620 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53  ocate memory), S
1e630 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f  QLITE_CANTOPEN o
1e640 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51  r .** various SQ
1e650 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f  LITE_IO_XXX erro
1e660 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
1e670 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73  e3PagerOpen(.  s
1e680 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1e690 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ,       /* The v
1e6a0 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74  irtual file syst
1e6b0 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50  em to use */.  P
1e6c0 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20  ager **ppPager, 
1e6d0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1e6e0 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72  Return the Pager
1e6f0 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
1e700 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1e710 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a  *zFilename,   /*
1e720 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
1e730 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
1e740 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  en */.  int nExt
1e750 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ra,             
1e760 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20   /* Extra bytes 
1e770 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69  append to each i
1e780 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
1e790 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
1e7a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
1e7b0 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67  lags controlling
1e7c0 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
1e7d0 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20  int vfsFlags    
1e7e0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
1e7f0 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
1e800 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   to sqlite3_vfs.
1e810 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20  xOpen() */.){.  
1e820 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65  u8 *pPtr;.  Page
1e830 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20  r *pPager = 0;  
1e840 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
1e850 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ject to allocate
1e860 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20   and return */. 
1e870 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1e880 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74  _OK;      /* Ret
1e890 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
1e8a0 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20  t tempFile = 0; 
1e8b0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
1e8c0 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69  or temp files (i
1e8d0 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  ncl. in-memory f
1e8e0 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d  iles) */.  int m
1e8f0 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20  emDb = 0;       
1e900 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
1e910 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
1e920 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ory file */.  in
1e930 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20  t readOnly = 0; 
1e940 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1e950 66 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  f this is a read
1e960 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20  -only file */.  
1e970 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  int journalFileS
1e980 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65  ize;     /* Byte
1e990 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f  s to allocate fo
1e9a0 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66  r each journal f
1e9b0 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61  d */.  char *zPa
1e9c0 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  thname = 0;     
1e9d0 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20  /* Full path to 
1e9e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1e9f0 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65  .  int nPathname
1ea00 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
1ea10 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
1ea20 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  n zPathname */. 
1ea30 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20   int useJournal 
1ea40 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
1ea50 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d  _OMIT_JOURNAL)==
1ea60 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f  0; /* False to o
1ea70 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  mit journal */. 
1ea80 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20   int noReadlock 
1ea90 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
1eaa0 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30  _NO_READLOCK)!=0
1eab0 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d  ;  /* True to om
1eac0 69 74 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a  it read-lock */.
1ead0 20 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65    int pcacheSize
1eae0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
1eaf0 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a  Size();       /*
1eb00 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61   Bytes to alloca
1eb10 74 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f  te for PCache */
1eb20 0a 20 20 75 31 36 20 73 7a 50 61 67 65 44 66 6c  .  u16 szPageDfl
1eb30 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  t = SQLITE_DEFAU
1eb40 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f  LT_PAGE_SIZE;  /
1eb50 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65 20 73  * Default page s
1eb60 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  ize */..  /* Fig
1eb70 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68  ure out how much
1eb80 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69 72   space is requir
1eb90 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72  ed for each jour
1eba0 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a  nal file-handle.
1ebb0 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20    ** (there are 
1ebc0 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65  two of them, the
1ebd0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e   main journal an
1ebe0 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  d the sub-journa
1ebf0 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69 73  l). This.  ** is
1ec00 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70 61   the maximum spa
1ec10 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ce required for 
1ec20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
1ec30 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
1ec40 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 67   .  ** and a reg
1ec50 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ular journal fil
1ec60 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74  e-handle. Note t
1ec70 68 61 74 20 61 20 22 72 65 67 75 6c 61 72 20 6a  hat a "regular j
1ec80 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20  ournal-handle". 
1ec90 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77 72 61   ** may be a wra
1eca0 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f 66 20  pper capable of 
1ecb0 63 61 63 68 69 6e 67 20 74 68 65 20 66 69 72 73  caching the firs
1ecc0 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  t portion of the
1ecd0 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
1ece0 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20  le in memory to 
1ecf0 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 61 74  implement the at
1ed00 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
1ed10 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a 20 20  ization (see .  
1ed20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20 6a  ** source file j
1ed30 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a  ournal.c)..  */.
1ed40 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75    if( sqlite3Jou
1ed50 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e 73  rnalSize(pVfs)>s
1ed60 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
1ed70 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f  Size() ){.    jo
1ed80 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20  urnalFileSize = 
1ed90 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f  ROUND8(sqlite3Jo
1eda0 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 29  urnalSize(pVfs))
1edb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a  ;.  }else{.    j
1edc0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
1edd0 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4d   ROUND8(sqlite3M
1ede0 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29  emJournalSize())
1edf0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
1ee00 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
1ee10 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63  ble to NULL in c
1ee20 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  ase an error occ
1ee30 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67  urs. */.  *ppPag
1ee40 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f  er = 0;..  /* Co
1ee50 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20  mpute and store 
1ee60 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
1ee70 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65  e in an allocate
1ee80 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  d buffer pointed
1ee90 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74  .  ** to by zPat
1eea0 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50  hname, length nP
1eeb0 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20  athname. Or, if 
1eec0 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72  this is a tempor
1eed0 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c  ary file,.  ** l
1eee0 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e  eave both nPathn
1eef0 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d  ame and zPathnam
1ef00 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f  e set to 0..  */
1ef10 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
1ef20 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
1ef30 20 29 7b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d   ){.    nPathnam
1ef40 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
1ef50 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74  name+1;.    zPat
1ef60 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
1ef70 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a  alloc(nPathname*
1ef80 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74  2);.    if( zPat
1ef90 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  hname==0 ){.    
1efa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1efb0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 69 66  NOMEM;.    }.#if
1efc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1efd0 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66  _MEMORYDB.    if
1efe0 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61  ( strcmp(zFilena
1eff0 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d  me,":memory:")==
1f000 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62  0 ){.      memDb
1f010 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50 61 74   = 1;.      zPat
1f020 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20  hname[0] = 0;.  
1f030 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
1f040 20 20 20 7b 0a 20 20 20 20 20 20 7a 50 61 74 68     {.      zPath
1f050 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20  name[0] = 0; /* 
1f060 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74 69 61  Make sure initia
1f070 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20 46 75  lized even if Fu
1f080 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66 61 69  llPathname() fai
1f090 6c 73 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  ls */.      rc =
1f0a0 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
1f0b0 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
1f0c0 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  lename, nPathnam
1f0d0 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, zPathname);. 
1f0e0 20 20 20 7d 0a 0a 20 20 20 20 6e 50 61 74 68 6e     }..    nPathn
1f0f0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
1f100 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29  len30(zPathname)
1f110 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1f120 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68  LITE_OK && nPath
1f130 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50  name+8>pVfs->mxP
1f140 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
1f150 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
1f160 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68  is taken when th
1f170 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72  e journal path r
1f180 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20  equired by.     
1f190 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
1f1a0 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69   being opened wi
1f1b0 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20  ll be more than 
1f1c0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1f1d0 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20  .      ** bytes 
1f1e0 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20  in length. This 
1f1f0 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
1f200 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65  se cannot be ope
1f210 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73  ned,.      ** as
1f220 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   it will not be 
1f230 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e  possible to open
1f240 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1f250 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20  e or even.      
1f260 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  ** check for a h
1f270 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  ot-journal befor
1f280 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20  e reading..     
1f290 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
1f2a0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
1f2b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1f2c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1f2d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1f2e0 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  e(zPathname);.  
1f2f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1f300 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
1f310 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
1f320 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72  or the Pager str
1f330 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f  ucture, PCache o
1f340 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20  bject, the.  ** 
1f350 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72  three file descr
1f360 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61  iptors, the data
1f370 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61  base file name a
1f380 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  nd the journal .
1f390 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20    ** file name. 
1f3a0 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65  The layout in me
1f3b0 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f  mory is as follo
1f3c0 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
1f3d0 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20    Pager object  
1f3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3f0 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29    (sizeof(Pager)
1f400 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
1f410 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20   PCache object  
1f420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f430 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53   (sqlite3PcacheS
1f440 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a  ize() bytes).  *
1f450 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66  *     Database f
1f460 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
1f470 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f        (pVfs->szO
1f480 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a  sFile bytes).  *
1f490 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61  *     Sub-journa
1f4a0 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  l file handle   
1f4b0 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
1f4c0 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
1f4d0 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72  **     Main jour
1f4e0 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
1f4f0 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
1f500 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
1f510 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
1f520 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
1f530 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
1f540 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a  me+1 bytes).  **
1f550 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
1f560 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
1f570 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b       (nPathname+
1f580 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a  8+1 bytes).  */.
1f590 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73    pPtr = (u8 *)s
1f5a0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
1f5b0 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a  (.    ROUND8(siz
1f5c0 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20  eof(*pPager)) + 
1f5d0 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74       /* Pager st
1f5e0 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52  ructure */.    R
1f5f0 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65  OUND8(pcacheSize
1f600 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ) +           /*
1f610 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a   PCache object *
1f620 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66  /.    ROUND8(pVf
1f630 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20  s->szOsFile) +  
1f640 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
1f650 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20   db file */.    
1f660 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
1f670 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f  * 2 +          /
1f680 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61  * The two journa
1f690 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20  l files */ .    
1f6a0 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20  nPathname + 1 + 
1f6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f6c0 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20  * zFilename */. 
1f6d0 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38     nPathname + 8
1f6e0 20 2b 20 31 20 20 20 20 20 20 20 20 20 20 20 20   + 1            
1f6f0 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f    /* zJournal */
1f700 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
1f710 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
1f720 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f  MENT(SQLITE_INT_
1f730 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69  TO_PTR(journalFi
1f740 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66  leSize)) );.  if
1f750 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73  ( !pPtr ){.    s
1f760 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
1f770 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
1f780 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1f790 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20  .  }.  pPager = 
1f7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 50 61               (Pa
1f7b0 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70  ger*)(pPtr);.  p
1f7c0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d  Pager->pPCache =
1f7d0 20 20 20 20 28 50 43 61 63 68 65 2a 29 28 70 50      (PCache*)(pP
1f7e0 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a  tr += ROUND8(siz
1f7f0 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a  eof(*pPager)));.
1f800 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20    pPager->fd =  
1f810 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
1f820 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
1f830 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20  pcacheSize));.  
1f840 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28  pPager->sjfd = (
1f850 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
1f860 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56  Ptr += ROUND8(pV
1f870 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a  fs->szOsFile));.
1f880 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20    pPager->jfd = 
1f890 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
1f8a0 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c  (pPtr += journal
1f8b0 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  FileSize);.  pPa
1f8c0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ger->zFilename =
1f8d0 20 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72      (char*)(pPtr
1f8e0 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53   += journalFileS
1f8f0 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ize);.  assert( 
1f900 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
1f910 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64  MENT(pPager->jfd
1f920 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ) );..  /* Fill 
1f930 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69  in the Pager.zFi
1f940 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72  lename and Pager
1f950 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72  .zJournal buffer
1f960 73 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e 20  s, if required. 
1f970 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61  */.  if( zPathna
1f980 6d 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  me ){.    pPager
1f990 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28  ->zJournal =   (
1f9a0 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e  char*)(pPtr += n
1f9b0 50 61 74 68 6e 61 6d 65 20 2b 20 31 29 3b 0a 20  Pathname + 1);. 
1f9c0 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
1f9d0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  ->zFilename, zPa
1f9e0 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
1f9f0 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  e);.    memcpy(p
1fa00 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
1fa10 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
1fa20 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63  hname);.    memc
1fa30 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  py(&pPager->zJou
1fa40 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c  rnal[nPathname],
1fa50 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38 29 3b   "-journal", 8);
1fa60 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1fa70 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30  >zFilename[0]==0
1fa80 20 29 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72   ) pPager->zJour
1fa90 6e 61 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  nal[0] = 0;.    
1faa0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
1fab0 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70  thname);.  }.  p
1fac0 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56  Pager->pVfs = pV
1fad0 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66  fs;.  pPager->vf
1fae0 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67  sFlags = vfsFlag
1faf0 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  s;..  /* Open th
1fb00 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20  e pager file..  
1fb10 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
1fb20 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
1fb30 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a  0] && !memDb ){.
1fb40 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30      int fout = 0
1fb50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fb60 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67       /* VFS flag
1fb70 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f  s returned by xO
1fb80 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20  pen() */.    rc 
1fb90 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
1fba0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46  pVfs, pPager->zF
1fbb0 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
1fbc0 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26  >fd, vfsFlags, &
1fbd0 66 6f 75 74 29 3b 0a 20 20 20 20 72 65 61 64 4f  fout);.    readO
1fbe0 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49  nly = (fout&SQLI
1fbf0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
1fc00 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
1fc10 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65  e file was succe
1fc20 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66  ssfully opened f
1fc30 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
1fc40 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f  cess,.    ** cho
1fc50 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61  ose a default pa
1fc60 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20  ge size in case 
1fc70 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74  we have to creat
1fc80 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
1fc90 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
1fca0 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
1fcb0 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  e is the maximum
1fcc0 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
1fcd0 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44  **    + SQLITE_D
1fce0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
1fcf0 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  ,.    **    + Th
1fd00 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
1fd10 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
1fd20 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
1fd30 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73      + The larges
1fd40 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74  t page size that
1fd50 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
1fd60 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20  atomically..    
1fd70 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
1fd80 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61  QLITE_OK && !rea
1fd90 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 73  dOnly ){.      s
1fda0 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
1fdb0 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ger);.      asse
1fdc0 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  rt(SQLITE_DEFAUL
1fdd0 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c  T_PAGE_SIZE<=SQL
1fde0 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
1fdf0 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
1fe00 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74    if( szPageDflt
1fe10 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  <pPager->sectorS
1fe20 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ize ){.        i
1fe30 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  f( pPager->secto
1fe40 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  rSize>SQLITE_MAX
1fe50 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
1fe60 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ZE ){.          
1fe70 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
1fe80 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
1fe90 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20  PAGE_SIZE;.     
1fea0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1feb0 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
1fec0 20 28 75 31 36 29 70 50 61 67 65 72 2d 3e 73 65   (u16)pPager->se
1fed0 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  ctorSize;.      
1fee0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64    }.      }.#ifd
1fef0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1ff00 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
1ff10 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e      {.        in
1ff20 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
1ff30 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
1ff40 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
1ff50 64 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  d);.        int 
1ff60 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ii;.        asse
1ff70 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
1ff80 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
1ff90 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >8));.        as
1ffa0 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
1ffb0 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
1ffc0 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  536>>8));.      
1ffd0 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
1ffe0 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
1fff0 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20  _SIZE<=65536);. 
20000 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a         for(ii=sz
20010 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51  PageDflt; ii<=SQ
20020 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
20030 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69  _PAGE_SIZE; ii=i
20040 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i*2){.          
20050 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f  if( iDc&(SQLITE_
20060 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69  IOCAP_ATOMIC|(ii
20070 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20  >>8)) ){.       
20080 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20       szPageDflt 
20090 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20  = ii;.          
200a0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
200b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
200c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
200d0 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   If a temporary 
200e0 66 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65  file is requeste
200f0 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  d, it is not ope
20100 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ned immediately.
20110 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  .    ** In this 
20120 63 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74  case we accept t
20130 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
20140 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61  size and delay a
20150 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f  ctually.    ** o
20160 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20  pening the file 
20170 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
20180 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28  call to OsWrite(
20190 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
201a0 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
201b0 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20  also run for an 
201c0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
201d0 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79  se. An in-memory
201e0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
201f0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
20200 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74  a temp-file that
20210 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65   is never writte
20220 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20  n out to.    ** 
20230 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e  disk and uses an
20240 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62   in-memory rollb
20250 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ack journal..   
20260 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c   */ .    tempFil
20270 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
20280 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
20290 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
202a0 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46  readOnly = (vfsF
202b0 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
202c0 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a  _READONLY);.  }.
202d0 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
202e0 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65  ing call to Page
202f0 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73  rSetPagesize() s
20300 65 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65  erves to set the
20310 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20   value of .  ** 
20320 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61  Pager.pageSize a
20330 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74  nd to allocate t
20340 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  he Pager.pTmpSpa
20350 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a  ce buffer..  */.
20360 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20370 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
20380 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  t( pPager->memDb
20390 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
203a0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
203b0 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
203c0 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29  &szPageDflt, -1)
203d0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
203e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
203f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
20400 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
20410 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  in either of the
20420 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66   blocks above, f
20430 72 65 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ree the .  ** Pa
20440 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
20450 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  d close the file
20460 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21  ..  */.  if( rc!
20470 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20480 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
20490 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 3b 0a  r->pTmpSpace );.
204a0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
204b0 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
204c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
204d0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
204e0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
204f0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
20500 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e  e PCache object.
20510 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 45   */.  assert( nE
20520 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 6e  xtra<1000 );.  n
20530 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e  Extra = ROUND8(n
20540 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65  Extra);.  sqlite
20550 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61  3PcacheOpen(szPa
20560 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20  geDflt, nExtra, 
20570 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20  !memDb,.        
20580 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d              !mem
20590 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30  Db?pagerStress:0
205a0 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72  , (void *)pPager
205b0 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  , pPager->pPCach
205c0 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43  e);..  PAGERTRAC
205d0 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e  E(("OPEN %d %s\n
205e0 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ", FILEHANDLEID(
205f0 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61  pPager->fd), pPa
20600 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29  ger->zFilename))
20610 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50  ;.  IOTRACE(("OP
20620 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61  EN %p %s\n", pPa
20630 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  ger, pPager->zFi
20640 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67  lename))..  pPag
20650 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  er->useJournal =
20660 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b   (u8)useJournal;
20670 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  .  pPager->noRea
20680 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64 6c  dlock = (noReadl
20690 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 29  ock && readOnly)
206a0 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61 67   ?1:0;.  /* pPag
206b0 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30  er->stmtOpen = 0
206c0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
206d0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
206e0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
206f0 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20  >nRef = 0; */.  
20700 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
20710 6c 69 64 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b  lid = (u8)memDb;
20720 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
20730 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  mtSize = 0; */. 
20740 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
20750 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  JSize = 0; */.  
20760 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  /* pPager->nPage
20770 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
20780 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49  r->mxPgno = SQLI
20790 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e  TE_MAX_PAGE_COUN
207a0 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  T;.  /* pPager->
207b0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
207c0 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72  LOCK; */.  asser
207d0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
207e0 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20   == (tempFile ? 
207f0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
20800 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20  : PAGER_UNLOCK) 
20810 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  );.  /* pPager->
20820 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a  errMask = 0; */.
20830 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
20840 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c  le = (u8)tempFil
20850 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d  e;.  assert( tem
20860 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
20870 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
20880 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65  .          || te
20890 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
208a0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
208b0 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
208c0 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
208d0 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20  DE_EXCLUSIVE==1 
208e0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  );.  pPager->exc
208f0 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38  lusiveMode = (u8
20900 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50  )tempFile; .  pP
20910 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
20920 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
20930 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
20940 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29  er->memDb = (u8)
20950 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
20960 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29  >readOnly = (u8)
20970 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70  readOnly;.  /* p
20980 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
20990 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
209a0 2d 3e 6e 6f 53 79 6e 63 20 3d 20 28 70 50 61 67  ->noSync = (pPag
209b0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20  er->tempFile || 
209c0 21 75 73 65 4a 6f 75 72 6e 61 6c 29 20 3f 31 3a  !useJournal) ?1:
209d0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  0;.  pPager->ful
209e0 6c 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  lSync = pPager->
209f0 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20 20 70  noSync ?0:1;.  p
20a00 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
20a10 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
20a20 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61  NORMAL;.  /* pPa
20a30 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
20a40 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
20a50 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
20a60 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
20a70 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f  r->pLast = 0; */
20a80 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  .  pPager->nExtr
20a90 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b  a = (u16)nExtra;
20aa0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
20ab0 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51  alSizeLimit = SQ
20ac0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55  LITE_DEFAULT_JOU
20ad0 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b  RNAL_SIZE_LIMIT;
20ae0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
20af0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
20b00 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73   tempFile );.  s
20b10 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
20b20 67 65 72 29 3b 0a 20 20 69 66 28 20 6d 65 6d 44  ger);.  if( memD
20b30 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  b ){.    pPager-
20b40 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
20b50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
20b60 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f  _MEMORY;.  }.  /
20b70 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  * pPager->xBusyH
20b80 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20  andler = 0; */. 
20b90 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73   /* pPager->pBus
20ba0 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b  yHandlerArg = 0;
20bb0 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28   */.  /* memset(
20bc0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30  pPager->aHash, 0
20bd0 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
20be0 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a  >aHash)); */.  *
20bf0 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
20c00 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
20c10 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  E_OK;.}..../*.**
20c20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
20c30 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  s called after t
20c40 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f  ransitioning fro
20c50 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74  m PAGER_UNLOCK t
20c60 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45  o.** PAGER_SHARE
20c70 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73 74  D state. It test
20c80 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
20c90 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73  hot journal pres
20ca0 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69  ent in.** the fi
20cb0 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  le-system for th
20cc0 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41  e given pager. A
20cd0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20   hot journal is 
20ce0 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65  one that .** nee
20cf0 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
20d00 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20  back. According 
20d10 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
20d20 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a  , a hot-journal.
20d30 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  ** file exists i
20d40 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
20d50 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65 74  criteria are met
20d60 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
20d70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
20d80 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  sts in the file 
20d90 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20  system, and.**  
20da0 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f   * No process ho
20db0 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6f  lds a RESERVED o
20dc0 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
20dd0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
20de0 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ile, and.**   * 
20df0 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
20e00 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65 61  e itself is grea
20e10 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
20e20 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a   in size, and.**
20e30 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20 62     * The first b
20e40 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  yte of the journ
20e50 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
20e60 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a  nd is not 0x00..
20e70 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
20e80 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
20e90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
20ea0 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61  s 0 but a journa
20eb0 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73  l file.** exists
20ec0 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62  , that is probab
20ed0 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ly an old journa
20ee0 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d  l left over from
20ef0 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61   a prior.** data
20f00 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
20f10 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  me name. In this
20f20 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61   case the journa
20f30 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73  l file is.** jus
20f40 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  t deleted using 
20f50 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73  OsDelete, *pExis
20f60 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  ts is set to 0 a
20f70 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  nd SQLITE_OK.** 
20f80 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
20f90 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
20fa0 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69  does not check i
20fb0 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61 73  f there is a mas
20fc0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
20fd0 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65  name.** at the e
20fe0 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20  nd of the file. 
20ff0 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64  If there is, and
21000 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75   that master jou
21010 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65  rnal file.** doe
21020 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65  s not exist, the
21030 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
21040 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
21050 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a   hot. In this.**
21060 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
21070 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  ne will return a
21080 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e   false-positive.
21090 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   The pager_playb
210a0 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ack().** routine
210b0 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74   will discover t
210c0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
210d0 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  file is not real
210e0 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77  ly hot and .** w
210f0 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20  ill not roll it 
21100 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  back. .**.** If 
21110 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
21120 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65  le is found to e
21130 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69  xist, *pExists i
21140 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a  s set to 1 and .
21150 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
21160 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74  urned. If no hot
21170 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
21180 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73   present, *pExis
21190 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ts is.** set to 
211a0 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  0 and SQLITE_OK 
211b0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
211c0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
211d0 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20  while trying.** 
211e0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
211f0 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f  ther or not a ho
21200 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  t-journal file e
21210 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72  xists, the IO er
21220 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72  ror.** code is r
21230 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
21240 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74  value of *pExist
21250 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a  s is undefined..
21260 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
21270 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sHotJournal(Page
21280 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
21290 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69  pExists){.  sqli
212a0 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
212b0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
212c0 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Vfs;.  int rc;  
212d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212e0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
212f0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69  ode */.  int exi
21300 73 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  sts;            
21310 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
21320 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
21330 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 0a   is present */..
21340 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
21350 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21360 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
21370 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
21380 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
21390 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
213a0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
213b0 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2a 70 45 78  >jfd) );..  *pEx
213c0 69 73 74 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d  ists = 0;.  rc =
213d0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
213e0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
213f0 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
21400 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
21410 65 78 69 73 74 73 29 3b 0a 20 20 69 66 28 20 72  exists);.  if( r
21420 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21430 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e  exists ){.    in
21440 74 20 6c 6f 63 6b 65 64 3b 20 20 20 20 20 20 20  t locked;       
21450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
21460 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73  e if some proces
21470 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
21480 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20  ED lock */..    
21490 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f  /* Race conditio
214a0 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72  n here:  Another
214b0 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68   process might h
214c0 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67  ave been holding
214d0 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   the.    ** the 
214e0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e  RESERVED lock an
214f0 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c  d have a journal
21500 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c   open at the sql
21510 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a  ite3OsAccess() .
21520 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76      ** call abov
21530 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65  e, but then dele
21540 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  te the journal a
21550 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b  nd drop the lock
21560 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77   before.    ** w
21570 65 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c  e get to the fol
21580 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73  lowing sqlite3Os
21590 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
215a0 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68  k() call.  If th
215b0 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65  at.    ** is the
215c0 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74   case, this rout
215d0 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20  ine might think 
215e0 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
215f0 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20  ournal when.    
21600 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72 65  ** in fact there
21610 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20   is none.  This 
21620 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c  results in a fal
21630 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63  se-positive whic
21640 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  h will.    ** be
21650 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74   dealt with by t
21660 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74  he playback rout
21670 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38  ine.  Ticket #38
21680 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  83..    */.    r
21690 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65  c = sqlite3OsChe
216a0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70  ckReservedLock(p
216b0 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b  Pager->fd, &lock
216c0 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
216d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c  =SQLITE_OK && !l
216e0 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 69  ocked ){.      i
216f0 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 20 20 20  nt nPage;..     
21700 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 73 69   /* Check the si
21710 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
21720 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20 63  se file. If it c
21730 6f 6e 73 69 73 74 73 20 6f 66 20 30 20 70 61 67  onsists of 0 pag
21740 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  es,.      ** the
21750 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  n delete the jou
21760 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65 20 74  rnal file. See t
21770 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  he header commen
21780 74 20 61 62 6f 76 65 20 66 6f 72 20 0a 20 20 20  t above for .   
21790 20 20 20 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e     ** the reason
217a0 69 6e 67 20 68 65 72 65 2e 20 20 44 65 6c 65 74  ing here.  Delet
217b0 65 20 74 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a  e the obsolete j
217c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65  ournal file unde
217d0 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 52 45 53  r.      ** a RES
217e0 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76  ERVED lock to av
217f0 6f 69 64 20 72 61 63 65 20 63 6f 6e 64 69 74 69  oid race conditi
21800 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f 69 64  ons and to avoid
21810 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20   violating.     
21820 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20   ** [H33020]..  
21830 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
21840 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
21850 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
21860 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  &nPage);.      i
21870 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21880 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
21890 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
218a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
218b0 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
218c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
218d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
218e0 41 47 45 52 5f 52 45 53 45 52 56 45 44 0a 20 20  AGER_RESERVED.  
218f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
21900 7c 20 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  |  sqlite3OsLock
21910 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53  (pPager->fd, RES
21920 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c  ERVED_LOCK)==SQL
21930 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21940 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
21950 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67  elete(pVfs, pPag
21960 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
21970 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
21980 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
21990 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
219a0 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  D );.           
219b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
219c0 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te==PAGER_SHARED
219d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
219e0 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
219f0 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  k(pPager->fd, SH
21a00 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
21a10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21a20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21a30 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
21a40 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
21a50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21a60 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61     /* The journa
21a70 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
21a80 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  d no other conne
21a90 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65  ction has a rese
21aa0 72 76 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  rved.          *
21ab0 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  * or greater loc
21ac0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
21ad0 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63  e file. Now chec
21ae0 6b 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  k that there is.
21af0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20            ** at 
21b00 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65  least one non-ze
21b10 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65 20  ro bytes at the 
21b20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
21b30 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
21b40 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65       ** If there
21b50 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e   is, then we con
21b60 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e  sider this journ
21b70 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66  al to be hot. If
21b80 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20   not, .         
21b90 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67   ** it can be ig
21ba0 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20  nored..         
21bb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e   */.          in
21bc0 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  t f = SQLITE_OPE
21bd0 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
21be0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
21bf0 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 72  NAL;.          r
21c00 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
21c10 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
21c20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
21c30 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20  ->jfd, f, &f);. 
21c40 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
21c50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21c60 20 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72            u8 fir
21c70 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
21c80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21c90 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
21ca0 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72  fd, (void *)&fir
21cb0 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  st, 1, 0);.     
21cc0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
21cd0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
21ce0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
21cf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
21d00 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
21d10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21d20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
21d30 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
21d40 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
21d50 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29  sts = (first!=0)
21d60 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
21d70 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
21d80 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20  _CANTOPEN ){.   
21d90 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
21da0 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68  e cannot open th
21db0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
21dc0 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  al file in order
21dd0 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20   to see if.     
21de0 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20 68 61         ** its ha
21df0 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c  s a zero header,
21e00 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 64   that might be d
21e10 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72  ue to an I/O err
21e20 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20  or, or.         
21e30 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62     ** it might b
21e40 65 20 64 75 65 20 74 6f 20 74 68 65 20 72 61 63  e due to the rac
21e50 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
21e60 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20  ribed above and 
21e70 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  in.            *
21e80 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20  * ticket #3883. 
21e90 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 73 73   Either way, ass
21ea0 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ume that the jou
21eb0 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20  rnal is hot..   
21ec0 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73           ** This
21ed0 20 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c 73   might be a fals
21ee0 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74  e positive.  But
21ef0 20 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   if it is, then 
21f00 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
21f10 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75  ** automatic jou
21f20 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e  rnal playback an
21f30 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61  d recovery mecha
21f40 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20  nism will deal. 
21f50 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69             ** wi
21f60 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45  th it under an E
21f70 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68  XCLUSIVE lock wh
21f80 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  ere we do not ne
21f90 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ed to.          
21fa0 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75    ** worry so mu
21fb0 63 68 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e  ch with race con
21fc0 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20  ditions..       
21fd0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
21fe0 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31      *pExists = 1
21ff0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
22000 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
22010 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22020 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
22030 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
22040 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
22050 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f  d the content fo
22060 72 20 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f  r page pPg out o
22070 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
22080 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a  ile and into .**
22090 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73   pPg->pData. A s
220a0 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72  hared lock or gr
220b0 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65  eater must be he
220c0 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
220d0 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72  se.** file befor
220e0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
220f0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
22100 20 49 66 20 70 61 67 65 20 31 20 69 73 20 72 65   If page 1 is re
22110 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ad, then the val
22120 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69  ue of Pager.dbFi
22130 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20  leVers[] is set 
22140 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  to.** the value 
22150 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
22160 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
22170 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
22180 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74  r occurs, then t
22190 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72  he IO error is r
221a0 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
221b0 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77  aller..** Otherw
221c0 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ise, SQLITE_OK i
221d0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
221e0 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62  tatic int readDb
221f0 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
22200 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
22210 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
22220 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
22230 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
22240 20 70 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50   page pPg */.  P
22250 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e  gno pgno = pPg->
22260 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50  pgno;       /* P
22270 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65  age number to re
22280 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ad */.  int rc; 
22290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222a0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
222b0 6f 64 65 20 2a 2f 0a 20 20 69 36 34 20 69 4f 66  ode */.  i64 iOf
222c0 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
222d0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
222e0 66 73 65 74 20 6f 66 20 66 69 6c 65 20 74 6f 20  fset of file to 
222f0 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 0a 20 20  read from */..  
22300 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
22310 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
22320 52 45 44 20 26 26 20 21 4d 45 4d 44 42 20 29 3b  RED && !MEMDB );
22330 0a 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  ..  if( !isOpen(
22340 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
22350 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
22360 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
22370 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70     memset(pPg->p
22380 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d  Data, 0, pPager-
22390 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
223a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
223b0 3b 0a 20 20 7d 0a 20 20 69 4f 66 66 73 65 74 20  ;.  }.  iOffset 
223c0 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
223d0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
223e0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
223f0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
22400 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  d, pPg->pData, p
22410 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
22420 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 69 66 28   iOffset);.  if(
22430 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
22440 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
22450 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22460 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67  OK;.  }.  if( pg
22470 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 75 38 20  no==1 ){.    u8 
22480 2a 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28  *dbFileVers = &(
22490 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29  (u8*)pPg->pData)
224a0 5b 32 34 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  [24];.    memcpy
224b0 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
224c0 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
224d0 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
224e0 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
224f0 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67   }.  CODEC1(pPag
22500 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20  er, pPg->pData, 
22510 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51  pgno, 3, rc = SQ
22520 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20  LITE_NOMEM);..  
22530 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
22540 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
22550 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f  count);.  PAGER_
22560 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65  INCR(pPager->nRe
22570 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  ad);.  IOTRACE((
22580 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20  "PGIN %p %d\n", 
22590 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
225a0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 46    PAGERTRACE(("F
225b0 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20  ETCH %d page %d 
225c0 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
225d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
225e0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
225f0 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
22600 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72  ash(pPg)));..  r
22610 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22620 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
22630 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
22640 76 65 72 20 74 68 65 20 75 70 70 65 72 20 6c 61  ver the upper la
22650 79 65 72 20 72 65 71 75 65 73 74 73 20 61 20 64  yer requests a d
22660 61 74 61 62 61 73 65 0a 2a 2a 20 70 61 67 65 20  atabase.** page 
22670 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 62 65  is requested, be
22680 66 6f 72 65 20 74 68 65 20 63 61 63 68 65 20 69  fore the cache i
22690 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20  s checked for a 
226a0 73 75 69 74 61 62 6c 65 20 70 61 67 65 0a 2a 2a  suitable page.**
226b0 20 6f 72 20 61 6e 79 20 64 61 74 61 20 69 73 20   or any data is 
226c0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
226d0 74 61 62 61 73 65 2e 20 49 74 20 70 65 72 66 6f  tabase. It perfo
226e0 72 6d 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  rms the followin
226f0 67 0a 2a 2a 20 74 77 6f 20 66 75 6e 63 74 69 6f  g.** two functio
22700 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49  ns:.**.**   1) I
22710 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63  f the pager is c
22720 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41 47 45  urrently in PAGE
22730 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 28  R_UNLOCK state (
22740 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20  no lock held.** 
22750 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61       on the data
22760 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e  base file), then
22770 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
22780 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a  ade to obtain a.
22790 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 20 6c  **      SHARED l
227a0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
227b0 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69  ase file. Immedi
227c0 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61  ately after obta
227d0 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  ining.**      th
227e0 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  e SHARED lock, t
227f0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69  he file-system i
22800 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20  s checked for a 
22810 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20  hot-journal,.** 
22820 20 20 20 20 20 77 68 69 63 68 20 69 73 20 70 6c       which is pl
22830 61 79 65 64 20 62 61 63 6b 20 69 66 20 70 72 65  ayed back if pre
22840 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20  sent. Following 
22850 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  any hot-journal 
22860 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63  .**      rollbac
22870 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  k, the contents 
22880 6f 66 20 74 68 65 20 63 61 63 68 65 20 61 72 65  of the cache are
22890 20 76 61 6c 69 64 61 74 65 64 20 62 79 20 63 68   validated by ch
228a0 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  ecking.**      t
228b0 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74  he 'change-count
228c0 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65  er' field of the
228d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
228e0 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20  eader and.**    
228f0 20 20 64 69 73 63 61 72 64 65 64 20 69 66 20 74    discarded if t
22900 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f  hey are found to
22910 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a   be invalid..**.
22920 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65 20 70  **   2) If the p
22930 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
22940 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
22950 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  e, and there are
22960 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20   currently.**   
22970 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e     no outstandin
22980 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
22990 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69  any pages, and i
229a0 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
229b0 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68  tate,.**      th
229c0 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
229d0 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74   made to clear t
229e0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 62  he error state b
229f0 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20  y discarding.** 
22a00 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74       the content
22a10 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 63 61  s of the page ca
22a20 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20  che and rolling 
22a30 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f  back any open jo
22a40 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69  urnal.**      fi
22a50 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
22a60 20 6f 70 65 72 61 74 69 6f 6e 20 64 65 73 63 72   operation descr
22a70 69 62 65 64 20 62 79 20 28 32 29 20 61 62 6f 76  ibed by (2) abov
22a80 65 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  e is not attempt
22a90 65 64 2c 20 61 6e 64 20 69 66 20 74 68 65 0a 2a  ed, and if the.*
22aa0 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20 61 6e  * pager is in an
22ab0 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68   error state oth
22ac0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46  er than SQLITE_F
22ad0 55 4c 4c 20 77 68 65 6e 20 74 68 69 73 20 69 73  ULL when this is
22ae0 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 74 68 65 20   called,.** the 
22af0 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f  error state 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 20 49 74 20 69 73 20 70 65 72 6d 69 74  ed. It is permit
22b20 74 65 64 20 74 6f 20 72 65 61 64 20 74 68 65 0a  ted to read the.
22b30 2a 2a 20 64 61 74 61 62 61 73 65 20 77 68 65 6e  ** database when
22b40 20 69 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20   in SQLITE_FULL 
22b50 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a  error state..**.
22b60 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
22b70 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
22b80 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
22b90 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
22ba0 2e 20 49 66 20 61 6e 0a 2a 2a 20 49 4f 20 65 72  . If an.** IO er
22bb0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
22bc0 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74   locking the dat
22bd0 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20  abase, checking 
22be0 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
22bf0 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72 20 72 6f 6c  l.** file or rol
22c00 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72  ling back a jour
22c10 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f  nal file, the IO
22c20 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
22c30 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
22c40 69 63 20 69 6e 74 20 70 61 67 65 72 53 68 61 72  ic int pagerShar
22c50 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  edLock(Pager *pP
22c60 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
22c70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
22c80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
22c90 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
22ca0 69 6e 74 20 69 73 45 72 72 6f 72 52 65 73 65 74  int isErrorReset
22cb0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
22cc0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
22cd0 63 6f 76 65 72 69 6e 67 20 66 72 6f 6d 20 65 72  covering from er
22ce0 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a 0a 20 20  ror state */..  
22cf0 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62  /* If this datab
22d00 61 73 65 20 68 61 73 20 6e 6f 20 6f 75 74 73 74  ase has no outst
22d10 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65  anding page refe
22d20 72 65 6e 63 65 73 20 61 6e 64 20 69 73 20 69 6e  rences and is in
22d30 20 61 6e 20 0a 20 20 2a 2a 20 65 72 72 6f 72 2d   an .  ** error-
22d40 73 74 61 74 65 2c 20 74 68 69 73 20 69 73 20 61  state, this is a
22d50 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65 61 72   chance to clear
22d60 20 74 68 65 20 65 72 72 6f 72 2e 20 44 69 73 63   the error. Disc
22d70 61 72 64 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f  ard the .  ** co
22d80 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
22d90 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 72 6f  ger-cache and ro
22da0 6c 6c 62 61 63 6b 20 61 6e 79 20 68 6f 74 20 6a  llback any hot j
22db0 6f 75 72 6e 61 6c 20 69 6e 20 74 68 65 0a 20 20  ournal in the.  
22dc0 2a 2a 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a  ** file-system..
22dd0 20 20 2a 2f 0a 20 20 69 66 28 20 21 4d 45 4d 44    */.  if( !MEMD
22de0 42 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63  B && sqlite3Pcac
22df0 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
22e00 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 26  r->pPCache)==0 &
22e10 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
22e20 65 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 4f  e ){.    if( isO
22e30 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
22e40 20 7c 7c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75   || pPager->zJou
22e50 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 73  rnal ){.      is
22e60 45 72 72 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a  ErrorReset = 1;.
22e70 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
22e80 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49  ->errCode = SQLI
22e90 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72  TE_OK;.    pager
22ea0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
22eb0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
22ec0 20 70 61 67 65 72 20 69 73 20 73 74 69 6c 6c 20   pager is still 
22ed0 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
22ee0 65 2c 20 64 6f 20 6e 6f 74 20 70 72 6f 63 65 65  e, do not procee
22ef0 64 2e 20 54 68 65 20 65 72 72 6f 72 20 0a 20 20  d. The error .  
22f00 2a 2a 20 73 74 61 74 65 20 77 69 6c 6c 20 62 65  ** state will be
22f10 20 63 6c 65 61 72 65 64 20 61 74 20 73 6f 6d 65   cleared at some
22f20 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
22f30 74 75 72 65 20 77 68 65 6e 20 61 6c 6c 20 70 61  ture when all pa
22f40 67 65 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e  ge .  ** referen
22f50 63 65 73 20 61 72 65 20 64 72 6f 70 70 65 64 20  ces are dropped 
22f60 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 63 61  and the cache ca
22f70 6e 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a  n be discarded..
22f80 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
22f90 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50  r->errCode && pP
22fa0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
22fb0 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20  QLITE_FULL ){.  
22fc0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
22fd0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20  >errCode;.  }.. 
22fe0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
22ff0 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
23000 20 7c 7c 20 69 73 45 72 72 6f 72 52 65 73 65 74   || isErrorReset
23010 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
23020 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
23030 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
23040 0a 20 20 20 20 69 6e 74 20 69 73 48 6f 74 4a 6f  .    int isHotJo
23050 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61  urnal = 0;.    a
23060 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
23070 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
23080 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
23090 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
230a0 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  he)==0 );.    if
230b0 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  ( !pPager->noRea
230c0 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  dlock ){.      r
230d0 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
230e0 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53  n_lock(pPager, S
230f0 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
23100 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
23110 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
23120 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
23130 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
23140 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72  OCK );.        r
23150 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
23160 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
23170 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
23180 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
23190 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
231a0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
231b0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
231c0 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20  SHARED;.    }.  
231d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
231e0 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f  ->state>=SHARED_
231f0 4c 4f 43 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  LOCK );..    /* 
23200 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  If a journal fil
23210 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68  e exists, and th
23220 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56  ere is no RESERV
23230 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  ED lock on the. 
23240 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
23250 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74  ile, then it eit
23260 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  her needs to be 
23270 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64  played back or d
23280 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
23290 20 20 20 69 66 28 20 21 69 73 45 72 72 6f 72 52     if( !isErrorR
232a0 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 72 63  eset ){.      rc
232b0 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c   = hasHotJournal
232c0 28 70 50 61 67 65 72 2c 20 26 69 73 48 6f 74 4a  (pPager, &isHotJ
232d0 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69  ournal);.      i
232e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
232f0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
23300 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
23310 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
23320 73 45 72 72 6f 72 52 65 73 65 74 20 7c 7c 20 69  sErrorReset || i
23330 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sHotJournal ){. 
23340 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45       /* Get an E
23350 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
23360 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23370 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  le. At this poin
23380 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a  t it is.      **
23390 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
233a0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
233b0 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  is not obtained 
233c0 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68  on the way to th
233d0 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55  e.      ** EXCLU
233e0 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74  SIVE lock. If it
233f0 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70   were, another p
23400 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65  rocess might ope
23410 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  n the.      ** d
23420 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65  atabase file, de
23430 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45  tect the RESERVE
23440 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63  D lock, and conc
23450 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20  lude that the.  
23460 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
23470 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20  is safe to read 
23480 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65  while this proce
23490 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c  ss is still roll
234a0 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a  ing the .      *
234b0 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61  * hot-journal ba
234c0 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  ck..      ** .  
234d0 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74      ** Because t
234e0 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
234f0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
23500 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20   not requested, 
23510 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  any.      ** oth
23520 65 72 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d  er process attem
23530 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20  pting to access 
23540 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
23550 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20  e will get to . 
23560 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69       ** this poi
23570 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61  nt in the code a
23580 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69  nd fail to obtai
23590 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53  n its own EXCLUS
235a0 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20  IVE lock .      
235b0 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
235c0 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a  se file..      *
235d0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  /.      if( pPag
235e0 65 72 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55 53  er->state<EXCLUS
235f0 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
23600 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23610 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
23620 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  d, EXCLUSIVE_LOC
23630 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  K);.        if( 
23640 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23650 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
23660 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
23670 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
23680 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
23690 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
236a0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
236b0 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
236c0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20  E;.      }. .   
236d0 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a     /* Open the j
236e0 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f  ournal for read/
236f0 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 68  write access. Th
23700 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e  is is because in
23710 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75   .      ** exclu
23720 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
23730 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
23740 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70  ptor will be kep
23750 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20  t open and.     
23760 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65   ** possibly use
23770 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
23780 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e  ion later on. On
23790 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74   some systems, t
237a0 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 73 54 72  he.      ** OsTr
237b0 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73  uncate() call us
237c0 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ed in exclusive-
237d0 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f  access mode also
237e0 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
237f0 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65 20  ** a read/write 
23800 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20  file handle..   
23810 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
23820 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
23830 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  jfd) ){.        
23840 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20  int res;.       
23850 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
23860 63 63 65 73 73 28 70 56 66 73 2c 70 50 61 67 65  ccess(pVfs,pPage
23870 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49  r->zJournal,SQLI
23880 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
23890 2c 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20  ,&res);.        
238a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
238b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  K ){.          i
238c0 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
238d0 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d        int fout =
238e0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
238f0 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f  int f = SQLITE_O
23900 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
23910 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
23920 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20  OURNAL;.        
23930 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
23940 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
23950 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
23960 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
23970 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
23980 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
23990 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a  jfd, f, &fout);.
239a0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
239b0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
239c0 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
239d0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
239e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
239f0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75  SQLITE_OK && fou
23a00 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  t&SQLITE_OPEN_RE
23a10 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  ADONLY ){.      
23a20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
23a30 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
23a40 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
23a50 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
23a60 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
23a70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23a80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23a90 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f      /* If the jo
23aa0 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65  urnal does not e
23ab0 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79  xist, it usually
23ac0 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65   means that some
23ad0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
23ae0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
23af0 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74  n managed to get
23b00 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20   in and roll it 
23b10 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20  back before .   
23b20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
23b30 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61   connection obta
23b40 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73 69  ined the exclusi
23b50 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f  ve lock above. O
23b60 72 2c 20 69 74 20 0a 20 20 20 20 20 20 20 20 20  r, it .         
23b70 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74     ** may mean t
23b80 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61  hat the pager wa
23b90 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  s in the error-s
23ba0 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20  tate when this. 
23bb0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75             ** fu
23bc0 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
23bd0 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  d and the journa
23be0 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  l file does not 
23bf0 65 78 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20  exist.  */.     
23c00 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
23c10 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
23c20 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  n(pPager, 0);.  
23c30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23c40 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
23c50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
23c60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
23c70 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
23c80 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f    }..      /* TO
23c90 44 4f 3a 20 57 68 79 20 61 72 65 20 74 68 65 73  DO: Why are thes
23ca0 65 20 63 6c 65 61 72 65 64 20 68 65 72 65 3f 20  e cleared here? 
23cb0 49 73 20 69 74 20 6e 65 63 65 73 73 61 72 79 3f  Is it necessary?
23cc0 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
23cd0 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
23ce0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
23cf0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
23d00 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
23d10 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
23d20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
23d30 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
23d40 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61  .      /* Playba
23d50 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
23d60 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
23d70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
23d80 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63  ite.      ** loc
23d90 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20  k and reacquire 
23da0 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50  the read lock. P
23db0 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62  urge the cache b
23dc0 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70  efore.      ** p
23dd0 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
23de0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74  hot-journal so t
23df0 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64  hat we don't end
23e00 20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a   up with.      *
23e10 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  * an inconsisten
23e20 74 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a  t cache..      *
23e30 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70  /.      if( isOp
23e40 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
23e50 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
23e60 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
23e70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  Pager, 1);.     
23e80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
23e90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
23ea0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
23eb0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
23ec0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66            goto f
23ed0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d  ailed;.        }
23ee0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
23ef0 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
23f00 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
23f10 52 45 44 29 0a 20 20 20 20 20 20 20 20 20 20 20  RED).           
23f20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c  || (pPager->excl
23f30 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61  usiveMode && pPa
23f40 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52  ger->state>PAGER
23f50 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 29  _SHARED).      )
23f60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
23f70 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70   pPager->pBackup
23f80 20 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68   || sqlite3Pcach
23f90 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  ePagecount(pPage
23fa0 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b  r->pPCache)>0 ){
23fb0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68  .      /* The sh
23fc0 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75  ared-lock has ju
23fd0 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64  st been acquired
23fe0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
23ff0 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61   file.      ** a
24000 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 6c 72  nd there are alr
24010 65 61 64 79 20 70 61 67 65 73 20 69 6e 20 74 68  eady pages in th
24020 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20  e cache (from a 
24030 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 2a  previous.      *
24040 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  * read or write 
24050 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43  transaction).  C
24060 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
24070 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
24080 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f    ** has been mo
24090 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20  dified.  If the 
240a0 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61  database has cha
240b0 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a  nged, flush the.
240c0 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a        ** cache..
240d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
240e0 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67  * Database chang
240f0 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20 62  es is detected b
24100 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20  y looking at 15 
24110 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a  bytes beginning.
24120 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73        ** at offs
24130 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66  et 24 into the f
24140 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20  ile.  The first 
24150 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79  4 of these 16 by
24160 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a  tes are.      **
24170 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65   a 32-bit counte
24180 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d  r that is increm
24190 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20  ented with each 
241a0 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20  change.  The.   
241b0 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65     ** other byte
241c0 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c  s change randoml
241d0 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65  y with each file
241e0 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20   change when.   
241f0 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73     ** a codec is
24200 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a   in use..      *
24210 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72  * .      ** Ther
24220 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67  e is a vanishing
24230 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20  ly small chance 
24240 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69  that a change wi
24250 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20  ll not be .     
24260 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54   ** detected.  T
24270 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20  he chance of an 
24280 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e 67  undetected chang
24290 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68  e is so small th
242a0 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63  at.      ** it c
242b0 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e  an be neglected.
242c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
242d0 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
242e0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
242f0 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20  bFileVers)];.   
24300 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50     sqlite3PagerP
24310 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
24320 20 30 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20   0);..      if( 
24330 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
24340 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
24350 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
24360 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
24370 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  iled;.      }.. 
24380 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
24390 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
243a0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   );.      if( pP
243b0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29  ager->dbSize>0 )
243c0 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  {.        IOTRAC
243d0 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64  E(("CKVERS %p %d
243e0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a  \n", pPager, siz
243f0 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
24400 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
24410 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
24420 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c  ager->fd, &dbFil
24430 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
24440 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a  FileVers), 24);.
24450 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
24460 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24470 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
24480 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ed;.        }.  
24490 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
244a0 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65     memset(dbFile
244b0 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Vers, 0, sizeof(
244c0 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
244d0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
244e0 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e   memcmp(pPager->
244f0 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
24500 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
24510 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29  bFileVers))!=0 )
24520 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
24530 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
24540 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
24550 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
24560 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
24570 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  | pPager->state=
24580 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
24590 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20  .  }.. failed:. 
245a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
245b0 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67  OK ){.    /* pag
245c0 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 61  er_unlock() is a
245d0 20 6e 6f 2d 6f 70 20 66 6f 72 20 65 78 63 6c 75   no-op for exclu
245e0 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 6e  sive mode and in
245f0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
24600 73 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f  s. */.    pager_
24610 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
24620 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
24630 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
24640 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
24650 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72   has reached zer
24660 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  o, rollback any 
24670 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
24680 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b  ction and unlock
24690 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a   the pager..**.*
246a0 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63  * Except, in loc
246b0 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
246c0 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20 69  IVE when there i
246d0 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a  s nothing to in.
246e0 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
246f0 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c  journal, the unl
24700 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f  ock is not perfo
24710 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20 69  rmed and there i
24720 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20  s.** nothing to 
24730 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69  rollback, so thi
24740 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
24750 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  o-op..*/ .static
24760 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
24770 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20  kIfUnused(Pager 
24780 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
24790 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65  (sqlite3PcacheRe
247a0 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
247b0 50 43 61 63 68 65 29 3d 3d 30 29 0a 20 20 20 26  PCache)==0).   &
247c0 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  & (!pPager->excl
247d0 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61  usiveMode || pPa
247e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e  ger->journalOff>
247f0 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 61 67  0) .  ){.    pag
24800 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
24810 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
24820 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 72 6f 70 20 61  .}../*.** Drop a
24830 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 63   page from the c
24840 61 63 68 65 20 75 73 69 6e 67 20 73 71 6c 69 74  ache using sqlit
24850 65 33 50 63 61 63 68 65 44 72 6f 70 28 29 2e 0a  e3PcacheDrop()..
24860 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 65  **.** If this me
24870 61 6e 73 20 74 68 65 72 65 20 61 72 65 20 6e 6f  ans there are no
24880 77 20 6e 6f 20 70 61 67 65 73 20 77 69 74 68 20  w no pages with 
24890 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
248a0 65 6d 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a  em, a rollback.*
248b0 2a 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  * occurs and the
248c0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
248d0 61 62 61 73 65 20 69 73 20 72 65 6d 6f 76 65 64  abase is removed
248e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
248f0 20 70 61 67 65 72 44 72 6f 70 50 61 67 65 28 44   pagerDropPage(D
24900 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50  bPage *pPg){.  P
24910 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
24920 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73 71  Pg->pPager;.  sq
24930 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
24940 70 50 67 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c  pPg);.  pagerUnl
24950 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67  ockIfUnused(pPag
24960 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  er);.}../*.** Ac
24970 71 75 69 72 65 20 61 20 72 65 66 65 72 65 6e 63  quire a referenc
24980 65 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  e to page number
24990 20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72 20 70   pgno in pager p
249a0 50 61 67 65 72 20 28 61 20 70 61 67 65 0a 2a 2a  Pager (a page.**
249b0 20 72 65 66 65 72 65 6e 63 65 20 68 61 73 20 74   reference has t
249c0 79 70 65 20 44 62 50 61 67 65 2a 29 2e 20 49 66  ype DbPage*). If
249d0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72   the requested r
249e0 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20  eference is .** 
249f0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74  successfully obt
24a00 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70  ained, it is cop
24a10 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61  ied to *ppPage a
24a20 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
24a30 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urned..**.** Thi
24a40 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  s function calls
24a50 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b   pagerSharedLock
24a60 28 29 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 53  () to obtain a S
24a70 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 0a 2a 2a  HARED lock on.**
24a80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
24a90 6c 65 20 69 66 20 73 75 63 68 20 61 20 6c 6f 63  le if such a loc
24aa0 6b 20 6f 72 20 67 72 65 61 74 65 72 20 69 73 20  k or greater is 
24ab0 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64  not already held
24ac0 2e 0a 2a 2a 20 54 68 69 73 20 6d 61 79 20 63 61  ..** This may ca
24ad0 75 73 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  use hot-journal 
24ae0 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 63 61  rollback or a ca
24af0 63 68 65 20 70 75 72 67 65 2e 20 53 65 65 20 63  che purge. See c
24b00 6f 6d 6d 65 6e 74 73 0a 2a 2a 20 61 62 6f 76 65  omments.** above
24b10 20 66 75 6e 63 74 69 6f 6e 20 70 61 67 65 72 53   function pagerS
24b20 68 61 72 65 64 4c 6f 63 6b 28 29 20 66 6f 72 20  haredLock() for 
24b30 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49  details..**.** I
24b40 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
24b50 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
24b60 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74  in the cache, it
24b70 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a   is returned. .*
24b80 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e  * Otherwise, a n
24b90 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69  ew page object i
24ba0 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
24bb0 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64  populated with d
24bc0 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d  ata.** read from
24bd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
24be0 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65  le. In some case
24bf0 73 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f  s, the pcache mo
24c00 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f  dule may.** choo
24c10 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61  se not to alloca
24c20 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62  te a new page ob
24c30 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75  ject and may reu
24c40 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a  se an existing.*
24c50 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f  * object with no
24c60 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
24c70 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  erences..**.** T
24c80 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70  he extra data ap
24c90 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65  pended to a page
24ca0 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
24cb0 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20  alized to zeros 
24cc0 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69  the .** first ti
24cd0 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61  me a page is loa
24ce0 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  ded into memory.
24cf0 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71   If the page req
24d00 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c  uested is .** al
24d10 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63  ready in the cac
24d20 68 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  he when this fun
24d30 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
24d40 20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a   then the extra.
24d50 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20  ** data is left 
24d60 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74  as it was when t
24d70 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77  he page object w
24d80 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a  as last used..**
24d90 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
24da0 61 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61  ase image is sma
24db0 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  ller than the re
24dc0 71 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20  quested page or 
24dd0 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  if a .** non-zer
24de0 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73 73 65  o value is passe
24df0 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65  d as the noConte
24e00 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64  nt parameter and
24e10 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74   the .** request
24e20 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  ed page is not a
24e30 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e  lready stored in
24e40 20 74 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e   the cache, then
24e50 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64   no .** actual d
24e60 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e  isk read occurs.
24e70 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
24e80 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f  e memory image o
24e90 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69  f the .** page i
24ea0 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
24eb0 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a   all zeros. .**.
24ec0 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20  ** If noContent 
24ed0 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e  is true, it mean
24ee0 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
24ef0 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
24f00 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74  contents.** of t
24f10 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63  he page. This oc
24f20 63 75 72 73 20 69 6e 20 74 77 6f 20 73 65 70 65  curs in two sepe
24f30 72 61 74 65 20 73 63 65 6e 61 72 69 6f 73 3a 0a  rate scenarios:.
24f40 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20  **.**   a) When 
24f50 72 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c  reading a free-l
24f60 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 66 72  ist leaf page fr
24f70 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  om the database,
24f80 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20   and.**.**   b) 
24f90 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
24fa0 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
24fb0 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65   back and we nee
24fc0 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20  d to load.**    
24fd0 20 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74    a new page int
24fe0 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 70  o the cache to p
24ff0 6f 70 75 6c 61 74 65 20 77 69 74 68 20 74 68 65  opulate with the
25000 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20   data read.**   
25010 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65     from the save
25020 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  point journal..*
25030 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  *.** If noConten
25040 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  t is true, then 
25050 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e 65  the data returne
25060 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74  d is zeroed inst
25070 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20  ead of.** being 
25080 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
25090 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e  tabase. Addition
250a0 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63  ally, the bits c
250b0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
250c0 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72  to pgno in Pager
250d0 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74  .pInJournal (bit
250e0 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
250f0 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20  eady written to 
25100 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
25110 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61 67  ile) and the Pag
25120 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
25130 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
25140 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20   of any open.** 
25150 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73  savepoints are s
25160 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  et. This means i
25170 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  f the page is ma
25180 64 65 20 77 72 69 74 61 62 6c 65 20 61 74 20 61  de writable at a
25190 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74  ny.** point in t
251a0 68 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67  he future, using
251b0 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
251c0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2c 20  e3PagerWrite(), 
251d0 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  its contents.** 
251e0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72  will not be jour
251f0 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65  naled. This save
25200 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  s IO..**.** The 
25210 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
25220 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
25230 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
25240 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
25250 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
25260 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
25270 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
25280 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
25290 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
252a0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
252b0 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20  p().  Both this 
252c0 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b  routine and Look
252d0 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
252e0 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
252f0 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
25300 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
25310 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
25320 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
25330 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
25340 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
25350 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
25360 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a  hereas Lookup().
25370 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
25380 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
25390 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
253a0 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
253b0 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
253c0 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
253d0 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
253e0 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
253f0 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
25400 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b  y..** Since Look
25410 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20  up() never goes 
25420 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65  to disk, it neve
25430 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69  r has to deal wi
25440 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a  th locks.** or j
25450 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f  ournal files..*/
25460 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
25470 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65  rAcquire(.  Page
25480 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
25490 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65  /* The pager ope
254a0 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
254b0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
254c0 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
254d0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
254e0 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50  o fetch */.  DbP
254f0 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
25500 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e   /* Write a poin
25510 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
25520 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  here */.  int no
25530 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a  Content       /*
25540 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72   Do not bother r
25550 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66  eading content f
25560 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65  rom disk if true
25570 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a   */.){.  PgHdr *
25580 70 50 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  pPg = 0;.  int r
25590 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 73  c;..  assert( as
255a0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
255b0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
255c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
255d0 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
255e0 4b 20 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c  K .       || sql
255f0 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
25600 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
25610 68 65 29 3e 30 20 0a 20 20 20 20 20 20 20 7c 7c  he)>0 .       ||
25620 20 70 67 6e 6f 3d 3d 31 0a 20 20 29 3b 0a 0a 20   pgno==1.  );.. 
25630 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
25640 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32  page number is 2
25650 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ^31. Return SQLI
25660 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20  TE_CORRUPT if a 
25670 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  page.  ** number
25680 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
25690 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20  is, or zero, is 
256a0 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
256b0 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52    if( pgno>PAGER
256c0 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e  _MAX_PGNO || pgn
256d0 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
256e0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
256f0 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  er) ){.    retur
25700 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
25710 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
25720 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   Make sure we ha
25730 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63  ve not hit any c
25740 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a  ritical errors..
25750 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20    */ .  assert( 
25760 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a  pPager!=0 );.  *
25770 70 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 2f  ppPage = 0;..  /
25780 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
25790 20 66 69 72 73 74 20 70 61 67 65 20 61 63 63 65   first page acce
257a0 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61  ssed, then get a
257b0 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a   SHARED lock.  *
257c0 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  * on the databas
257d0 65 20 66 69 6c 65 2e 20 70 61 67 65 72 53 68 61  e file. pagerSha
257e0 72 65 64 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e  redLock() is a n
257f0 6f 2d 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61 20  o-op if .  ** a 
25800 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 69 73  database lock is
25810 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a 20   already held.. 
25820 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
25830 53 68 61 72 65 64 4c 6f 63 6b 28 70 50 61 67 65  SharedLock(pPage
25840 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
25850 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
25860 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
25870 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
25880 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
25890 4f 43 4b 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73  OCK );..  rc = s
258a0 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
258b0 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
258c0 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 26 70 50 67  e, pgno, 1, &pPg
258d0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
258e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 61  ITE_OK ){.    pa
258f0 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
25900 64 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  d(pPager);.    r
25910 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
25920 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
25930 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  o==pgno );.  ass
25940 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
25950 3d 3d 70 50 61 67 65 72 20 7c 7c 20 70 50 67 2d  ==pPager || pPg-
25960 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 20 20  >pPager==0 );.  
25970 69 66 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d  if( pPg->pPager=
25980 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
25990 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73   pager cache has
259a0 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70   created a new p
259b0 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74  age. Its content
259c0 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a   needs to .    *
259d0 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  * be initialized
259e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
259f0 20 6e 4d 61 78 3b 0a 20 20 20 20 50 41 47 45 52   nMax;.    PAGER
25a00 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d  _INCR(pPager->nM
25a10 69 73 73 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  iss);.    pPg->p
25a20 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
25a30 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
25a40 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
25a50 70 50 61 67 65 72 2c 20 26 6e 4d 61 78 29 3b 0a  pPager, &nMax);.
25a60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
25a70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
25a80 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
25a90 28 70 50 67 29 3b 0a 20 20 20 20 20 20 72 65 74  (pPg);.      ret
25aa0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
25ab0 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74     if( nMax<(int
25ac0 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c  )pgno || MEMDB |
25ad0 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  | noContent ){. 
25ae0 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
25af0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
25b00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
25b10 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
25b20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
25b30 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
25b40 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f    }.      if( no
25b50 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
25b60 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f     /* Failure to
25b70 20 73 65 74 20 74 68 65 20 62 69 74 73 20 69 6e   set the bits in
25b80 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62   the InJournal b
25b90 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65  it-vectors is be
25ba0 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  nign..        **
25bb0 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73   It merely means
25bc0 20 74 68 61 74 20 77 65 20 6d 69 67 68 74 20 64   that we might d
25bd0 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72  o some extra wor
25be0 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a  k to journal a .
25bf0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
25c00 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
25c10 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c  ed to be journal
25c20 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  ed.  Nevertheles
25c30 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20 20  s, be sure .    
25c40 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74      ** to test t
25c50 68 65 20 63 61 73 65 20 77 68 65 72 65 20 61 20  he case where a 
25c60 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63  malloc error occ
25c70 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
25c80 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20   to set .       
25c90 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62   ** a bit in a b
25ca0 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20  it vector..     
25cb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71     */.        sq
25cc0 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
25cd0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
25ce0 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
25cf0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
25d00 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45 53 54  {.          TEST
25d10 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c  ONLY( rc = ) sql
25d20 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
25d30 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
25d40 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
25d50 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
25d60 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
25d70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25d80 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20     TESTONLY( rc 
25d90 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69  = ) addToSavepoi
25da0 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
25db0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
25dc0 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
25dd0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
25de0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
25df0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
25e00 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
25e10 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67        memset(pPg
25e20 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->pData, 0, pPag
25e30 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
25e40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 49 4f 54       }.      IOT
25e50 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25  RACE(("ZERO %p %
25e60 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
25e70 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  no));.    }else{
25e80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
25e90 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
25ea0 65 72 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  er );.      rc =
25eb0 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29   readDbPage(pPg)
25ec0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
25ed0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25ee0 20 20 20 20 20 70 61 67 65 72 44 72 6f 70 50 61       pagerDropPa
25ef0 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ge(pPg);.       
25f00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
25f10 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66    }.    }.#ifdef
25f20 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
25f30 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
25f40 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
25f50 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
25f60 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
25f70 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
25f80 64 20 70 61 67 65 20 69 73 20 69 6e 20 74 68 65  d page is in the
25f90 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a   page cache. */.
25fa0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
25fb0 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20  Pager->nHit);.  
25fc0 7d 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70  }..  *ppPage = p
25fd0 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  Pg;.  return SQL
25fe0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
25ff0 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20   Acquire a page 
26000 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
26010 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
26020 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20  y cache.  Do.** 
26030 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67  not read the pag
26040 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65  e from disk.  Re
26050 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
26060 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f  o the page,.** o
26070 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20  r 0 if the page 
26080 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e  is not in cache.
26090 20 41 6c 73 6f 2c 20 72 65 74 75 72 6e 20 30 20   Also, return 0 
260a0 69 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 72  if the .** pager
260b0 20 69 73 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c   is in PAGER_UNL
260c0 4f 43 4b 20 73 74 61 74 65 20 77 68 65 6e 20 74  OCK state when t
260d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
260e0 63 61 6c 6c 65 64 2c 0a 2a 2a 20 6f 72 20 69 66  called,.** or if
260f0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
26100 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   an error state 
26110 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
26120 45 5f 46 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  E_FULL..**.** Se
26130 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
26140 67 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64  gerGet().  The d
26150 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
26160 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
26170 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67  * and sqlite3Pag
26180 65 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20  erGet() is that 
26190 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74  _get() will go t
261a0 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72  o the disk and r
261b0 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61  ead.** in the pa
261c0 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ge if the page i
261d0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e  s not already in
261e0 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f   cache.  This ro
261f0 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
26200 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67   NULL if the pag
26210 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
26220 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49  e or if a disk I
26230 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73  /O error .** has
26240 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a   ever happened..
26250 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74  */.DbPage *sqlit
26260 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61  e3PagerLookup(Pa
26270 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
26280 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
26290 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 61 73 73   *pPg = 0;.  ass
262a0 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
262b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
262c0 21 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 70  !=0 );..  if( (p
262d0 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
262e0 47 45 52 5f 55 4e 4c 4f 43 4b 29 0a 20 20 20 26  GER_UNLOCK).   &
262f0 26 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  & (pPager->errCo
26300 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  de==SQLITE_OK ||
26310 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
26320 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 0a 20  ==SQLITE_FULL). 
26330 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
26340 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
26350 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
26360 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20 20 7d 0a  , 0, &pPg);.  }.
26370 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d  .  return pPg;.}
26380 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
26390 61 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  a page reference
263a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
263b0 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
263c0 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
263d0 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68  drop to zero, th
263e0 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69  en the.** page i
263f0 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c  s added to the L
26400 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61  RU list.  When a
26410 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ll references to
26420 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72   all pages.** ar
26430 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f  e released, a ro
26440 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e  llback occurs an
26450 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
26460 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a  e database is.**
26470 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69   removed..*/.voi
26480 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  d sqlite3PagerUn
26490 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  ref(DbPage *pPg)
264a0 7b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  {.  if( pPg ){. 
264b0 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
264c0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
264d0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
264e0 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20  eRelease(pPg);. 
264f0 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66     pagerUnlockIf
26500 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a  Unused(pPager);.
26510 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
26520 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
26530 20 66 69 6c 65 20 68 61 73 20 61 6c 72 65 61 64   file has alread
26540 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 65  y been opened, e
26550 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 2a  nsure that the.*
26560 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  * sub-journal fi
26570 6c 65 20 69 73 20 6f 70 65 6e 20 74 6f 6f 2e 20  le is open too. 
26580 49 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  If the main jour
26590 6e 61 6c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c  nal is not open,
265a0 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
265b0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
265c0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
265d0 20 72 65 74 75 72 6e 65 64 20 69 66 20 65 76 65   returned if eve
265e0 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63  rything goes acc
265f0 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20  ording to plan. 
26600 0a 2a 2a 20 41 6e 20 53 51 4c 49 54 45 5f 49 4f  .** An SQLITE_IO
26610 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f  ERR_XXX error co
26620 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
26630 66 20 61 20 63 61 6c 6c 20 74 6f 20 0a 2a 2a 20  f a call to .** 
26640 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20  sqlite3OsOpen() 
26650 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
26660 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72   int openSubJour
26670 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
26680 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
26690 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
266a0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
266b0 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70  fd) && !isOpen(p
266c0 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
266d0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
266e0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
266f0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
26700 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d  EMORY || pPager-
26710 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b  >subjInMemory ){
26720 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65  .      sqlite3Me
26730 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61  mJournalOpen(pPa
26740 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20  ger->sjfd);.    
26750 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
26760 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  = pagerOpentemp(
26770 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
26780 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45  sjfd, SQLITE_OPE
26790 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20  N_SUBJOURNAL);. 
267a0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
267b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
267c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
267d0 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74  called at the st
267e0 61 72 74 20 6f 66 20 65 76 65 72 79 20 77 72 69  art of every wri
267f0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te transaction..
26800 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c  ** There must al
26810 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52  ready be a RESER
26820 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
26830 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
26840 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77  abase .** file w
26850 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
26860 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
26870 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
26880 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
26890 72 20 70 50 61 67 65 72 20 61 6e 64 20 77 72 69  r pPager and wri
268a0 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61  te a journal hea
268b0 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74  der.** to the st
268c0 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68  art of it. If th
268d0 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
268e0 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20  avepoints, open 
268f0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
26900 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73  ** as well. This
26910 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
26920 79 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  y used when the 
26930 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
26940 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64  being .** opened
26950 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c   to write a roll
26960 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74  back log for a t
26970 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69  ransaction. It i
26980 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77  s not used .** w
26990 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f  hen opening a ho
269a0 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  t journal file t
269b0 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a  o roll it back..
269c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
269d0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72  rnal file is alr
269e0 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74  eady open (as it
269f0 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75   may be in exclu
26a00 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74  sive mode),.** t
26a10 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
26a20 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20 61 20  n just writes a 
26a30 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
26a40 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
26a50 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70  he.** already op
26a60 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  en file. .**.** 
26a70 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  Whether or not t
26a80 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
26a90 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69  is opened by thi
26aa0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a  s function, the.
26ab0 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  ** Pager.pInJour
26ac0 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72 75 63  nal bitvec struc
26ad0 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
26ae0 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
26af0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
26b00 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
26b10 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65  ssful. Otherwise
26b20 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  , return .** SQL
26b30 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65  ITE_NOMEM if the
26b40 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f   attempt to allo
26b50 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f  cate Pager.pInJo
26b60 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20  urnal fails, or 
26b70 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  .** an IO error 
26b80 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20  code if opening 
26b90 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a  or writing the j
26ba0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c  ournal file fail
26bb0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
26bc0 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
26bd0 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
26be0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
26bf0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
26c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c10 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
26c20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
26c30 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
26c40 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20  pPager->pVfs;   
26c50 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
26c60 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f  f vfs pointer */
26c70 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
26c80 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
26c90 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61  _RESERVED );.  a
26ca0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
26cb0 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  seJournal );.  a
26cc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
26cd0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
26ce0 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61    .  /* If alrea
26cf0 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  dy in the error 
26d00 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63  state, this func
26d10 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
26d20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
26d30 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
26d40 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
26d50 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20  errCode;.  }..  
26d60 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 72  /* TODO: Is it r
26d70 65 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 74  eally possible t
26d80 6f 20 67 65 74 20 68 65 72 65 20 77 69 74 68 20  o get here with 
26d90 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 3f 20  dbSizeValid==0? 
26da0 49 66 20 6e 6f 74 2c 0a 20 20 2a 2a 20 74 68 65  If not,.  ** the
26db0 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72 50 61   call to PagerPa
26dc0 67 65 63 6f 75 6e 74 28 29 20 63 61 6e 20 62 65  gecount() can be
26dd0 20 72 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20   removed..  */. 
26de0 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
26df0 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d  r->dbSizeValid==
26e00 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  0 );.  sqlite3Pa
26e10 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
26e20 67 65 72 2c 20 30 29 3b 0a 0a 20 20 70 50 61 67  ger, 0);..  pPag
26e30 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
26e40 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
26e50 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53  eate(pPager->dbS
26e60 69 7a 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ize);.  if( pPag
26e70 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
26e80 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
26e90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
26ea0 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  }..  /* Open the
26eb0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
26ec0 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
26ed0 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 69 66  dy open. */.  if
26ee0 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
26ef0 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66  ->jfd) ){.    if
26f00 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
26f10 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
26f20 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
26f30 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
26f40 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70  MemJournalOpen(p
26f50 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
26f60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
26f70 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
26f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f90 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 74    /* VFS flags t
26fa0 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66  o open journal f
26fb0 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  ile */.        S
26fc0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
26fd0 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
26fe0 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20  _CREATE|.       
26ff0 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   (pPager->tempFi
27000 6c 65 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20  le ? .          
27010 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c  (SQLITE_OPEN_DEL
27020 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54  ETEONCLOSE|SQLIT
27030 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
27040 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20 20 20 20  NAL):.          
27050 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  (SQLITE_OPEN_MAI
27060 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20  N_JOURNAL).     
27070 20 20 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c     );.#ifdef SQL
27080 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
27090 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 72 63  C_WRITE.      rc
270a0 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61   = sqlite3Journa
270b0 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20 20  lOpen(.         
270c0 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a   pVfs, pPager->z
270d0 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
270e0 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e  >jfd, flags, jrn
270f0 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
27100 65 72 29 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c  er).      );.#el
27110 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  se.      rc = sq
27120 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
27130 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
27140 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
27150 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64   flags, 0);.#end
27160 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  if.    }.    ass
27170 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
27180 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
27190 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 7d  ger->jfd) );.  }
271a0 0a 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  ...  /* Write th
271b0 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
271c0 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f  header to the jo
271d0 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f  urnal file and o
271e0 70 65 6e 20 0a 20 20 2a 2a 20 74 68 65 20 73 75  pen .  ** the su
271f0 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  b-journal if nec
27200 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69  essary..  */.  i
27210 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27220 20 29 7b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a   ){.    /* TODO:
27230 20 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66   Check if all of
27240 20 74 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c   these are reall
27250 79 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  y required. */. 
27260 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69     pPager->dbOri
27270 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  gSize = pPager->
27280 64 62 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67  dbSize;.    pPag
27290 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
272a0 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ed = 0;.    pPag
272b0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
272c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
272d0 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ec = 0;.    pPag
272e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
272f0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
27300 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
27310 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
27320 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 72  alHdr = 0;.    r
27330 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
27340 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  Hdr(pPager);.  }
27350 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
27360 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
27370 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  nSavepoint ){.  
27380 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f    rc = openSubJo
27390 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
273a0 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51   }..  if( rc!=SQ
273b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
273c0 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
273d0 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
273e0 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61  ournal);.    pPa
273f0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
27400 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
27410 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  n rc;.}../*.** B
27420 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61  egin a write-tra
27430 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
27440 73 70 65 63 69 66 69 65 64 20 70 61 67 65 72 20  specified pager 
27450 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a  object. If a .**
27460 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
27470 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
27480 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73  een opened, this
27490 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
274a0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  o-op..**.** If t
274b0 68 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65  he exFlag argume
274c0 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  nt is false, the
274d0 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61  n acquire at lea
274e0 73 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a  st a RESERVED.**
274f0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
27500 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65  abase file. If e
27510 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74  xFlag is true, t
27520 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c  hen acquire at l
27530 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55  east.** an EXCLU
27540 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75  SIVE lock. If su
27550 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72  ch a lock is alr
27560 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f  eady held, no lo
27570 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69  cking .** functi
27580 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c  ons need be call
27590 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ed..**.** If thi
275a0 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f  s is not a tempo
275b0 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72  rary or in-memor
275c0 79 20 66 69 6c 65 20 61 6e 64 2c 20 74 68 65 20  y file and, the 
275d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
275e0 0a 2a 2a 20 6f 70 65 6e 65 64 20 69 66 20 69 74  .** opened if it
275f0 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
27600 72 65 61 64 79 2e 20 46 6f 72 20 61 20 74 65 6d  ready. For a tem
27610 70 6f 72 61 72 79 20 66 69 6c 65 2c 20 74 68 65  porary file, the
27620 20 6f 70 65 6e 69 6e 67 20 0a 2a 2a 20 6f 66 20   opening .** of 
27630 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
27640 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
27650 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e 20 61  il there is an a
27660 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 0a 2a  ctual need to .*
27670 2a 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  * write to the j
27680 6f 75 72 6e 61 6c 2e 20 54 4f 44 4f 3a 20 57 68  ournal. TODO: Wh
27690 79 20 68 61 6e 64 6c 65 20 74 65 6d 70 6f 72 61  y handle tempora
276a0 72 79 20 66 69 6c 65 73 20 64 69 66 66 65 72 65  ry files differe
276b0 6e 74 6c 79 3f 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ntly?.**.** If t
276c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
276d0 69 73 20 6f 70 65 6e 65 64 20 28 6f 72 20 69 66  is opened (or if
276e0 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f   it is already o
276f0 70 65 6e 29 2c 20 74 68 65 6e 20 61 0a 2a 2a 20  pen), then a.** 
27700 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
27710 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
27720 20 73 74 61 72 74 20 6f 66 20 69 74 2e 0a 2a 2a   start of it..**
27730 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49  .** If the subjI
27740 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74  nMemory argument
27750 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
27760 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e  en any sub-journ
27770 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74  al opened.** wit
27780 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
27790 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65  tion will be ope
277a0 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d  ned as an in-mem
277b0 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a  ory file. This.*
277c0 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20  * has no effect 
277d0 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  if the sub-journ
277e0 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  al is already op
277f0 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79 20  ened (as it may 
27800 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69  be when.** runni
27810 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
27820 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65 20  mode) or if the 
27830 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73  transaction does
27840 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a   not require a.*
27850 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49  * sub-journal. I
27860 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f  f the subjInMemo
27870 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a  ry argument is z
27880 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65  ero, then any re
27890 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f  quired.** sub-jo
278a0 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65  urnal is impleme
278b0 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69  nted in-memory i
278c0 66 20 70 50 61 67 65 72 20 69 73 20 61 6e 20 69  f pPager is an i
278d0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
278e0 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20  e, .** or using 
278f0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
27900 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
27910 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42  nt sqlite3PagerB
27920 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  egin(Pager *pPag
27930 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20  er, int exFlag, 
27940 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  int subjInMemory
27950 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
27960 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
27970 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
27980 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
27990 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a  ;.  pPager->subj
279a0 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73  InMemory = (u8)s
279b0 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 20 20 69  ubjInMemory;.  i
279c0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
279d0 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  ==PAGER_SHARED )
279e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
279f0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
27a00 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
27a10 74 28 20 21 4d 45 4d 44 42 20 26 26 20 21 70 50  t( !MEMDB && !pP
27a20 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
27a30 3b 0a 0a 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e  ;..    /* Obtain
27a40 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
27a50 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
27a60 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78   file. If the ex
27a70 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20  Flag parameter. 
27a80 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74     ** is true, t
27a90 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  hen immediately 
27aa0 75 70 67 72 61 64 65 20 74 68 69 73 20 74 6f 20  upgrade this to 
27ab0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
27ac0 6b 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 62 75  k. The.    ** bu
27ad0 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
27ae0 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20  ack can be used 
27af0 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74  when upgrading t
27b00 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a  o the EXCLUSIVE.
27b10 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74      ** lock, but
27b20 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e   not when obtain
27b30 69 6e 67 20 74 68 65 20 52 45 53 45 52 56 45 44  ing the RESERVED
27b40 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   lock..    */.  
27b50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
27b60 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
27b70 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b   RESERVED_LOCK);
27b80 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
27b90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27ba0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
27bb0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a  PAGER_RESERVED;.
27bc0 20 20 20 20 20 20 69 66 28 20 65 78 46 6c 61 67        if( exFlag
27bd0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
27be0 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
27bf0 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
27c00 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
27c10 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
27c20 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75 69 72  /* If the requir
27c30 65 64 20 6c 6f 63 6b 73 20 77 65 72 65 20 73 75  ed locks were su
27c40 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69  ccessfully obtai
27c50 6e 65 64 2c 20 6f 70 65 6e 20 74 68 65 20 6a 6f  ned, open the jo
27c60 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
27c70 65 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20  e and write the 
27c80 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
27c90 61 64 65 72 20 74 6f 20 69 74 2e 0a 20 20 20 20  ader to it..    
27ca0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
27cb0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
27cc0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20  er->useJournal. 
27cd0 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
27ce0 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
27cf0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
27d00 46 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  F .    ){.      
27d10 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
27d20 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
27d30 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
27d40 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
27d50 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72  ->jfd) && pPager
27d60 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
27d70 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
27d80 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68 65 20  appens when the 
27d90 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 78 63  pager was in exc
27da0 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
27db0 64 65 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20  de the last.    
27dc0 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64 20  ** time a (read 
27dd0 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73 61  or write) transa
27de0 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73  ction was succes
27df0 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64  sfully concluded
27e00 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20  .    ** by this 
27e10 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74  connection. Inst
27e20 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20  ead of deleting 
27e30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
27e40 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20   it was .    ** 
27e50 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 65 69  kept open and ei
27e60 74 68 65 72 20 77 61 73 20 74 72 75 6e 63 61 74  ther was truncat
27e70 65 64 20 74 6f 20 30 20 62 79 74 65 73 20 6f 72  ed to 0 bytes or
27e80 20 69 74 73 20 68 65 61 64 65 72 20 77 61 73 0a   its header was.
27e90 20 20 20 20 2a 2a 20 6f 76 65 72 77 72 69 74 74      ** overwritt
27ea0 65 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  en with zeros.. 
27eb0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
27ec0 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d  ( pPager->nRec==
27ed0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
27ee0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
27ef0 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ize==0 );.    as
27f00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
27f10 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
27f20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
27f30 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
27f40 72 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  r);.  }..  PAGER
27f50 54 52 41 43 45 28 28 22 54 52 41 4e 53 41 43 54  TRACE(("TRANSACT
27f60 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ION %d\n", PAGER
27f70 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
27f80 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
27f90 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20  pPager->jfd) || 
27fa0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
27fb0 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49  ff>0 || rc!=SQLI
27fc0 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 72  TE_OK );.  if( r
27fd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
27fe0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
27ff0 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
28000 29 3b 0a 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65  );.    /* Ignore
28010 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 74 68   any IO error th
28020 61 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  at occurs within
28030 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
28040 61 63 74 69 6f 6e 28 29 2e 20 54 68 65 0a 20 20  action(). The.  
28050 20 20 2a 2a 20 70 75 72 70 6f 73 65 20 6f 66 20    ** purpose of 
28060 74 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20  this call is to 
28070 72 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e  reset the intern
28080 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  al state of the 
28090 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 73 75 62  pager.    ** sub
280a0 2d 73 79 73 74 65 6d 2e 20 49 74 20 64 6f 65 73  -system. It does
280b0 6e 27 74 20 6d 61 74 74 65 72 20 69 66 20 74 68  n't matter if th
280c0 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69  e journal-file i
280d0 73 20 6e 6f 74 20 70 72 6f 70 65 72 6c 79 0a 20  s not properly. 
280e0 20 20 20 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 20     ** finalized 
280f0 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 28 73  at this point (s
28100 69 6e 63 65 20 69 74 20 69 73 20 6e 6f 74 20 61  ince it is not a
28110 20 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66   valid journal f
28120 69 6c 65 20 61 6e 79 77 61 79 29 2e 0a 20 20 20  ile anyway)..   
28130 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 65 6e   */.    pager_en
28140 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
28150 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  ager, 0);.  }.  
28160 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
28170 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c  .** Mark a singl
28180 65 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  e data page as w
28190 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61  riteable. The pa
281a0 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
281b0 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20  to the .** main 
281c0 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a  journal or sub-j
281d0 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72  ournal as requir
281e0 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ed. If the page 
281f0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  is written into.
28200 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  ** one of the jo
28210 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72  urnals, the corr
28220 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
28230 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20   set in the .** 
28240 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
28250 20 62 69 74 76 65 63 20 61 6e 64 20 74 68 65 20   bitvec and the 
28260 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
28270 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76  InSavepoint bitv
28280 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70  ecs.** of any op
28290 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73  en savepoints as
282a0 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f   appropriate..*/
282b0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
282c0 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70  r_write(PgHdr *p
282d0 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61  Pg){.  void *pDa
282e0 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
282f0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
28300 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
28310 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
28320 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  E_OK;..  /* Chec
28330 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a  k for errors.  *
28340 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
28350 65 72 72 43 6f 64 65 20 29 7b 20 0a 20 20 20 20  errCode ){ .    
28360 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
28370 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66  rrCode;.  }.  if
28380 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  ( pPager->readOn
28390 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ly ){.    return
283a0 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20   SQLITE_PERM;.  
283b0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  }..  assert( !pP
283c0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
283d0 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45  );..  CHECK_PAGE
283e0 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72  (pPg);..  /* Mar
283f0 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
28400 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67  rty.  If the pag
28410 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
28420 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  en written.  ** 
28430 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  to the journal t
28440 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72  hen we can retur
28450 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  n right away..  
28460 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  */.  sqlite3Pcac
28470 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29  heMakeDirty(pPg)
28480 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e 4a 6f  ;.  if( pageInJo
28490 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21 73  urnal(pPg) && !s
284a0 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
284b0 70 50 67 29 20 29 7b 0a 20 20 20 20 70 50 61 67  pPg) ){.    pPag
284c0 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d  er->dbModified =
284d0 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20   1;.  }else{..  
284e0 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
284f0 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e  his far, it mean
28500 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
28510 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
28520 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ** written to th
28530 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
28540 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65  urnal or the cke
28550 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a  ckpoint journal.
28560 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a      ** or both..
28570 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69      **.    ** Fi
28580 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65  rst check to see
28590 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61   that the transa
285a0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78  ction journal ex
285b0 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20  ists and.    ** 
285c0 63 72 65 61 74 65 20 69 74 20 69 66 20 69 74 20  create it if it 
285d0 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f  does not..    */
285e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
285f0 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
28600 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  R_UNLOCK );.    
28610 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
28620 72 42 65 67 69 6e 28 70 50 61 67 65 72 2c 20 30  rBegin(pPager, 0
28630 2c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e  , pPager->subjIn
28640 4d 65 6d 6f 72 79 29 3b 0a 20 20 20 20 69 66 28  Memory);.    if(
28650 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28660 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
28670 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
28680 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
28690 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
286a0 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21 69  ED );.    if( !i
286b0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
286c0 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73  d) && pPager->us
286d0 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20  eJournal.       
286e0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
286f0 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
28700 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
28710 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
28720 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
28730 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
28740 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28750 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
28760 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
28770 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31  ->dbModified = 1
28780 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20  ;.  .    /* The 
28790 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
287a0 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61  nal now exists a
287b0 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45 53  nd we have a RES
287c0 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20  ERVED or an.    
287d0 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
287e0 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  k on the main da
287f0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72  tabase file.  Wr
28800 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
28810 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74  page to.    ** t
28820 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
28830 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20  ournal if it is 
28840 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64  not there alread
28850 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
28860 28 20 21 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  ( !pageInJournal
28870 28 70 50 67 29 20 26 26 20 69 73 4f 70 65 6e 28  (pPg) && isOpen(
28880 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
28890 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70        if( pPg->p
288a0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
288b0 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  rigSize ){.     
288c0 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20     u32 cksum;.  
288d0 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
288e0 61 32 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  a2;..        /* 
288f0 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  We should never 
28900 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
28910 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61  rnal file the pa
28920 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ge that.        
28930 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
28940 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20  database locks. 
28950 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
28960 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20  ssert verifies. 
28970 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
28980 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20  e do not. */.   
28990 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
289a0 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  ->pgno!=PAGER_MJ
289b0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
289c0 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 32 28  .        CODEC2(
289d0 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
289e0 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74  Pg->pgno, 7, ret
289f0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
28a00 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  , pData2);.     
28a10 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72     cksum = pager
28a20 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28  _cksum(pPager, (
28a30 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20  u8*)pData2);.   
28a40 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
28a50 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
28a60 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
28a70 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f  alOff, pPg->pgno
28a80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
28a90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28aa0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
28ab0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
28ac0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61  ager->jfd, pData
28ad0 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
28ae0 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
28af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b00 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
28b10 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20 20  alOff + 4);.    
28b20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
28b30 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67  urnalOff += pPag
28b40 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b 0a  er->pageSize+4;.
28b50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28b60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28b70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
28b80 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
28b90 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  s(pPager->jfd, p
28ba0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
28bb0 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20  f, cksum);.     
28bc0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
28bd0 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20  rnalOff += 4;.  
28be0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28bf0 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25  IOTRACE(("JOUT %
28c00 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  p %d %lld %d\n",
28c10 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
28c20 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  no, .           
28c30 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
28c40 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72  urnalOff, pPager
28c50 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20  ->pageSize));.  
28c60 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
28c70 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
28c80 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20  ritej_count);.  
28c90 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
28ca0 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  (("JOURNAL %d pa
28cb0 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
28cc0 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
28cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41  .             PA
28ce0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
28cf0 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20  Pg->pgno, .     
28d00 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66          ((pPg->f
28d10 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
28d20 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65  SYNC)?1:0), page
28d30 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
28d40 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  );..        /* E
28d50 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20  ven if an IO or 
28d60 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f  diskfull error o
28d70 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 6a 6f  ccurred while jo
28d80 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20  urnalling the.  
28d90 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
28da0 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65   the block above
28db0 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73  , set the need-s
28dc0 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65  ync flag for the
28dd0 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a   page..        *
28de0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65  * Otherwise, whe
28df0 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
28e00 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
28e10 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20  , the logic in. 
28e20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62 61         ** playba
28e30 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69  ck_one_page() wi
28e40 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68  ll think that th
28e50 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
28e60 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20 20  be restored.    
28e70 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61      ** in the da
28e80 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64  tabase file. And
28e90 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   if an IO error 
28ea0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69  occurs while doi
28eb0 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a  ng so,.        *
28ec0 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f  * then corruptio
28ed0 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20  n may follow..  
28ee0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
28ef0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
28f00 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
28f10 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
28f20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
28f30 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
28f40 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
28f50 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
28f60 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20      /* An error 
28f70 68 61 73 20 6f 63 63 75 72 72 65 64 20 77 72 69  has occurred wri
28f80 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72  ting to the jour
28f90 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20  nal file. The . 
28fa0 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61         ** transa
28fb0 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f  ction will be ro
28fc0 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68 65  lled back by the
28fd0 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20   layer above..  
28fe0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
28ff0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29000 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
29010 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
29020 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 50     }..        pP
29030 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20  ager->nRec++;.  
29040 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
29050 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
29060 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  !=0 );.        r
29070 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
29080 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
29090 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
290a0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  no);.        tes
290b0 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
290c0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
290d0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
290e0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  QLITE_OK || rc==
290f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
29100 20 20 20 20 20 20 20 20 72 63 20 7c 3d 20 61 64          rc |= ad
29110 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
29120 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
29130 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
29140 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29150 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  K ){.          a
29160 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
29170 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
29180 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
29190 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
291a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
291b0 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
291c0 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21 70  nalStarted && !p
291d0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
291e0 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
291f0 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
29200 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
29210 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
29220 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
29230 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45    }.        PAGE
29240 52 54 52 41 43 45 28 28 22 41 50 50 45 4e 44 20  RTRACE(("APPEND 
29250 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
29260 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
29270 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
29280 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
29290 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  >pgno,.         
292a0 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
292b0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
292c0 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20  NC)?1:0)));.    
292d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
292e0 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
292f0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ment journal is 
29300 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
29310 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a  e is not in it,.
29320 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74      ** then writ
29330 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
29340 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  ge to the statem
29350 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f  ent journal.  No
29360 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  te that.    ** t
29370 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
29380 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66  rnal format diff
29390 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ers from the sta
293a0 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f  ndard journal fo
293b0 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74  rmat.    ** in t
293c0 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65  hat it omits the
293d0 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74   checksums and t
293e0 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a  he header..    *
293f0 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52 65  /.    if( subjRe
29400 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
29410 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75  ){.      rc = su
29420 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
29430 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
29440 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61  /* Update the da
29450 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20  tabase size and 
29460 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61  return..  */.  a
29470 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
29480 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
29490 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ED );.  if( pPag
294a0 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e  er->dbSize<pPg->
294b0 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  pgno ){.    pPag
294c0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67  er->dbSize = pPg
294d0 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65  ->pgno;.  }.  re
294e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
294f0 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61  * Mark a data pa
29500 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e  ge as writeable.
29510 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   This routine mu
29520 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  st be called bef
29530 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63  ore .** making c
29540 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65  hanges to a page
29550 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  . The caller mus
29560 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75  t check the retu
29570 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20  rn value .** of 
29580 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
29590 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74  d be careful not
295a0 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 79 20 70   to change any p
295b0 61 67 65 20 64 61 74 61 20 75 6e 6c 65 73 73 20  age data unless 
295c0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
295d0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
295e0 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  OK..**.** The di
295f0 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
29600 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
29610 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65 28 29  nd pager_write()
29620 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a   is that this.**
29630 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64   function also d
29640 65 61 6c 73 20 77 69 74 68 20 74 68 65 20 73 70  eals with the sp
29650 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65  ecial case where
29660 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73   2 or more pages
29670 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e  .** fit on a sin
29680 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  gle disk sector.
29690 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c   In this case al
296a0 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61  l co-resident pa
296b0 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65  ges.** must have
296c0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
296d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
296e0 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
296f0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
29700 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51  error occurs, SQ
29710 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e  LITE_NOMEM or an
29720 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
29730 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 73  s returned.** as
29740 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 4f 74   appropriate. Ot
29750 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
29760 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
29770 65 33 50 61 67 65 72 57 72 69 74 65 28 44 62 50  e3PagerWrite(DbP
29780 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20  age *pDbPage){. 
29790 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
297a0 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70  _OK;..  PgHdr *p
297b0 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  Pg = pDbPage;.  
297c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
297d0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50  pPg->pPager;.  P
297e0 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74  gno nPagePerSect
297f0 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65  or = (pPager->se
29800 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d  ctorSize/pPager-
29810 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69  >pageSize);..  i
29820 66 28 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f  f( nPagePerSecto
29830 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  r>1 ){.    Pgno 
29840 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20  nPageCount;     
29850 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
29860 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
29870 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
29880 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20  /.    Pgno pg1; 
29890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298a0 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66  /* First page of
298b0 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
298c0 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a  is located on. *
298d0 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b  /.    int nPage;
298e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
29900 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  es starting at p
29910 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f  g1 to journal */
29920 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20  .    int ii;    
29930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29940 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
29950 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  /.    int needSy
29960 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nc = 0;         
29970 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 70  /* True if any p
29980 61 67 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45  age has PGHDR_NE
29990 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20  ED_SYNC */..    
299a0 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74  /* Set the doNot
299b0 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e 20  Sync flag to 1. 
299c0 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
299d0 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  we cannot allow 
299e0 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  a journal.    **
299f0 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72   header to be wr
29a00 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68  itten between th
29a10 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65  e pages journale
29a20 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
29a30 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  on..    */.    a
29a40 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
29a50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
29a60 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d  ger->doNotSync==
29a70 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
29a80 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a  >doNotSync = 1;.
29a90 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69  .    /* This tri
29aa0 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  ck assumes that 
29ab0 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69  both the page-si
29ac0 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69  ze and sector-si
29ad0 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e  ze are.    ** an
29ae0 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f   integer power o
29af0 66 20 32 2e 20 49 74 20 73 65 74 73 20 76 61 72  f 2. It sets var
29b00 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65  iable pg1 to the
29b10 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20   identifier.    
29b20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
29b30 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74  page of the sect
29b40 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65  or pPg is locate
29b50 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  d on..    */.   
29b60 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67   pg1 = ((pPg->pg
29b70 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50  no-1) & ~(nPageP
29b80 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31  erSector-1)) + 1
29b90 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  ;..    sqlite3Pa
29ba0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
29bb0 67 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61  ger, (int *)&nPa
29bc0 67 65 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69 66  geCount);.    if
29bd0 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67  ( pPg->pgno>nPag
29be0 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  eCount ){.      
29bf0 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67  nPage = (pPg->pg
29c00 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20  no - pg1)+1;.   
29c10 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b   }else if( (pg1+
29c20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31  nPagePerSector-1
29c30 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a  )>nPageCount ){.
29c40 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50        nPage = nP
29c50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a  ageCount+1-pg1;.
29c60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29c70 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65   nPage = nPagePe
29c80 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20  rSector;.    }. 
29c90 20 20 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e     assert(nPage>
29ca0 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70  0);.    assert(p
29cb0 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  g1<=pPg->pgno);.
29cc0 20 20 20 20 61 73 73 65 72 74 28 28 70 67 31 2b      assert((pg1+
29cd0 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f  nPage)>pPg->pgno
29ce0 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  );..    for(ii=0
29cf0 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63  ; ii<nPage && rc
29d00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b  ==SQLITE_OK; ii+
29d10 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  +){.      Pgno p
29d20 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20  g = pg1+ii;.    
29d30 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a    PgHdr *pPage;.
29d40 20 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70 50        if( pg==pP
29d50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69  g->pgno || !sqli
29d60 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
29d70 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
29d80 2c 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20 20  , pg) ){.       
29d90 20 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d   if( pg!=PAGER_M
29da0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
29db0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
29dc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
29dd0 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50  (pPager, pg, &pP
29de0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
29df0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29e00 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
29e10 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
29e20 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
29e30 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
29e40 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
29e50 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20  D_SYNC ){.      
29e60 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
29e70 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
29e80 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65      assert(pPage
29e90 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  r->needSync);.  
29ea0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
29eb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
29ec0 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
29ed0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
29ee0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
29ef0 6c 73 65 20 69 66 28 20 28 70 50 61 67 65 20 3d  lse if( (pPage =
29f00 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
29f10 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29 7b  ager, pg))!=0 ){
29f20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
29f30 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  ge->flags&PGHDR_
29f40 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20  NEED_SYNC ){.   
29f50 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20         needSync 
29f60 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
29f70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
29f80 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
29f90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
29fa0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 47      /* If the PG
29fb0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
29fc0 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e  ag is set for an
29fd0 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70  y of the nPage p
29fe0 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61  ages .    ** sta
29ff0 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68  rting at pg1, th
2a000 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  en it needs to b
2a010 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66  e set for all of
2a020 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20   them. Because. 
2a030 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f     ** writing to
2a040 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50   any of these nP
2a050 61 67 65 20 70 61 67 65 73 20 6d 61 79 20 64 61  age pages may da
2a060 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c  mage the others,
2a070 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72   the.    ** jour
2a080 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f  nal file must co
2a090 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63  ntain sync()ed c
2a0a0 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20  opies of all of 
2a0b0 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f  them.    ** befo
2a0c0 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63  re any of them c
2a0d0 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75  an be written ou
2a0e0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
2a0f0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
2a100 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20     if( needSync 
2a110 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2a120 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
2a130 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a  r->noSync==0 );.
2a140 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
2a150 69 69 3c 6e 50 61 67 65 20 26 26 20 6e 65 65 64  ii<nPage && need
2a160 53 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Sync; ii++){.   
2a170 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
2a180 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  e = pager_lookup
2a190 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29  (pPager, pg1+ii)
2a1a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
2a1b0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
2a1c0 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d   pPage->flags |=
2a1d0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
2a1e0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
2a1f0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
2a200 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
2a210 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
2a220 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65  sert(pPager->nee
2a230 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20  dSync);.    }.. 
2a240 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2a250 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20  r->doNotSync==1 
2a260 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
2a270 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20  oNotSync = 0;.  
2a280 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
2a290 70 61 67 65 72 5f 77 72 69 74 65 28 70 44 62 50  pager_write(pDbP
2a2a0 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
2a2b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2a2c0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
2a2d0 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e  he page given in
2a2e0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61   the argument wa
2a2f0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73  s previously pas
2a300 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  sed.** to sqlite
2a310 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 20 20  3PagerWrite().  
2a320 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
2a330 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  return TRUE if i
2a340 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68  t is ok.** to ch
2a350 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  ange the content
2a360 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   of the page..*/
2a370 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
2a380 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2a390 49 73 77 72 69 74 65 61 62 6c 65 28 44 62 50 61  Iswriteable(DbPa
2a3a0 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
2a3b0 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  rn pPg->flags&PG
2a3c0 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e  HDR_DIRTY;.}.#en
2a3d0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  dif../*.** A cal
2a3e0 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
2a3f0 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65  e tells the page
2a400 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  r that it is not
2a410 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a   necessary to.**
2a420 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72   write the infor
2a430 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70  mation on page p
2a440 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  Pg back to the d
2a450 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  isk, even though
2a460 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69  .** that page mi
2a470 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ght be marked as
2a480 20 64 69 72 74 79 2e 20 20 54 68 69 73 20 68 61   dirty.  This ha
2a490 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70  ppens, for examp
2a4a0 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  le, when.** the 
2a4b0 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 61 64  page has been ad
2a4c0 64 65 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66  ded as a leaf of
2a4d0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e   the freelist an
2a4e0 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74  d so its.** cont
2a4f0 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61  ent no longer ma
2a500 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tters..**.** The
2a510 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77   overlying softw
2a520 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20  are layer calls 
2a530 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
2a540 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74  n all of the dat
2a550 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65  a.** on the give
2a560 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64  n page is unused
2a570 2e 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b  . The pager mark
2a580 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  s the page as cl
2a590 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ean so.** that i
2a5a0 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77  t does not get w
2a5b0 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a  ritten to disk..
2a5c0 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77  **.** Tests show
2a5d0 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d   that this optim
2a5e0 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75 61 64  ization can quad
2a5f0 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20  ruple the speed 
2a600 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c  of large .** DEL
2a610 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  ETE operations..
2a620 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
2a630 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 50 67  agerDontWrite(Pg
2a640 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
2a650 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
2a660 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
2a670 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
2a680 52 5f 44 49 52 54 59 29 20 26 26 20 70 50 61 67  R_DIRTY) && pPag
2a690 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d  er->nSavepoint==
2a6a0 30 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52  0 ){.    PAGERTR
2a6b0 41 43 45 28 28 22 44 4f 4e 54 5f 57 52 49 54 45  ACE(("DONT_WRITE
2a6c0 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
2a6d0 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41  ", pPg->pgno, PA
2a6e0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
2a6f0 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43  .    IOTRACE(("C
2a700 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  LEAN %p %d\n", p
2a710 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
2a720 29 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  )).    pPg->flag
2a730 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f  s |= PGHDR_DONT_
2a740 57 52 49 54 45 3b 0a 23 69 66 64 65 66 20 53 51  WRITE;.#ifdef SQ
2a750 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
2a760 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
2a770 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
2a780 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
2a790 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2a7a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2a7b0 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e  lled to incremen
2a7c0 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
2a7d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a7e0 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e   .** change-coun
2a7f0 74 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61  ter, stored as a
2a800 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4-byte big-endi
2a810 61 6e 20 69 6e 74 65 67 65 72 20 73 74 61 72 74  an integer start
2a820 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74 65 20  ing at .** byte 
2a830 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74 68 65  offset 24 of the
2a840 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2a 0a   pager file..**.
2a850 2a 2a 20 49 66 20 74 68 65 20 69 73 44 69 72 65  ** If the isDire
2a860 63 74 20 66 6c 61 67 20 69 73 20 7a 65 72 6f 2c  ct flag is zero,
2a870 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 64 6f   then this is do
2a880 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 0a 2a  ne by calling .*
2a890 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  * sqlite3PagerWr
2a8a0 69 74 65 28 29 20 6f 6e 20 70 61 67 65 20 31 2c  ite() on page 1,
2a8b0 20 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20   then modifying 
2a8c0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2a8d0 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61 74 61  the.** page data
2a8e0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
2a8f0 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  he file will be 
2a900 75 70 64 61 74 65 64 20 77 68 65 6e 20 74 68 65  updated when the
2a910 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e   current.** tran
2a920 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
2a930 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tted..**.** The 
2a940 69 73 44 69 72 65 63 74 20 66 6c 61 67 20 6d 61  isDirect flag ma
2a950 79 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65  y only be non-ze
2a960 72 6f 20 69 66 20 74 68 65 20 6c 69 62 72 61 72  ro if the librar
2a970 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a 2a  y was compiled.*
2a980 2a 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  * with the SQLIT
2a990 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
2a9a0 57 52 49 54 45 20 6d 61 63 72 6f 20 64 65 66 69  WRITE macro defi
2a9b0 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
2a9c0 65 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72 65 63  e,.** if isDirec
2a9d0 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  t is non-zero, t
2a9e0 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
2a9f0 20 66 69 6c 65 20 69 73 20 75 70 64 61 74 65 64   file is updated
2aa00 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79 20   directly.** by 
2aa10 77 72 69 74 69 6e 67 20 61 6e 20 75 70 64 61 74  writing an updat
2aa20 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61  ed version of pa
2aa30 67 65 20 31 20 75 73 69 6e 67 20 61 20 63 61 6c  ge 1 using a cal
2aa40 6c 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71 6c  l to the .** sql
2aa50 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 66 75  ite3OsWrite() fu
2aa60 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
2aa70 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72  c int pager_incr
2aa80 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50  _changecounter(P
2aa90 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
2aaa0 74 20 69 73 44 69 72 65 63 74 4d 6f 64 65 29 7b  t isDirectMode){
2aab0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2aac0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 44 65 63  TE_OK;..  /* Dec
2aad0 6c 61 72 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  lare and initial
2aae0 69 7a 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74  ize constant int
2aaf0 65 67 65 72 20 27 69 73 44 69 72 65 63 74 27 2e  eger 'isDirect'.
2ab00 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 61 74 6f   If the.  ** ato
2ab10 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
2ab20 7a 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  zation is enable
2ab30 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c  d in this build,
2ab40 20 74 68 65 6e 20 69 73 44 69 72 65 63 74 0a 20   then isDirect. 
2ab50 20 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 69 7a   ** is initializ
2ab60 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ed to the value 
2ab70 70 61 73 73 65 64 20 61 73 20 74 68 65 20 69 73  passed as the is
2ab80 44 69 72 65 63 74 4d 6f 64 65 20 70 61 72 61 6d  DirectMode param
2ab90 65 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68 69  eter.  ** to thi
2aba0 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68 65  s function. Othe
2abb0 72 77 69 73 65 2c 20 69 74 20 69 73 20 61 6c 77  rwise, it is alw
2abc0 61 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e  ays set to zero.
2abd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69  .  **.  ** The i
2abe0 64 65 61 20 69 73 20 74 68 61 74 20 69 66 20 74  dea is that if t
2abf0 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
2ac00 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
2ac10 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61 62 6c 65 64  not.  ** enabled
2ac20 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
2ac30 2c 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63  , the compiler c
2ac40 61 6e 20 6f 6d 69 74 20 74 68 65 20 74 65 73 74  an omit the test
2ac50 73 20 6f 66 0a 20 20 2a 2a 20 27 69 73 44 69 72  s of.  ** 'isDir
2ac60 65 63 74 27 20 62 65 6c 6f 77 2c 20 61 73 20 77  ect' below, as w
2ac70 65 6c 6c 20 61 73 20 74 68 65 20 62 6c 6f 63 6b  ell as the block
2ac80 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 74 68 65   enclosed in the
2ac90 0a 20 20 2a 2a 20 22 69 66 28 20 69 73 44 69 72  .  ** "if( isDir
2aca0 65 63 74 20 29 22 20 63 6f 6e 64 69 74 69 6f 6e  ect )" condition
2acb0 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
2acc0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
2acd0 4d 49 43 5f 57 52 49 54 45 0a 20 20 63 6f 6e 73  MIC_WRITE.  cons
2ace0 74 20 69 6e 74 20 69 73 44 69 72 65 63 74 20 3d  t int isDirect =
2acf0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   0;.  assert( is
2ad00 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30 20 29 3b  DirectMode==0 );
2ad10 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2ad20 54 45 52 28 69 73 44 69 72 65 63 74 4d 6f 64 65  TER(isDirectMode
2ad30 29 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74  );.#else.  const
2ad40 20 69 6e 74 20 69 73 44 69 72 65 63 74 20 3d 20   int isDirect = 
2ad50 69 73 44 69 72 65 63 74 4d 6f 64 65 3b 0a 23 65  isDirectMode;.#e
2ad60 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
2ad70 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
2ad80 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
2ad90 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
2ada0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
2adb0 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
2adc0 65 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72  e>0 ){.    PgHdr
2add0 20 2a 70 50 67 48 64 72 3b 20 20 20 20 20 20 20   *pPgHdr;       
2ade0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65           /* Refe
2adf0 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20  rence to page 1 
2ae00 2a 2f 0a 20 20 20 20 75 33 32 20 63 68 61 6e 67  */.    u32 chang
2ae10 65 5f 63 6f 75 6e 74 65 72 3b 20 20 20 20 20 20  e_counter;      
2ae20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
2ae30 76 61 6c 75 65 20 6f 66 20 63 68 61 6e 67 65 2d  value of change-
2ae40 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20 2a 2f  counter field */
2ae50 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ..    assert( !p
2ae60 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2ae70 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
2ae80 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  ->fd) );..    /*
2ae90 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20   Open page 1 of 
2aea0 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69  the file for wri
2aeb0 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20  ting. */.    rc 
2aec0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
2aed0 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50  t(pPager, 1, &pP
2aee0 67 48 64 72 29 3b 0a 20 20 20 20 61 73 73 65 72  gHdr);.    asser
2aef0 74 28 20 70 50 67 48 64 72 3d 3d 30 20 7c 7c 20  t( pPgHdr==0 || 
2af00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
2af10 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65  ..    /* If page
2af20 20 6f 6e 65 20 77 61 73 20 66 65 74 63 68 65 64   one was fetched
2af30 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 61   successfully, a
2af40 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
2af50 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 6f   is not.    ** o
2af60 70 65 72 61 74 69 6e 67 20 69 6e 20 64 69 72 65  perating in dire
2af70 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20 70 61  ct-mode, make pa
2af80 67 65 20 31 20 77 72 69 74 61 62 6c 65 2e 0a 20  ge 1 writable.. 
2af90 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
2afa0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
2afb0 69 73 44 69 72 65 63 74 20 29 7b 0a 20 20 20 20  isDirect ){.    
2afc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2afd0 67 65 72 57 72 69 74 65 28 70 50 67 48 64 72 29  gerWrite(pPgHdr)
2afe0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
2aff0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b000 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65  {.      /* Incre
2b010 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
2b020 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
2b030 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
2b040 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 20 20  te 24. */.      
2b050 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d  change_counter =
2b060 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
2b070 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62  ((u8*)pPager->db
2b080 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 20  FileVers);.     
2b090 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b   change_counter+
2b0a0 2b 3b 0a 20 20 20 20 20 20 70 75 74 33 32 62 69  +;.      put32bi
2b0b0 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 48 64  ts(((char*)pPgHd
2b0c0 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68  r->pData)+24, ch
2b0d0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a  ange_counter);..
2b0e0 20 20 20 20 20 20 2f 2a 20 49 66 20 72 75 6e 6e        /* If runn
2b0f0 69 6e 67 20 69 6e 20 64 69 72 65 63 74 20 6d 6f  ing in direct mo
2b100 64 65 2c 20 77 72 69 74 65 20 74 68 65 20 63 6f  de, write the co
2b110 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65 20 31  ntents of page 1
2b120 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 2a 2f   to the file. */
2b130 0a 20 20 20 20 20 20 69 66 28 20 69 73 44 69 72  .      if( isDir
2b140 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ect ){.        c
2b150 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 20  onst void *zBuf 
2b160 3d 20 70 50 67 48 64 72 2d 3e 70 44 61 74 61 3b  = pPgHdr->pData;
2b170 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b180 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
2b190 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  ize>0 );.       
2b1a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
2b1b0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
2b1c0 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70   zBuf, pPager->p
2b1d0 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20  ageSize, 0);.   
2b1e0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
2b1f0 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
2b200 6b 65 64 2c 20 73 65 74 20 74 68 65 20 63 68 61  ked, set the cha
2b210 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61  ngeCountDone fla
2b220 67 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  g. */.      if( 
2b230 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2b240 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
2b250 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
2b260 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
2b270 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65    }..    /* Rele
2b280 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66  ase the page ref
2b290 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73  erence. */.    s
2b2a0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2b2b0 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20  (pPgHdr);.  }.  
2b2c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2b2d0 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 70 61 67  .** Sync the pag
2b2e0 65 72 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e  er file to disk.
2b2f0 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
2b300 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66   for in-memory f
2b310 69 6c 65 73 0a 2a 2a 20 6f 72 20 70 61 67 65 73  iles.** or pages
2b320 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 2e   with the Pager.
2b330 6e 6f 53 79 6e 63 20 66 6c 61 67 20 73 65 74 2e  noSync flag set.
2b340 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
2b350 73 66 75 6c 2c 20 6f 72 20 63 61 6c 6c 65 64 20  sful, or called 
2b360 6f 6e 20 61 20 70 61 67 65 72 20 66 6f 72 20 77  on a pager for w
2b370 68 69 63 68 20 69 74 20 69 73 20 61 20 6e 6f 2d  hich it is a no-
2b380 6f 70 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  op, this.** func
2b390 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
2b3a0 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73  ITE_OK. Otherwis
2b3b0 65 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  e, an IO error c
2b3c0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
2b3d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2b3e0 61 67 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a  agerSync(Pager *
2b3f0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
2b400 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2b410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b420 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2b430 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c  /.  if( MEMDB ||
2b440 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
2b450 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
2b460 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
2b470 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b480 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  OsSync(pPager->f
2b490 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
2b4a0 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 72 65  flags);.  }.  re
2b4b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2b4c0 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
2b4d0 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
2b4e0 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a   pager pPager. z
2b4f0 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
2b500 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20   the name.** of 
2b510 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
2b520 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
2b530 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
2b540 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  o the individual
2b550 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
2b560 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65  . zMaster may be
2b570 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20   NULL, which is 
2b580 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e  interpreted as n
2b590 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  o master.** jour
2b5a0 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61  nal (a single da
2b5b0 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
2b5c0 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  on)..**.** This 
2b5d0 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
2b5e0 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  that:.**.**   * 
2b5f0 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
2b600 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
2b610 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20   is updated,.** 
2b620 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20    * the journal 
2b630 69 73 20 73 79 6e 63 65 64 20 28 75 6e 6c 65 73  is synced (unles
2b640 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  s the atomic-wri
2b650 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
2b660 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20 20 20 2a  is used),.**   *
2b670 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
2b680 20 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f 20   are written to 
2b690 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b6a0 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64  e, .**   * the d
2b6b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
2b6c0 74 72 75 6e 63 61 74 65 64 20 28 69 66 20 72 65  truncated (if re
2b6d0 71 75 69 72 65 64 29 2c 20 61 6e 64 0a 2a 2a 20  quired), and.** 
2b6e0 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65    * the database
2b6f0 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 0a 2a   file synced. .*
2b700 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68  *.** The only th
2b710 69 6e 67 20 74 68 61 74 20 72 65 6d 61 69 6e 73  ing that remains
2b720 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74   to commit the t
2b730 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f  ransaction is to
2b740 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20 28 64   finalize .** (d
2b750 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74 65 20  elete, truncate 
2b760 6f 72 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73  or zero the firs
2b770 74 20 70 61 72 74 20 6f 66 29 20 74 68 65 20 6a  t part of) the j
2b780 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20  ournal file (or 
2b790 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 6d  .** delete the m
2b7a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
2b7b0 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29  le if specified)
2b7c0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
2b7d0 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55  t if zMaster==NU
2b7e0 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f  LL, this does no
2b7f0 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72  t overwrite a pr
2b800 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20  evious value.** 
2b810 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c  passed to an sql
2b820 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
2b830 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a  haseOne() call..
2b840 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6e  **.** If the fin
2b850 61 6c 20 70 61 72 61 6d 65 74 65 72 20 2d 20 6e  al parameter - n
2b860 6f 53 79 6e 63 20 2d 20 69 73 20 74 72 75 65 2c  oSync - is true,
2b870 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   then the databa
2b880 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 0a 2a  se file itself.*
2b890 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 2e  * is not synced.
2b8a0 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
2b8b0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
2b8c0 65 72 53 79 6e 63 28 29 20 64 69 72 65 63 74 6c  erSync() directl
2b8d0 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68 65  y to.** sync the
2b8e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
2b8f0 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43 6f  efore calling Co
2b900 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 74  mmitPhaseTwo() t
2b910 6f 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20  o delete the.** 
2b920 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
2b930 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e  this case..*/.in
2b940 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  t sqlite3PagerCo
2b950 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a 20 20  mmitPhaseOne(.  
2b960 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
2b970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b980 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
2b990 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2b9a0 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20 20 20 20  *zMaster,       
2b9b0 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
2b9c0 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74 65 72 20  ULL, the master 
2b9d0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
2b9e0 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20 20 20 20    int noSync    
2b9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba00 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69    /* True to omi
2ba10 74 20 74 68 65 20 78 53 79 6e 63 20 6f 6e 20 74  t the xSync on t
2ba20 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a 29 7b  he db file */.){
2ba30 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2ba40 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2ba50 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2ba60 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67  e */..  if( pPag
2ba70 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
2ba80 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
2ba90 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a  ->errCode;.  }..
2baa0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 44    PAGERTRACE(("D
2bab0 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69  ATABASE SYNC: Fi
2bac0 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73  le=%s zMaster=%s
2bad0 20 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20   nSize=%d\n", . 
2bae0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69       pPager->zFi
2baf0 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c  lename, zMaster,
2bb00 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
2bb10 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
2bb20 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
2bb30 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73   db, or no pages
2bb40 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
2bb50 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20  en to, or this. 
2bb60 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73   ** function has
2bb70 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
2bb80 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
2bb90 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
2bba0 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
2bbb0 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a 20  >dbModified ){. 
2bbc0 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
2bbd0 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e  Restart(pPager->
2bbe0 70 42 61 63 6b 75 70 29 3b 0a 20 20 7d 65 6c 73  pBackup);.  }els
2bbf0 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74  e if( pPager->st
2bc00 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate!=PAGER_SYNCE
2bc10 44 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 4d  D && pPager->dbM
2bc20 6f 64 69 66 69 65 64 20 29 7b 0a 0a 20 20 20 20  odified ){..    
2bc30 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
2bc40 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 20 74   block updates t
2bc50 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2bc60 72 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 69  r. Exactly how i
2bc70 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 74 68  t.    ** does th
2bc80 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68  is depends on wh
2bc90 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
2bca0 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f   atomic-update o
2bcb0 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20  ptimization.    
2bcc0 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61  ** was enabled a
2bcd0 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
2bce0 61 6e 64 20 69 66 20 74 68 69 73 20 74 72 61 6e  and if this tran
2bcf0 73 61 63 74 69 6f 6e 20 6d 65 65 74 73 20 74 68  saction meets th
2bd00 65 20 0a 20 20 20 20 2a 2a 20 72 75 6e 74 69 6d  e .    ** runtim
2bd10 65 20 63 72 69 74 65 72 69 61 20 74 6f 20 75 73  e criteria to us
2bd20 65 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 3a  e the operation:
2bd30 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
2bd40 20 20 20 2a 20 54 68 65 20 66 69 6c 65 2d 73 79     * The file-sy
2bd50 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74 68  stem supports th
2bd60 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70  e atomic-write p
2bd70 72 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20 20  roperty for.    
2bd80 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f  **      blocks o
2bd90 66 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65  f size page-size
2bda0 2c 20 61 6e 64 20 0a 20 20 20 20 2a 2a 20 20 20  , and .    **   
2bdb0 20 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69   * This commit i
2bdc0 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20  s not part of a 
2bdd0 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73  multi-file trans
2bde0 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20  action, and.    
2bdf0 2a 2a 20 20 20 20 2a 20 45 78 61 63 74 6c 79 20  **    * Exactly 
2be00 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62 65 65  one page has bee
2be10 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73  n modified and s
2be20 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  tore in the jour
2be30 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  nal file..    **
2be40 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f  .    ** If the o
2be50 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61 73 20  ptimization was 
2be60 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61 74 20 63  not enabled at c
2be70 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65  ompile time, the
2be80 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  n the.    ** pag
2be90 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
2bea0 75 6e 74 65 72 28 29 20 66 75 6e 63 74 69 6f 6e  unter() function
2beb0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 75 70   is called to up
2bec0 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 0a  date the change.
2bed0 20 20 20 20 2a 2a 20 63 6f 75 6e 74 65 72 20 69      ** counter i
2bee0 6e 20 27 69 6e 64 69 72 65 63 74 2d 6d 6f 64 65  n 'indirect-mode
2bef0 27 2e 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69  '. If the optimi
2bf00 7a 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 69 6c  zation is compil
2bf10 65 64 20 69 6e 20 62 75 74 0a 20 20 20 20 2a 2a  ed in but.    **
2bf20 20 69 73 20 6e 6f 74 20 61 70 70 6c 69 63 61 62   is not applicab
2bf30 6c 65 20 74 6f 20 74 68 69 73 20 74 72 61 6e 73  le to this trans
2bf40 61 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c  action, call sql
2bf50 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74  ite3JournalCreat
2bf60 65 28 29 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61  e().    ** to ma
2bf70 6b 65 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72  ke sure the jour
2bf80 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 61 63 74  nal file has act
2bf90 75 61 6c 6c 79 20 62 65 65 6e 20 63 72 65 61 74  ually been creat
2bfa0 65 64 2c 20 74 68 65 6e 20 63 61 6c 6c 0a 20 20  ed, then call.  
2bfb0 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f    ** pager_incr_
2bfc0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
2bfd0 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
2bfe0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20  ange-counter in 
2bff0 69 6e 64 69 72 65 63 74 0a 20 20 20 20 2a 2a 20  indirect.    ** 
2c000 6d 6f 64 65 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  mode. .    **.  
2c010 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
2c020 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  if the optimizat
2c030 69 6f 6e 20 69 73 20 62 6f 74 68 20 65 6e 61 62  ion is both enab
2c040 6c 65 64 20 61 6e 64 20 61 70 70 6c 69 63 61 62  led and applicab
2c050 6c 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  le,.    ** then 
2c060 63 61 6c 6c 20 70 61 67 65 72 5f 69 6e 63 72 5f  call pager_incr_
2c070 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
2c080 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
2c090 61 6e 67 65 2d 63 6f 75 6e 74 65 72 0a 20 20 20  ange-counter.   
2c0a0 20 2a 2a 20 69 6e 20 27 64 69 72 65 63 74 27 20   ** in 'direct' 
2c0b0 6d 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61  mode. In this ca
2c0c0 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
2c0d0 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  ile will never b
2c0e0 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  e.    ** created
2c0f0 20 66 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61   for this transa
2c100 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 23 69  ction..    */.#i
2c110 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2c120 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
2c130 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
2c140 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
2c150 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
2c160 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
2c170 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
2c180 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b  URNALMODE_OFF );
2c190 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65  .    if( !zMaste
2c1a0 72 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  r && isOpen(pPag
2c1b0 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 26  er->jfd) .     &
2c1c0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
2c1d0 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72  lOff==jrnlBuffer
2c1e0 53 69 7a 65 28 70 50 61 67 65 72 29 20 0a 20 20  Size(pPager) .  
2c1f0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62     && pPager->db
2c200 53 69 7a 65 3e 3d 70 50 61 67 65 72 2d 3e 64 62  Size>=pPager->db
2c210 46 69 6c 65 53 69 7a 65 0a 20 20 20 20 20 26 26  FileSize.     &&
2c220 20 28 30 3d 3d 28 70 50 67 20 3d 20 73 71 6c 69   (0==(pPg = sqli
2c230 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
2c240 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
2c250 68 65 29 29 20 7c 7c 20 30 3d 3d 70 50 67 2d 3e  he)) || 0==pPg->
2c260 70 44 69 72 74 79 29 0a 20 20 20 20 29 7b 0a 20  pDirty).    ){. 
2c270 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
2c280 68 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67  he db file chang
2c290 65 20 63 6f 75 6e 74 65 72 20 76 69 61 20 74 68  e counter via th
2c2a0 65 20 64 69 72 65 63 74 2d 77 72 69 74 65 20 6d  e direct-write m
2c2b0 65 74 68 6f 64 2e 20 54 68 65 20 0a 20 20 20 20  ethod. The .    
2c2c0 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63    ** following c
2c2d0 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 20  all will modify 
2c2e0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
2c2f0 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
2c300 70 61 67 65 20 31 20 0a 20 20 20 20 20 20 2a 2a  page 1 .      **
2c310 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20   to include the 
2c320 75 70 64 61 74 65 64 20 63 68 61 6e 67 65 20 63  updated change c
2c330 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20  ounter and then 
2c340 77 72 69 74 65 20 70 61 67 65 20 31 20 0a 20 20  write page 1 .  
2c350 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20      ** directly 
2c360 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2c370 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66  file. Because of
2c380 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
2c390 65 20 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 70  e .      ** prop
2c3a0 65 72 74 79 20 6f 66 20 74 68 65 20 68 6f 73 74  erty of the host
2c3b0 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68   file-system, th
2c3c0 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20  is is safe..    
2c3d0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
2c3e0 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
2c3f0 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c  ecounter(pPager,
2c400 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   1);.    }else{.
2c410 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2c420 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28  e3JournalCreate(
2c430 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
2c440 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2c450 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2c460 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
2c470 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
2c480 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
2c490 20 7d 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20   }.    }.#else. 
2c4a0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
2c4b0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
2c4c0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 23 65 6e  (pPager, 0);.#en
2c4d0 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 21 3d  dif.    if( rc!=
2c4e0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2c4f0 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
2c500 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20  e_exit;..    /* 
2c510 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  If this transact
2c520 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65  ion has made the
2c530 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65   database smalle
2c540 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  r, then all page
2c550 73 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64  s.    ** being d
2c560 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20  iscarded by the 
2c570 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20  truncation must 
2c580 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
2c590 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
2c5a0 20 66 69 6c 65 2e 20 54 68 69 73 20 63 61 6e 20   file. This can 
2c5b0 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 6e 20 61  only happen in a
2c5c0 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 2e  uto-vacuum mode.
2c5d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42  .    **.    ** B
2c5e0 65 66 6f 72 65 20 72 65 61 64 69 6e 67 20 74 68  efore reading th
2c5f0 65 20 70 61 67 65 73 20 77 69 74 68 20 70 61 67  e pages with pag
2c600 65 20 6e 75 6d 62 65 72 73 20 6c 61 72 67 65 72  e numbers larger
2c610 20 74 68 61 6e 20 74 68 65 20 0a 20 20 20 20 2a   than the .    *
2c620 2a 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  * current value 
2c630 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  of Pager.dbSize,
2c640 20 73 65 74 20 64 62 53 69 7a 65 20 62 61 63 6b   set dbSize back
2c650 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 20 20   to the value.  
2c660 20 20 2a 2a 20 74 68 61 74 20 69 74 20 74 6f 6f    ** that it too
2c670 6b 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  k at the start o
2c680 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
2c690 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  n. Otherwise, th
2c6a0 65 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74  e.    ** calls t
2c6b0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
2c6c0 74 28 29 20 72 65 74 75 72 6e 20 7a 65 72 6f 65  t() return zeroe
2c6d0 64 20 70 61 67 65 73 20 69 6e 73 74 65 61 64 20  d pages instead 
2c6e0 6f 66 20 0a 20 20 20 20 2a 2a 20 72 65 61 64 69  of .    ** readi
2c6f0 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ng data from the
2c700 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2c710 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
2c720 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2c730 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50  ACUUM.    if( pP
2c740 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 61  ager->dbSize<pPa
2c750 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 0a  ger->dbOrigSize.
2c760 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
2c770 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
2c780 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2c790 46 46 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  FF .    ){.     
2c7a0 20 50 67 6e 6f 20 69 3b 20 20 20 20 20 20 20 20   Pgno i;        
2c7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c7c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
2c7d0 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
2c7e0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 50  */.      const P
2c7f0 67 6e 6f 20 69 53 6b 69 70 20 3d 20 50 41 47 45  gno iSkip = PAGE
2c800 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
2c810 29 3b 20 2f 2a 20 50 65 6e 64 69 6e 67 20 6c 6f  ); /* Pending lo
2c820 63 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ck page */.     
2c830 20 63 6f 6e 73 74 20 50 67 6e 6f 20 64 62 53 69   const Pgno dbSi
2c840 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
2c850 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 44 61  ize;       /* Da
2c860 74 61 62 61 73 65 20 69 6d 61 67 65 20 73 69 7a  tabase image siz
2c870 65 20 2a 2f 20 0a 20 20 20 20 20 20 70 50 61 67  e */ .      pPag
2c880 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
2c890 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
2c8a0 0a 20 20 20 20 20 20 66 6f 72 28 20 69 3d 64 62  .      for( i=db
2c8b0 53 69 7a 65 2b 31 3b 20 69 3c 3d 70 50 61 67 65  Size+1; i<=pPage
2c8c0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 20 69  r->dbOrigSize; i
2c8d0 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ++ ){.        if
2c8e0 28 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63  ( !sqlite3Bitvec
2c8f0 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
2c900 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20 69  Journal, i) && i
2c910 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20  !=iSkip ){.     
2c920 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
2c930 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
2c940 2a 20 50 61 67 65 20 74 6f 20 6a 6f 75 72 6e 61  * Page to journa
2c950 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  l */.          r
2c960 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2c970 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26  Get(pPager, i, &
2c980 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
2c990 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2c9a0 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
2c9b0 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
2c9c0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
2c9d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2c9e0 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  te(pPage);.     
2c9f0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
2ca00 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
2ca10 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2ca20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2ca30 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
2ca40 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  ne_exit;.       
2ca50 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20   }.      } .    
2ca60 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
2ca70 20 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d   = dbSize;.    }
2ca80 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
2ca90 57 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  Write the master
2caa0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
2cab0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
2cac0 69 6c 65 2e 20 49 66 20 61 20 6d 61 73 74 65 72  ile. If a master
2cad0 20 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c   .    ** journal
2cae0 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61   file name has a
2caf0 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
2cb00 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
2cb10 61 6c 20 66 69 6c 65 2c 20 0a 20 20 20 20 2a 2a  al file, .    **
2cb20 20 6f 72 20 69 66 20 7a 4d 61 73 74 65 72 20 69   or if zMaster i
2cb30 73 20 4e 55 4c 4c 20 28 6e 6f 20 6d 61 73 74 65  s NULL (no maste
2cb40 72 20 6a 6f 75 72 6e 61 6c 29 2c 20 74 68 65 6e  r journal), then
2cb50 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
2cb60 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  no-op..    */.  
2cb70 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74    rc = writeMast
2cb80 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
2cb90 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
2cba0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2cbb0 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f  K ) goto commit_
2cbc0 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
2cbd0 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
2cbe0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
2cbf0 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64  f the atomic-upd
2cc00 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ate optimization
2cc10 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a   is being.    **
2cc20 20 75 73 65 64 2c 20 74 68 69 73 20 63 61 6c 6c   used, this call
2cc30 20 77 69 6c 6c 20 6e 6f 74 20 63 72 65 61 74 65   will not create
2cc40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2cc50 65 20 6f 72 20 70 65 72 66 6f 72 6d 20 61 6e 79  e or perform any
2cc60 0a 20 20 20 20 2a 2a 20 72 65 61 6c 20 49 4f 2e  .    ** real IO.
2cc70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
2cc80 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
2cc90 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
2cca0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2ccb0 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
2ccc0 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f  one_exit;..    /
2ccd0 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74  * Write all dirt
2cce0 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64  y pages to the d
2ccf0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
2cd00 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
2cd10 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 73  write_pagelist(s
2cd20 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
2cd30 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
2cd40 43 61 63 68 65 29 29 3b 0a 20 20 20 20 69 66 28  Cache));.    if(
2cd50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2cd60 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2cd70 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
2cd80 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20  _BLOCKED );.    
2cd90 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68    goto commit_ph
2cda0 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20  ase_one_exit;.  
2cdb0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
2cdc0 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50  cacheCleanAll(pP
2cdd0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
2cde0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
2cdf0 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6e  ile on disk is n
2ce00 6f 74 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65  ot the same size
2ce10 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65   as the database
2ce20 20 69 6d 61 67 65 2c 0a 20 20 20 20 2a 2a 20 74   image,.    ** t
2ce30 68 65 6e 20 75 73 65 20 70 61 67 65 72 5f 74 72  hen use pager_tr
2ce40 75 6e 63 61 74 65 20 74 6f 20 67 72 6f 77 20 6f  uncate to grow o
2ce50 72 20 73 68 72 69 6e 6b 20 74 68 65 20 66 69 6c  r shrink the fil
2ce60 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  e here..    */. 
2ce70 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
2ce80 62 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 64  bSize!=pPager->d
2ce90 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  bFileSize ){.   
2cea0 20 20 20 50 67 6e 6f 20 6e 4e 65 77 20 3d 20 70     Pgno nNew = p
2ceb0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 2d 20  Pager->dbSize - 
2cec0 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d  (pPager->dbSize=
2ced0 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
2cee0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 61  Pager));.      a
2cef0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2cf00 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
2cf10 55 53 49 56 45 20 29 3b 0a 20 20 20 20 20 20 72  USIVE );.      r
2cf20 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
2cf30 74 65 28 70 50 61 67 65 72 2c 20 6e 4e 65 77 29  te(pPager, nNew)
2cf40 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2cf50 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2cf60 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
2cf70 65 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 20  e_exit;.    }.. 
2cf80 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 73     /* Finally, s
2cf90 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
2cfa0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
2cfb0 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
2cfc0 63 20 26 26 20 21 6e 6f 53 79 6e 63 20 29 7b 0a  c && !noSync ){.
2cfd0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2cfe0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
2cff0 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
2d000 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  c_flags);.    }.
2d010 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
2d020 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
2d030 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65 72  er))..    pPager
2d040 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
2d050 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 63 6f 6d  SYNCED;.  }..com
2d060 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
2d070 69 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  it:.  if( rc==SQ
2d080 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
2d090 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67  ED ){.    /* pag
2d0a0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
2d0b0 75 6e 74 65 72 28 29 20 6d 61 79 20 61 74 74 65  unter() may atte
2d0c0 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  mpt to obtain an
2d0d0 20 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20 2a   exclusive.    *
2d0e0 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c 20  * lock to spill 
2d0f0 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65  the cache and re
2d100 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43 4b  turn IOERR_BLOCK
2d110 45 44 2e 20 42 75 74 20 73 69 6e 63 65 20 0a 20  ED. But since . 
2d120 20 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 6e     ** there is n
2d130 6f 20 63 68 61 6e 63 65 20 74 68 65 20 63 61 63  o chance the cac
2d140 68 65 20 69 73 20 69 6e 63 6f 6e 73 69 73 74 65  he is inconsiste
2d150 6e 74 2c 20 69 74 20 69 73 0a 20 20 20 20 2a 2a  nt, it is.    **
2d160 20 62 65 74 74 65 72 20 74 6f 20 72 65 74 75 72   better to retur
2d170 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20  n SQLITE_BUSY.. 
2d180 20 20 20 2a 2a 2f 0a 20 20 20 20 72 63 20 3d 20     **/.    rc = 
2d190 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
2d1a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2d1b0 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
2d1c0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2d1d0 6c 6c 65 64 2c 20 74 68 65 20 64 61 74 61 62 61  lled, the databa
2d1e0 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  se file has been
2d1f0 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 2a 2a 20 75   completely.** u
2d200 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c 65 63  pdated to reflec
2d210 74 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61  t the changes ma
2d220 64 65 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  de by the curren
2d230 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  t transaction an
2d240 64 0a 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64  d.** synced to d
2d250 69 73 6b 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  isk. The journal
2d260 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73   file still exis
2d270 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ts in the file-s
2d280 79 73 74 65 6d 20 0a 2a 2a 20 74 68 6f 75 67 68  ystem .** though
2d290 2c 20 61 6e 64 20 69 66 20 61 20 66 61 69 6c 75  , and if a failu
2d2a0 72 65 20 6f 63 63 75 72 73 20 61 74 20 74 68 69  re occurs at thi
2d2b0 73 20 70 6f 69 6e 74 20 69 74 20 77 69 6c 6c 20  s point it will 
2d2c0 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 62 65  eventually.** be
2d2d0 20 75 73 65 64 20 61 73 20 61 20 68 6f 74 2d 6a   used as a hot-j
2d2e0 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 63  ournal and the c
2d2f0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
2d300 6f 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  on rolled back..
2d310 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
2d320 69 6f 6e 20 66 69 6e 61 6c 69 7a 65 73 20 74 68  ion finalizes th
2d330 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
2d340 65 69 74 68 65 72 20 62 79 20 64 65 6c 65 74 69  either by deleti
2d350 6e 67 2c 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69  ng, .** truncati
2d360 6e 67 20 6f 72 20 70 61 72 74 69 61 6c 6c 79 20  ng or partially 
2d370 7a 65 72 6f 69 6e 67 20 69 74 2c 20 73 6f 20 74  zeroing it, so t
2d380 68 61 74 20 69 74 20 63 61 6e 6e 6f 74 20 62 65  hat it cannot be
2d390 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 68 6f   used .** for ho
2d3a0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
2d3b0 63 6b 2e 20 4f 6e 63 65 20 74 68 69 73 20 69 73  ck. Once this is
2d3c0 20 64 6f 6e 65 20 74 68 65 20 74 72 61 6e 73 61   done the transa
2d3d0 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 69 72 72 65  ction is.** irre
2d3e0 76 6f 63 61 62 6c 79 20 63 6f 6d 6d 69 74 74 65  vocably committe
2d3f0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
2d400 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
2d410 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
2d420 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
2d430 65 20 70 61 67 65 72 0a 2a 2a 20 6d 6f 76 65 73  e pager.** moves
2d440 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20   into the error 
2d450 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  state. Otherwise
2d460 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
2d470 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
2d480 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
2d490 69 74 50 68 61 73 65 54 77 6f 28 50 61 67 65 72  itPhaseTwo(Pager
2d4a0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2d4b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2d4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4d0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2d4e0 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   */..  /* Do not
2d4f0 20 70 72 6f 63 65 65 64 20 69 66 20 74 68 65 20   proceed if the 
2d500 70 61 67 65 72 20 69 73 20 61 6c 72 65 61 64 79  pager is already
2d510 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
2d520 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  ate. */.  if( pP
2d530 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
2d540 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
2d550 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
2d560 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
2d570 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20  tion should not 
2d580 62 65 20 63 61 6c 6c 65 64 20 69 66 20 74 68 65  be called if the
2d590 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
2d5a0 20 61 74 20 6c 65 61 73 74 0a 20 20 2a 2a 20 50   at least.  ** P
2d5b0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74  AGER_RESERVED st
2d5c0 61 74 65 2e 20 41 6e 64 20 69 6e 64 65 65 64 20  ate. And indeed 
2d5d0 53 51 4c 69 74 65 20 6e 65 76 65 72 20 64 6f 65  SQLite never doe
2d5e0 73 20 74 68 69 73 2e 20 42 75 74 20 69 74 20 69  s this. But it i
2d5f0 73 0a 20 20 2a 2a 20 6e 69 63 65 20 74 6f 20 68  s.  ** nice to h
2d600 61 76 65 20 74 68 69 73 20 64 65 66 65 6e 73 69  ave this defensi
2d610 76 65 20 62 6c 6f 63 6b 20 68 65 72 65 20 61 6e  ve block here an
2d620 79 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  yway..  */.  if(
2d630 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 73   NEVER(pPager->s
2d640 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52  tate<PAGER_RESER
2d650 56 45 44 29 20 29 7b 0a 20 20 20 20 72 65 74 75  VED) ){.    retu
2d660 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
2d670 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 20 6f 70  .  }..  /* An op
2d680 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 49 66 20 74  timization. If t
2d690 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
2d6a0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64  not actually mod
2d6b0 69 66 69 65 64 20 64 75 72 69 6e 67 0a 20 20 2a  ified during.  *
2d6c0 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  * this transacti
2d6d0 6f 6e 2c 20 74 68 65 20 70 61 67 65 72 20 69 73  on, the pager is
2d6e0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
2d6f0 75 73 69 76 65 2d 6d 6f 64 65 20 61 6e 64 20 69  usive-mode and i
2d700 73 0a 20 20 2a 2a 20 75 73 69 6e 67 20 70 65 72  s.  ** using per
2d710 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  sistent journals
2d720 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
2d730 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
2d740 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73  .  **.  ** The s
2d750 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
2d760 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74  nal file current
2d770 6c 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69  ly contains a si
2d780 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  ngle journal .  
2d790 2a 2a 20 68 65 61 64 65 72 20 77 69 74 68 20 74  ** header with t
2d7a0 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 73 65  he nRec field se
2d7b0 74 20 74 6f 20 30 2e 20 49 66 20 73 75 63 68 20  t to 0. If such 
2d7c0 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75 73 65  a journal is use
2d7d0 64 20 61 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d  d as.  ** a hot-
2d7e0 6a 6f 75 72 6e 61 6c 20 64 75 72 69 6e 67 20 68  journal during h
2d7f0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
2d800 61 63 6b 2c 20 30 20 63 68 61 6e 67 65 73 20 77  ack, 0 changes w
2d810 69 6c 6c 20 62 65 20 6d 61 64 65 0a 20 20 2a 2a  ill be made.  **
2d820 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2d830 20 66 69 6c 65 2e 20 53 6f 20 74 68 65 72 65 20   file. So there 
2d840 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 7a 65  is no need to ze
2d850 72 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  ro the journal .
2d860 20 20 2a 2a 20 68 65 61 64 65 72 2e 20 53 69 6e    ** header. Sin
2d870 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ce the pager is 
2d880 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
2d890 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  e, there is no n
2d8a0 65 65 64 0a 20 20 2a 2a 20 74 6f 20 64 72 6f 70  eed.  ** to drop
2d8b0 20 61 6e 79 20 6c 6f 63 6b 73 20 65 69 74 68 65   any locks eithe
2d8c0 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  r..  */.  if( pP
2d8d0 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
2d8e0 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ==0 && pPager->e
2d8f0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
2d900 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
2d910 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
2d920 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
2d930 53 54 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65  ST.  ){.    asse
2d940 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
2d950 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
2d960 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
2d970 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2d980 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50  ITE_OK;.  }..  P
2d990 41 47 45 52 54 52 41 43 45 28 28 22 43 4f 4d 4d  AGERTRACE(("COMM
2d9a0 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IT %d\n", PAGERI
2d9b0 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 61  D(pPager)));.  a
2d9c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2d9d0 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43  tate==PAGER_SYNC
2d9e0 45 44 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 21  ED || MEMDB || !
2d9f0 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
2da00 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67  ed );.  rc = pag
2da10 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
2da20 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  on(pPager, pPage
2da30 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20  r->setMaster);. 
2da40 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
2da50 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
2da60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
2da70 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20  ck all changes. 
2da80 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c  The database fal
2da90 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  ls back to PAGER
2daa0 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a  _SHARED mode..**
2dab0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2dac0 6e 20 70 65 72 66 6f 72 6d 73 20 74 77 6f 20 74  n performs two t
2dad0 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  asks:.**.**   1)
2dae0 20 49 74 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74   It rolls back t
2daf0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
2db00 20 72 65 73 74 6f 72 69 6e 67 20 61 6c 6c 20 64   restoring all d
2db10 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
2db20 20 0a 2a 2a 20 20 20 20 20 20 69 6e 2d 6d 65 6d   .**      in-mem
2db30 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20  ory cache pages 
2db40 74 6f 20 74 68 65 20 73 74 61 74 65 20 74 68 65  to the state the
2db50 79 20 77 65 72 65 20 69 6e 20 77 68 65 6e 20 74  y were in when t
2db60 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  he transaction.*
2db70 2a 20 20 20 20 20 20 77 61 73 20 6f 70 65 6e 65  *      was opene
2db80 64 2c 20 61 6e 64 0a 2a 2a 20 20 20 32 29 20 49  d, and.**   2) I
2db90 74 20 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20  t finalizes the 
2dba0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 6f  journal file, so
2dbb0 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
2dbc0 75 73 65 64 20 66 6f 72 20 68 6f 74 0a 2a 2a 20  used for hot.** 
2dbd0 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 61 74       rollback at
2dbe0 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20 74 68   any point in th
2dbf0 65 20 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  e future..**.** 
2dc00 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 66  subject to the f
2dc10 6f 6c 6c 6f 77 69 6e 67 20 71 75 61 6c 69 66 69  ollowing qualifi
2dc20 63 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 2a  cations:.**.** *
2dc30 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
2dc40 66 69 6c 65 20 69 73 20 6e 6f 74 20 79 65 74 20  file is not yet 
2dc50 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66  open when this f
2dc60 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2dc70 64 2c 0a 2a 2a 20 20 20 74 68 65 6e 20 6f 6e 6c  d,.**   then onl
2dc80 79 20 28 32 29 20 69 73 20 70 65 72 66 6f 72 6d  y (2) is perform
2dc90 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
2dca0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6a 6f 75   there is no jou
2dcb0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 74  rnal file.**   t
2dcc0 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a 2a 0a  o roll back..**.
2dcd0 2a 2a 20 2a 20 49 66 20 69 6e 20 61 6e 20 65 72  ** * If in an er
2dce0 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20  ror state other 
2dcf0 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  than SQLITE_FULL
2dd00 2c 20 74 68 65 6e 20 74 61 73 6b 20 28 31 29 20  , then task (1) 
2dd10 69 73 20 0a 2a 2a 20 20 20 70 65 72 66 6f 72 6d  is .**   perform
2dd20 65 64 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  ed. If successfu
2dd30 6c 2c 20 74 61 73 6b 20 28 32 29 2e 20 52 65 67  l, task (2). Reg
2dd40 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f  ardless of the o
2dd50 75 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66 20 65  utcome.**   of e
2dd60 69 74 68 65 72 2c 20 74 68 65 20 65 72 72 6f 72  ither, the error
2dd70 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64   state error cod
2dd80 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
2dd90 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20   the caller.**  
2dda0 20 28 69 2e 65 2e 20 65 69 74 68 65 72 20 53 51   (i.e. either SQ
2ddb0 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51  LITE_IOERR or SQ
2ddc0 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a  LITE_CORRUPT)..*
2ddd0 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20 70 61  *.** * If the pa
2dde0 67 65 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f  ger is in PAGER_
2ddf0 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
2de00 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29  then attempt (1)
2de10 2e 20 57 68 65 74 68 65 72 0a 2a 2a 20 20 20 6f  . Whether.**   o
2de20 72 20 6e 6f 74 20 28 31 29 20 69 73 20 73 75 63  r not (1) is suc
2de30 63 75 73 73 66 75 6c 2c 20 61 6c 73 6f 20 61 74  cussful, also at
2de40 74 65 6d 70 74 20 28 32 29 2e 20 49 66 20 73 75  tempt (2). If su
2de50 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
2de60 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2e  .**   SQLITE_OK.
2de70 20 4f 74 68 65 72 77 69 73 65 2c 20 65 6e 74 65   Otherwise, ente
2de80 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
2de90 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  e and return the
2dea0 20 66 69 72 73 74 20 0a 2a 2a 20 20 20 65 72 72   first .**   err
2deb0 6f 72 20 63 6f 64 65 20 65 6e 63 6f 75 6e 74 65  or code encounte
2dec0 72 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49 6e  red. .**.**   In
2ded0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
2dee0 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
2def0 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
2df00 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f 2e 20  was written to. 
2df10 0a 2a 2a 20 20 20 53 6f 20 69 73 20 73 61 66 65  .**   So is safe
2df20 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
2df30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 76   journal file ev
2df40 65 6e 20 69 66 20 74 68 65 20 70 6c 61 79 62 61  en if the playba
2df50 63 6b 20 0a 2a 2a 20 20 20 28 6f 70 65 72 61 74  ck .**   (operat
2df60 69 6f 6e 20 31 29 20 66 61 69 6c 65 64 2e 20 48  ion 1) failed. H
2df70 6f 77 65 76 65 72 20 74 68 65 20 70 61 67 65 72  owever the pager
2df80 20 6d 75 73 74 20 65 6e 74 65 72 20 74 68 65 20   must enter the 
2df90 65 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20  error state.**  
2dfa0 20 61 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   as the contents
2dfb0 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   of the in-memor
2dfc0 79 20 63 61 63 68 65 20 61 72 65 20 6e 6f 77 20  y cache are now 
2dfd0 73 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 2a  suspect..**.** *
2dfe0 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 69 6e 20   Finally, if in 
2dff0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
2e000 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74 74 65  state, then atte
2e010 6d 70 74 20 28 31 29 2e 20 4f 6e 6c 79 0a 2a 2a  mpt (1). Only.**
2e020 20 20 20 61 74 74 65 6d 70 74 20 28 32 29 20 69     attempt (2) i
2e030 66 20 28 31 29 20 69 73 20 73 75 63 63 65 73 73  f (1) is success
2e040 66 75 6c 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ful. Return SQLI
2e050 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
2e060 66 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65 72 77  ful,.**   otherw
2e070 69 73 65 20 65 6e 74 65 72 20 74 68 65 20 65 72  ise enter the er
2e080 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72 65  ror state and re
2e090 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
2e0a0 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a  ode from the .**
2e0b0 20 20 20 66 61 69 6c 69 6e 67 20 6f 70 65 72 61     failing opera
2e0c0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e  tion..**.**   In
2e0d0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 64   this case the d
2e0e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61 79  atabase file may
2e0f0 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
2e100 65 6e 20 74 6f 2e 20 53 6f 20 69 66 20 74 68 65  en to. So if the
2e110 0a 2a 2a 20 20 20 70 6c 61 79 62 61 63 6b 20 6f  .**   playback o
2e120 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74  peration did not
2e130 20 73 75 63 63 65 65 64 20 69 74 20 77 6f 75 6c   succeed it woul
2e140 64 20 6e 6f 74 20 62 65 20 73 61 66 65 20 74 6f  d not be safe to
2e150 20 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20 74   finalize.**   t
2e160 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
2e170 20 49 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   It needs to be 
2e180 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
2e190 2d 73 79 73 74 65 6d 20 73 6f 20 74 68 61 74 0a  -system so that.
2e1a0 2a 2a 20 20 20 73 6f 6d 65 20 6f 74 68 65 72 20  **   some other 
2e1b0 70 72 6f 63 65 73 73 20 63 61 6e 20 75 73 65 20  process can use 
2e1c0 69 74 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  it to restore th
2e1d0 65 20 64 61 74 61 62 61 73 65 20 73 74 61 74 65  e database state
2e1e0 20 28 62 79 0a 2a 2a 20 20 20 68 6f 74 2d 6a 6f   (by.**   hot-jo
2e1f0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
2e200 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2e210 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67  agerRollback(Pag
2e220 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2e230 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2e240 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
2e250 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2e260 64 65 20 2a 2f 0a 20 20 50 41 47 45 52 54 52 41  de */.  PAGERTRA
2e270 43 45 28 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64  CE(("ROLLBACK %d
2e280 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
2e290 67 65 72 29 29 29 3b 0a 20 20 69 66 28 20 21 70  ger)));.  if( !p
2e2a0 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
2e2b0 64 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61  d || !isOpen(pPa
2e2c0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
2e2d0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
2e2e0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
2e2f0 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  er, pPager->setM
2e300 61 73 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20  aster);.  }else 
2e310 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
2e320 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
2e330 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
2e340 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ULL ){.    if( p
2e350 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
2e360 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
2e370 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61  .      pager_pla
2e380 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29  yback(pPager, 0)
2e390 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
2e3a0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2e3b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
2e3c0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
2e3d0 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
2e3e0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
2e3f0 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  2;.      rc = pa
2e400 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
2e410 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ger, 0);.      r
2e420 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  c2 = pager_end_t
2e430 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
2e440 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  r, pPager->setMa
2e450 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ster);.      if(
2e460 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2e470 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  {.        rc = r
2e480 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c2;.      }.    
2e490 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2e4a0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
2e4b0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
2e4c0 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d 45 4d   }..    if( !MEM
2e4d0 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  DB ){.      pPag
2e4e0 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
2e4f0 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
2e500 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
2e510 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52  ccurs during a R
2e520 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20  OLLBACK, we can 
2e530 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20  no longer trust 
2e540 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
2e550 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20   cache. So call 
2e560 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e  pager_error() on
2e570 20 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20   the way out to 
2e580 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a  make any error .
2e590 20 20 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e      ** persisten
2e5a0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  t..    */.    rc
2e5b0 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70   = pager_error(p
2e5c0 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a  Pager, rc);.  }.
2e5d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2e5e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
2e5f0 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  E if the databas
2e600 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  e file is opened
2e610 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74   read-only.  Ret
2e620 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
2e630 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
2e640 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74  (in theory) writ
2e650 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69  able..*/.u8 sqli
2e660 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
2e670 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ly(Pager *pPager
2e680 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
2e690 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a  er->readOnly;.}.
2e6a0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2e6b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
2e6c0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
2e6d0 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
2e6e0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
2e6f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2e700 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2e710 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
2e720 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2e730 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2e740 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
2e750 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
2e760 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
2e770 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2e780 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
2e790 74 28 44 62 50 61 67 65 20 2a 70 50 61 67 65 29  t(DbPage *pPage)
2e7a0 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
2e7b0 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63  e3PcachePageRefc
2e7c0 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d 0a 0a  ount(pPage);.}..
2e7d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2e7e0 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ST./*.** This ro
2e7f0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
2e800 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
2e810 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  alysis only..*/.
2e820 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65  int *sqlite3Page
2e830 72 53 74 61 74 73 28 50 61 67 65 72 20 2a 70 50  rStats(Pager *pP
2e840 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20  ager){.  static 
2e850 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30  int a[11];.  a[0
2e860 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  ] = sqlite3Pcach
2e870 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
2e880 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b  ->pPCache);.  a[
2e890 31 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  1] = sqlite3Pcac
2e8a0 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
2e8b0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
2e8c0 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33 50 63  a[2] = sqlite3Pc
2e8d0 61 63 68 65 47 65 74 43 61 63 68 65 73 69 7a 65  acheGetCachesize
2e8e0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2e8f0 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67  );.  a[3] = pPag
2e900 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
2e910 3f 20 28 69 6e 74 29 20 70 50 61 67 65 72 2d 3e  ? (int) pPager->
2e920 64 62 53 69 7a 65 20 3a 20 2d 31 3b 0a 20 20 61  dbSize : -1;.  a
2e930 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  [4] = pPager->st
2e940 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50  ate;.  a[5] = pP
2e950 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
2e960 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[6] = pPager->
2e970 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70  nHit;.  a[7] = p
2e980 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20  Pager->nMiss;.  
2e990 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73  a[8] = 0;  /* Us
2e9a0 65 64 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d  ed to be pPager-
2e9b0 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d  >nOvfl */.  a[9]
2e9c0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64   = pPager->nRead
2e9d0 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67  ;.  a[10] = pPag
2e9e0 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65  er->nWrite;.  re
2e9f0 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66  turn a;.}.#endif
2ea00 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2ea10 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2ea20 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  n in-memory page
2ea30 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
2ea40 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28 50 61  3PagerIsMemdb(Pa
2ea50 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2ea60 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a  return MEMDB;.}.
2ea70 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61  ./*.** Check tha
2ea80 74 20 74 68 65 72 65 20 61 72 65 20 61 74 20 6c  t there are at l
2ea90 65 61 73 74 20 6e 53 61 76 65 70 6f 69 6e 74 20  east nSavepoint 
2eaa0 73 61 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2e  savepoints open.
2eab0 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a   If there are.**
2eac0 20 63 75 72 72 65 6e 74 6c 79 20 6c 65 73 73 20   currently less 
2ead0 74 68 61 6e 20 6e 53 61 76 65 70 6f 69 6e 74 73  than nSavepoints
2eae0 20 6f 70 65 6e 2c 20 74 68 65 6e 20 6f 70 65 6e   open, then open
2eaf0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76   one or more sav
2eb00 65 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 6d 61  epoints.** to ma
2eb10 6b 65 20 75 70 20 74 68 65 20 64 69 66 66 65 72  ke up the differ
2eb20 65 6e 63 65 2e 20 49 66 20 74 68 65 20 6e 75 6d  ence. If the num
2eb30 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74  ber of savepoint
2eb40 73 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20  s is already.** 
2eb50 65 71 75 61 6c 20 74 6f 20 6e 53 61 76 65 70 6f  equal to nSavepo
2eb60 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66  int, then this f
2eb70 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
2eb80 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  op..**.** If a m
2eb90 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
2eba0 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e   fails, SQLITE_N
2ebb0 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
2ebc0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a  . If an error .*
2ebd0 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f  * occurs while o
2ebe0 70 65 6e 69 6e 67 20 74 68 65 20 73 75 62 2d 6a  pening the sub-j
2ebf0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
2ec00 6e 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  n an IO error co
2ec10 64 65 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  de is.** returne
2ec20 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  d. Otherwise, SQ
2ec30 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
2ec40 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
2ec50 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
2ec60 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 53 61  *pPager, int nSa
2ec70 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20  vepoint){.  int 
2ec80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2ec90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eca0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2ecb0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  code */.  int nC
2ecc0 75 72 72 65 6e 74 20 3d 20 70 50 61 67 65 72 2d  urrent = pPager-
2ecd0 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20  >nSavepoint;    
2ece0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e      /* Current n
2ecf0 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
2ed00 6e 74 73 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 53  nts */..  if( nS
2ed10 61 76 65 70 6f 69 6e 74 3e 6e 43 75 72 72 65 6e  avepoint>nCurren
2ed20 74 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65  t && pPager->use
2ed30 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69  Journal ){.    i
2ed40 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
2ed50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed60 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
2ed70 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
2ed80 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
2ed90 74 20 2a 61 4e 65 77 3b 20 20 20 20 20 20 20 20  t *aNew;        
2eda0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
2edb0 77 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  w Pager.aSavepoi
2edc0 6e 74 20 61 72 72 61 79 20 2a 2f 0a 0a 20 20 20  nt array */..   
2edd0 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 72 65   /* Either there
2ede0 20 69 73 20 6e 6f 20 61 63 74 69 76 65 20 6a 6f   is no active jo
2edf0 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 73 75 62  urnal or the sub
2ee00 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e  -journal is open
2ee10 20 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   or .    ** the 
2ee20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77 61 79  journal is alway
2ee30 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f  s stored in memo
2ee40 72 79 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ry */.    assert
2ee50 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  ( pPager->nSavep
2ee60 6f 69 6e 74 3d 3d 30 20 7c 7c 20 69 73 4f 70 65  oint==0 || isOpe
2ee70 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
2ee80 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ||.            p
2ee90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2eea0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
2eeb0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a  LMODE_MEMORY );.
2eec0 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65  .    /* Grow the
2eed0 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
2eee0 74 20 61 72 72 61 79 20 75 73 69 6e 67 20 72 65  t array using re
2eef0 61 6c 6c 6f 63 28 29 2e 20 52 65 74 75 72 6e 20  alloc(). Return 
2ef00 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20  SQLITE_NOMEM.   
2ef10 20 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f 63   ** if the alloc
2ef20 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20 4f 74 68  ation fails. Oth
2ef30 65 72 77 69 73 65 2c 20 7a 65 72 6f 20 74 68 65  erwise, zero the
2ef40 20 6e 65 77 20 70 6f 72 74 69 6f 6e 20 69 6e 20   new portion in 
2ef50 63 61 73 65 20 61 20 0a 20 20 20 20 2a 2a 20 6d  case a .    ** m
2ef60 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
2ef70 63 75 72 73 20 77 68 69 6c 65 20 70 6f 70 75 6c  curs while popul
2ef80 61 74 69 6e 67 20 69 74 20 69 6e 20 74 68 65 20  ating it in the 
2ef90 66 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20 62 65  for(...) loop be
2efa0 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  low..    */.    
2efb0 61 4e 65 77 20 3d 20 28 50 61 67 65 72 53 61 76  aNew = (PagerSav
2efc0 65 70 6f 69 6e 74 20 2a 29 73 71 6c 69 74 65 33  epoint *)sqlite3
2efd0 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  Realloc(.       
2efe0 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
2eff0 69 6e 74 2c 20 73 69 7a 65 6f 66 28 50 61 67 65  int, sizeof(Page
2f000 72 53 61 76 65 70 6f 69 6e 74 29 2a 6e 53 61 76  rSavepoint)*nSav
2f010 65 70 6f 69 6e 74 0a 20 20 20 20 29 3b 0a 20 20  epoint.    );.  
2f020 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a 20    if( !aNew ){. 
2f030 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2f040 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
2f050 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77      memset(&aNew
2f060 5b 6e 43 75 72 72 65 6e 74 5d 2c 20 30 2c 20 28  [nCurrent], 0, (
2f070 6e 53 61 76 65 70 6f 69 6e 74 2d 6e 43 75 72 72  nSavepoint-nCurr
2f080 65 6e 74 29 20 2a 20 73 69 7a 65 6f 66 28 50 61  ent) * sizeof(Pa
2f090 67 65 72 53 61 76 65 70 6f 69 6e 74 29 29 3b 0a  gerSavepoint));.
2f0a0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76      pPager->aSav
2f0b0 65 70 6f 69 6e 74 20 3d 20 61 4e 65 77 3b 0a 20  epoint = aNew;. 
2f0c0 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65     pPager->nSave
2f0d0 70 6f 69 6e 74 20 3d 20 6e 53 61 76 65 70 6f 69  point = nSavepoi
2f0e0 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75  nt;..    /* Popu
2f0f0 6c 61 74 65 20 74 68 65 20 50 61 67 65 72 53 61  late the PagerSa
2f100 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72  vepoint structur
2f110 65 73 20 6a 75 73 74 20 61 6c 6c 6f 63 61 74 65  es just allocate
2f120 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69  d. */.    for(ii
2f130 3d 6e 43 75 72 72 65 6e 74 3b 20 69 69 3c 6e 53  =nCurrent; ii<nS
2f140 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
2f150 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2f160 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
2f170 69 64 20 29 3b 0a 20 20 20 20 20 20 61 4e 65 77  id );.      aNew
2f180 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d 20 70 50 61  [ii].nOrig = pPa
2f190 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
2f1a0 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
2f1b0 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50  ager->jfd) && pP
2f1c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2f1d0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 4e  >0 ){.        aN
2f1e0 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d  ew[ii].iOffset =
2f1f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2f200 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Off;.      }else
2f210 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69  {.        aNew[i
2f220 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 4a 4f 55  i].iOffset = JOU
2f230 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
2f240 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
2f250 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 53 75 62     aNew[ii].iSub
2f260 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53  Rec = pPager->nS
2f270 75 62 52 65 63 3b 0a 20 20 20 20 20 20 61 4e 65  ubRec;.      aNe
2f280 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  w[ii].pInSavepoi
2f290 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
2f2a0 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d  ecCreate(pPager-
2f2b0 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  >dbSize);.      
2f2c0 69 66 28 20 21 61 4e 65 77 5b 69 69 5d 2e 70 49  if( !aNew[ii].pI
2f2d0 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  nSavepoint ){.  
2f2e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2f2f0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2f300 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2f310 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f   Open the sub-jo
2f320 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20  urnal, if it is 
2f330 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
2f340 65 64 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ed. */.    rc = 
2f350 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70  openSubJournal(p
2f360 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72  Pager);.  }..  r
2f370 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2f380 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2f390 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f   is called to ro
2f3a0 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65 61 73  llback or releas
2f3b0 65 20 28 63 6f 6d 6d 69 74 29 20 61 20 73 61 76  e (commit) a sav
2f3c0 65 70 6f 69 6e 74 2e 0a 2a 2a 20 54 68 65 20 73  epoint..** The s
2f3d0 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 65 6c 65  avepoint to rele
2f3e0 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
2f3f0 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 65 20  need not be the 
2f400 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 0a 2a  most recently .*
2f410 2a 20 63 72 65 61 74 65 64 20 73 61 76 65 70 6f  * created savepo
2f420 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  int..**.** Param
2f430 65 74 65 72 20 6f 70 20 69 73 20 61 6c 77 61 79  eter op is alway
2f440 73 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49  s either SAVEPOI
2f450 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 20 53  NT_ROLLBACK or S
2f460 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
2f470 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 53 41  ..** If it is SA
2f480 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
2f490 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20 61 6e   then release an
2f4a0 64 20 64 65 73 74 72 6f 79 20 74 68 65 20 73 61  d destroy the sa
2f4b0 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 2a 2a 20  vepoint with.** 
2f4c0 69 6e 64 65 78 20 69 53 61 76 65 70 6f 69 6e 74  index iSavepoint
2f4d0 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50  . If it is SAVEP
2f4e0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
2f4f0 68 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 61 6c 6c  hen rollback all
2f500 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 61 74   changes.** that
2f510 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 73   have occurred s
2f520 69 6e 63 65 20 74 68 65 20 73 70 65 63 69 66 69  ince the specifi
2f530 65 64 20 73 61 76 65 70 6f 69 6e 74 20 77 61 73  ed savepoint was
2f540 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   created..**.** 
2f550 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74 6f  The savepoint to
2f560 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c   rollback or rel
2f570 65 61 73 65 20 69 73 20 69 64 65 6e 74 69 66 69  ease is identifi
2f580 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
2f590 0a 2a 2a 20 69 53 61 76 65 70 6f 69 6e 74 2e 20  .** iSavepoint. 
2f5a0 41 20 76 61 6c 75 65 20 6f 66 20 30 20 6d 65 61  A value of 0 mea
2f5b0 6e 73 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  ns to operate on
2f5c0 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73   the outermost s
2f5d0 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 28 74 68 65  avepoint.** (the
2f5e0 20 66 69 72 73 74 20 63 72 65 61 74 65 64 29 2e   first created).
2f5f0 20 41 20 76 61 6c 75 65 20 6f 66 20 28 50 61 67   A value of (Pag
2f600 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29  er.nSavepoint-1)
2f610 20 6d 65 61 6e 73 20 6f 70 65 72 61 74 65 0a 2a   means operate.*
2f620 2a 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  * on the most re
2f630 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 73  cently created s
2f640 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 53 61  avepoint. If iSa
2f650 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74  vepoint is great
2f660 65 72 20 74 68 61 6e 0a 2a 2a 20 28 50 61 67 65  er than.** (Page
2f670 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29 2c  r.nSavepoint-1),
2f680 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
2f690 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
2f6a0 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 65 67 61 74  **.** If a negat
2f6b0 69 76 65 20 76 61 6c 75 65 20 69 73 20 70 61 73  ive value is pas
2f6c0 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
2f6d0 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 63  tion, then the c
2f6e0 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  urrent.** transa
2f6f0 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
2f700 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69  back. This is di
2f710 66 66 65 72 65 6e 74 20 74 6f 20 63 61 6c 6c 69  fferent to calli
2f720 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ng .** sqlite3Pa
2f730 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65  gerRollback() be
2f740 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63 74  cause this funct
2f750 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 74 65 72  ion does not ter
2f760 6d 69 6e 61 74 65 0a 2a 2a 20 74 68 65 20 74 72  minate.** the tr
2f770 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 75 6e 6c  ansaction or unl
2f780 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
2f790 2c 20 69 74 20 6a 75 73 74 20 72 65 73 74 6f 72  , it just restor
2f7a0 65 73 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  es the .** conte
2f7b0 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
2f7c0 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
2f7d0 6e 61 6c 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a  nal state. .**.*
2f7e0 2a 20 49 6e 20 61 6e 79 20 63 61 73 65 2c 20 61  * In any case, a
2f7f0 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69  ll savepoints wi
2f800 74 68 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61  th an index grea
2f810 74 65 72 20 74 68 61 6e 20 69 53 61 76 65 70 6f  ter than iSavepo
2f820 69 6e 74 20 0a 2a 2a 20 61 72 65 20 64 65 73 74  int .** are dest
2f830 72 6f 79 65 64 2e 20 49 66 20 74 68 69 73 20 69  royed. If this i
2f840 73 20 61 20 72 65 6c 65 61 73 65 20 6f 70 65 72  s a release oper
2f850 61 74 69 6f 6e 20 28 6f 70 3d 3d 53 41 56 45 50  ation (op==SAVEP
2f860 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 2c 0a 2a  OINT_RELEASE),.*
2f870 2a 20 74 68 65 6e 20 73 61 76 65 70 6f 69 6e 74  * then savepoint
2f880 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 61   iSavepoint is a
2f890 6c 73 6f 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a  lso destroyed..*
2f8a0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2f8b0 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  on may return SQ
2f8c0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
2f8d0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
2f8e0 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 6f 72 20 61  n fails,.** or a
2f8f0 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
2f900 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
2f910 63 63 75 72 73 20 77 68 69 6c 65 20 72 6f 6c 6c  ccurs while roll
2f920 69 6e 67 20 62 61 63 6b 20 61 20 0a 2a 2a 20 73  ing back a .** s
2f930 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 6e 6f 20  avepoint. If no 
2f940 65 72 72 6f 72 73 20 6f 63 63 75 72 2c 20 53 51  errors occur, SQ
2f950 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2f960 6e 65 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c  ned..*/ .int sql
2f970 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
2f980 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
2f990 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53  , int op, int iS
2f9a0 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74  avepoint){.  int
2f9b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2f9c0 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  ..  assert( op==
2f9d0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
2f9e0 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  E || op==SAVEPOI
2f9f0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  NT_ROLLBACK );. 
2fa00 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f   assert( iSavepo
2fa10 69 6e 74 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 53 41  int>=0 || op==SA
2fa20 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
2fa30 20 29 3b 0a 0a 20 20 69 66 28 20 69 53 61 76 65   );..  if( iSave
2fa40 70 6f 69 6e 74 3c 70 50 61 67 65 72 2d 3e 6e 53  point<pPager->nS
2fa50 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
2fa60 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
2fa70 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
2fa80 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  ariable */.    i
2fa90 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20  nt nNew;        
2faa0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
2fab0 65 6d 61 69 6e 69 6e 67 20 73 61 76 65 70 6f 69  emaining savepoi
2fac0 6e 74 73 20 61 66 74 65 72 20 74 68 69 73 20 6f  nts after this o
2fad0 70 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69  p. */..    /* Fi
2fae0 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
2faf0 79 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69 6c  y savepoints wil
2fb00 6c 20 73 74 69 6c 6c 20 62 65 20 61 63 74 69 76  l still be activ
2fb10 65 20 61 66 74 65 72 20 74 68 69 73 0a 20 20 20  e after this.   
2fb20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53   ** operation. S
2fb30 74 6f 72 65 20 74 68 69 73 20 76 61 6c 75 65 20  tore this value 
2fb40 69 6e 20 6e 4e 65 77 2e 20 54 68 65 6e 20 66 72  in nNew. Then fr
2fb50 65 65 20 72 65 73 6f 75 72 63 65 73 20 61 73 73  ee resources ass
2fb60 6f 63 69 61 74 65 64 20 0a 20 20 20 20 2a 2a 20  ociated .    ** 
2fb70 77 69 74 68 20 61 6e 79 20 73 61 76 65 70 6f 69  with any savepoi
2fb80 6e 74 73 20 74 68 61 74 20 61 72 65 20 64 65 73  nts that are des
2fb90 74 72 6f 79 65 64 20 62 79 20 74 68 69 73 20 6f  troyed by this o
2fba0 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  peration..    */
2fbb0 0a 20 20 20 20 6e 4e 65 77 20 3d 20 69 53 61 76  .    nNew = iSav
2fbc0 65 70 6f 69 6e 74 20 2b 20 28 6f 70 3d 3d 53 41  epoint + (op==SA
2fbd0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
2fbe0 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e 4e  );.    for(ii=nN
2fbf0 65 77 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  ew; ii<pPager->n
2fc00 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
2fc10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
2fc20 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
2fc30 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
2fc40 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  ii].pInSavepoint
2fc50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
2fc60 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
2fc70 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20 20 2f 2a 20  = nNew;..    /* 
2fc80 49 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c  If this is a rol
2fc90 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2c  lback operation,
2fca0 20 70 6c 61 79 62 61 63 6b 20 74 68 65 20 73 70   playback the sp
2fcb0 65 63 69 66 69 65 64 20 73 61 76 65 70 6f 69 6e  ecified savepoin
2fcc0 74 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69  t..    ** If thi
2fcd0 73 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  s is a temp-file
2fce0 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
2fcf0 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
2fd00 6c 20 66 69 6c 65 20 68 61 73 0a 20 20 20 20 2a  l file has.    *
2fd10 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  * not yet been o
2fd20 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63  pened. In this c
2fd30 61 73 65 20 74 68 65 72 65 20 68 61 76 65 20 62  ase there have b
2fd40 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74  een no changes t
2fd50 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  o.    ** the dat
2fd60 61 62 61 73 65 20 66 69 6c 65 2c 20 73 6f 20 74  abase file, so t
2fd70 68 65 20 70 6c 61 79 62 61 63 6b 20 6f 70 65 72  he playback oper
2fd80 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 73 6b 69  ation can be ski
2fd90 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  pped..    */.   
2fda0 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49   if( op==SAVEPOI
2fdb0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 26 26 20 69  NT_ROLLBACK && i
2fdc0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2fdd0 64 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65  d) ){.      Page
2fde0 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76  rSavepoint *pSav
2fdf0 65 70 6f 69 6e 74 20 3d 20 28 6e 4e 65 77 3d 3d  epoint = (nNew==
2fe00 30 29 3f 30 3a 26 70 50 61 67 65 72 2d 3e 61 53  0)?0:&pPager->aS
2fe10 61 76 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d 31 5d  avepoint[nNew-1]
2fe20 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
2fe30 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
2fe40 69 6e 74 28 70 50 61 67 65 72 2c 20 70 53 61 76  int(pPager, pSav
2fe50 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 61  epoint);.      a
2fe60 73 73 65 72 74 28 72 63 21 3d 53 51 4c 49 54 45  ssert(rc!=SQLITE
2fe70 5f 44 4f 4e 45 29 3b 0a 20 20 20 20 7d 0a 20 20  _DONE);.    }.  
2fe80 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
2fe90 69 73 20 61 20 72 65 6c 65 61 73 65 20 6f 66 20  is a release of 
2fea0 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73 61  the outermost sa
2feb0 76 65 70 6f 69 6e 74 2c 20 74 72 75 6e 63 61 74  vepoint, truncat
2fec0 65 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  e .    ** the su
2fed0 62 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 7a 65 72  b-journal to zer
2fee0 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
2fef0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4e 65 77   */.    if( nNew
2ff00 3d 3d 30 20 26 26 20 6f 70 3d 3d 53 41 56 45 50  ==0 && op==SAVEP
2ff10 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 26 26 20  OINT_RELEASE && 
2ff20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
2ff30 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73  jfd) ){.      as
2ff40 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2ff50 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 63 20  _OK );.      rc 
2ff60 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
2ff70 61 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ate(pPager->sjfd
2ff80 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 67  , 0);.      pPag
2ff90 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b  er->nSubRec = 0;
2ffa0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2ffb0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2ffc0 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
2ffd0 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
2ffe0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2fff0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
30000 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
30010 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
30020 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
30030 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a  ger->zFilename;.
30040 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
30050 74 68 65 20 56 46 53 20 73 74 72 75 63 74 75 72  the VFS structur
30060 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e  e for the pager.
30070 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65  .*/.const sqlite
30080 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61  3_vfs *sqlite3Pa
30090 67 65 72 56 66 73 28 50 61 67 65 72 20 2a 70 50  gerVfs(Pager *pP
300a0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
300b0 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a  pPager->pVfs;.}.
300c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
300d0 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f  e file handle fo
300e0 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
300f0 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  ile associated.*
30100 2a 20 77 69 74 68 20 74 68 65 20 70 61 67 65 72  * with the pager
30110 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 72 65  .  This might re
30120 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
30130 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74   file has.** not
30140 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
30150 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c  ..*/.sqlite3_fil
30160 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46  e *sqlite3PagerF
30170 69 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ile(Pager *pPage
30180 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
30190 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  ger->fd;.}../*.*
301a0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
301b0 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
301c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
301d0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
301e0 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
301f0 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  alname(Pager *pP
30200 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
30210 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
30220 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
30230 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28  n true if fsync(
30240 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61  ) calls are disa
30250 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61  bled for this pa
30260 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  ger.  Return FAL
30270 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29  SE.** if fsync()
30280 73 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e  s are executed n
30290 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  ormally..*/.int 
302a0 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
302b0 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
302c0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
302d0 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23  er->noSync;.}..#
302e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
302f0 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74  _CODEC./*.** Set
30300 20 6f 72 20 72 65 74 72 69 65 76 65 20 74 68 65   or retrieve the
30310 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20   codec for this 
30320 70 61 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20  pager.*/.static 
30330 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
30340 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67  rSetCodec(.  Pag
30350 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f  er *pPager,.  vo
30360 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f  id *(*xCodec)(vo
30370 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
30380 6e 74 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43  nt),.  void (*xC
30390 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f  odecSizeChng)(vo
303a0 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 2c 0a 20 20  id*,int,int),.  
303b0 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65  void (*xCodecFre
303c0 65 29 28 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69  e)(void*),.  voi
303d0 64 20 2a 70 43 6f 64 65 63 0a 29 7b 0a 20 20 69  d *pCodec.){.  i
303e0 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
303f0 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e  cFree ) pPager->
30400 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65  xCodecFree(pPage
30410 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 20 20 70 50  r->pCodec);.  pP
30420 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78  ager->xCodec = x
30430 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d  Codec;.  pPager-
30440 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20  >xCodecSizeChng 
30450 3d 20 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  = xCodecSizeChng
30460 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  ;.  pPager->xCod
30470 65 63 46 72 65 65 20 3d 20 78 43 6f 64 65 63 46  ecFree = xCodecF
30480 72 65 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  ree;.  pPager->p
30490 43 6f 64 65 63 20 3d 20 70 43 6f 64 65 63 3b 0a  Codec = pCodec;.
304a0 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a    pagerReportSiz
304b0 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 73 74 61  e(pPager);.}.sta
304c0 74 69 63 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  tic void *sqlite
304d0 33 50 61 67 65 72 47 65 74 43 6f 64 65 63 28 50  3PagerGetCodec(P
304e0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
304f0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
30500 70 43 6f 64 65 63 3b 0a 7d 0a 23 65 6e 64 69 66  pCodec;.}.#endif
30510 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
30520 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
30530 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
30540 70 61 67 65 20 70 50 67 20 74 6f 20 6c 6f 63 61  page pPg to loca
30550 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65  tion pgno in the
30560 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
30570 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65  re must be no re
30580 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
30590 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20  page previously 
305a0 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20 70 67  located at.** pg
305b0 6e 6f 20 28 77 68 69 63 68 20 77 65 20 63 61 6c  no (which we cal
305c0 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f 75 67 68  l pPgOld) though
305d0 20 74 68 61 74 20 70 61 67 65 20 69 73 20 61 6c   that page is al
305e0 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69  lowed to be.** i
305f0 6e 20 63 61 63 68 65 2e 20 20 49 66 20 74 68 65  n cache.  If the
30600 20 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79   page previously
30610 20 6c 6f 63 61 74 65 64 20 61 74 20 70 67 6e 6f   located at pgno
30620 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
30630 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ** in the rollba
30640 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69  ck journal, it i
30650 73 20 6e 6f 74 20 70 75 74 20 74 68 65 72 65 20  s not put there 
30660 62 79 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  by by this routi
30670 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65  ne..**.** Refere
30680 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
30690 20 70 50 67 20 72 65 6d 61 69 6e 20 76 61 6c 69   pPg remain vali
306a0 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a  d. Updating any.
306b0 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73  ** meta-data ass
306c0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50 67  ociated with pPg
306d0 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72   (i.e. data stor
306e0 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61  ed in the nExtra
306f0 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61   bytes.** alloca
30700 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ted along with t
30710 68 65 20 70 61 67 65 29 20 69 73 20 74 68 65 20  he page) is the 
30720 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
30730 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  f the caller..**
30740 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f  .** A transactio
30750 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65  n must be active
30760 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
30770 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74  ne is called. It
30780 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72   used to be.** r
30790 65 71 75 69 72 65 64 20 74 68 61 74 20 61 20 73  equired that a s
307a0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
307b0 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74  tion was not act
307c0 69 76 65 2c 20 62 75 74 20 74 68 69 73 20 72 65  ive, but this re
307d0 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73  striction.** has
307e0 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43   been removed (C
307f0 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64  REATE INDEX need
30800 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65  s to move a page
30810 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e   when a statemen
30820 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
30830 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2a 0a   is active)..**.
30840 2a 2a 20 49 66 20 74 68 65 20 66 6f 75 72 74 68  ** If the fourth
30850 20 61 72 67 75 6d 65 6e 74 2c 20 69 73 43 6f 6d   argument, isCom
30860 6d 69 74 2c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  mit, is non-zero
30870 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65  , then this page
30880 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 6d 6f 76   is being.** mov
30890 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  ed as part of a 
308a0 64 61 74 61 62 61 73 65 20 72 65 6f 72 67 61 6e  database reorgan
308b0 69 7a 61 74 69 6f 6e 20 6a 75 73 74 20 62 65 66  ization just bef
308c0 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
308d0 69 6f 6e 20 0a 2a 2a 20 69 73 20 62 65 69 6e 67  ion .** is being
308e0 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 6e 20 74   committed. In t
308f0 68 69 73 20 63 61 73 65 2c 20 69 74 20 69 73 20  his case, it is 
30900 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
30910 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67  the database pag
30920 65 20 0a 2a 2a 20 70 50 67 20 72 65 66 65 72 73  e .** pPg refers
30930 20 74 6f 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   to will not be 
30940 77 72 69 74 74 65 6e 20 74 6f 20 61 67 61 69 6e  written to again
30950 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61   within this tra
30960 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
30970 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
30980 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
30990 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65  NOMEM or an IO e
309a0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20  rror code if an 
309b0 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e  error.** occurs.
309c0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
309d0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
309e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
309f0 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 50 61  PagerMovepage(Pa
30a00 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44 62 50  ger *pPager, DbP
30a10 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70  age *pPg, Pgno p
30a20 67 6e 6f 2c 20 69 6e 74 20 69 73 43 6f 6d 6d 69  gno, int isCommi
30a30 74 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  t){.  PgHdr *pPg
30a40 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Old;            
30a50 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 62     /* The page b
30a60 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
30a70 2e 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 65 64  . */.  Pgno need
30a80 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 20 20 20  SyncPgno = 0;   
30a90 20 20 20 20 2f 2a 20 4f 6c 64 20 76 61 6c 75 65      /* Old value
30aa0 20 6f 66 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 69   of pPg->pgno, i
30ab0 66 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72  f sync is requir
30ac0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ed */.  int rc; 
30ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ae0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
30af0 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 72  ode */.  Pgno or
30b00 69 67 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  igPgno;         
30b10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 72 69        /* The ori
30b20 67 69 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  ginal page numbe
30b30 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
30b40 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a  pPg->nRef>0 );..
30b50 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
30b60 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 69 73 20   being moved is 
30b70 64 69 72 74 79 20 61 6e 64 20 68 61 73 20 6e 6f  dirty and has no
30b80 74 20 62 65 65 6e 20 73 61 76 65 64 20 62 79 20  t been saved by 
30b90 74 68 65 20 6c 61 74 65 73 74 0a 20 20 2a 2a 20  the latest.  ** 
30ba0 73 61 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20  savepoint, then 
30bb0 73 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  save the current
30bc0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
30bd0 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 0a   page into the .
30be0 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c    ** sub-journal
30bf0 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 72 65   now. This is re
30c00 71 75 69 72 65 64 20 74 6f 20 68 61 6e 64 6c 65  quired to handle
30c10 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
30c20 63 65 6e 61 72 69 6f 3a 0a 20 20 2a 2a 0a 20 20  cenario:.  **.  
30c30 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a  **   BEGIN;.  **
30c40 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61       <journal pa
30c50 67 65 20 58 2c 20 74 68 65 6e 20 6d 6f 64 69 66  ge X, then modif
30c60 79 20 69 74 20 69 6e 20 6d 65 6d 6f 72 79 3e 0a  y it in memory>.
30c70 20 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49    **     SAVEPOI
30c80 4e 54 20 6f 6e 65 3b 0a 20 20 2a 2a 20 20 20 20  NT one;.  **    
30c90 20 20 20 3c 4d 6f 76 65 20 70 61 67 65 20 58 20     <Move page X 
30ca0 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 59 3e 0a 20  to location Y>. 
30cb0 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b   **     ROLLBACK
30cc0 20 54 4f 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20   TO one;.  **.  
30cd0 2a 2a 20 49 66 20 70 61 67 65 20 58 20 77 65 72  ** If page X wer
30ce0 65 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f  e not written to
30cf0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
30d00 20 68 65 72 65 2c 20 69 74 20 77 6f 75 6c 64 20   here, it would 
30d10 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 70 6f 73 73  not.  ** be poss
30d20 69 62 6c 65 20 74 6f 20 72 65 73 74 6f 72 65 20  ible to restore 
30d30 69 74 73 20 63 6f 6e 74 65 6e 74 73 20 77 68 65  its contents whe
30d40 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20  n the "ROLLBACK 
30d50 54 4f 20 6f 6e 65 22 0a 20 20 2a 2a 20 73 74 61  TO one".  ** sta
30d60 74 65 6d 65 6e 74 20 77 65 72 65 20 69 73 20 70  tement were is p
30d70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2a 0a 20  rocessed..  **. 
30d80 20 2a 2a 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61   ** subjournalPa
30d90 67 65 28 29 20 6d 61 79 20 6e 65 65 64 20 74 6f  ge() may need to
30da0 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
30db0 74 6f 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67  to store pPg->pg
30dc0 6e 6f 20 69 6e 74 6f 0a 20 20 2a 2a 20 6f 6e 65  no into.  ** one
30dd0 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69   or more savepoi
30de0 6e 74 20 62 69 74 76 65 63 73 2e 20 54 68 69 73  nt bitvecs. This
30df0 20 69 73 20 74 68 65 20 72 65 61 73 6f 6e 20 74   is the reason t
30e00 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  his function.  *
30e10 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  * may return SQL
30e20 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 20 20 2a 2f 0a  ITE_NOMEM..  */.
30e30 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73    if( pPg->flags
30e40 26 50 47 48 44 52 5f 44 49 52 54 59 20 0a 20 20  &PGHDR_DIRTY .  
30e50 20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73   && subjRequires
30e60 50 61 67 65 28 70 50 67 29 0a 20 20 20 26 26 20  Page(pPg).   && 
30e70 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
30e80 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
30e90 70 50 67 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  pPg)).  ){.    r
30ea0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
30eb0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4d 4f   PAGERTRACE(("MO
30ec0 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e  VE %d page %d (n
30ed0 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65  eedSync=%d) move
30ee0 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20  s to %d\n", .   
30ef0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
30f00 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28  r), pPg->pgno, (
30f10 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
30f20 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 2c  _NEED_SYNC)?1:0,
30f30 20 70 67 6e 6f 29 29 3b 0a 20 20 49 4f 54 52 41   pgno));.  IOTRA
30f40 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20  CE(("MOVE %p %d 
30f50 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
30f60 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29  Pg->pgno, pgno))
30f70 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f  ..  /* If the jo
30f80 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62  urnal needs to b
30f90 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  e sync()ed befor
30fa0 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f  e page pPg->pgno
30fb0 20 63 61 6e 0a 20 20 2a 2a 20 62 65 20 77 72 69   can.  ** be wri
30fc0 74 74 65 6e 20 74 6f 2c 20 73 74 6f 72 65 20 70  tten to, store p
30fd0 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 6c 6f 63 61  Pg->pgno in loca
30fe0 6c 20 76 61 72 69 61 62 6c 65 20 6e 65 65 64 53  l variable needS
30ff0 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a 2a 0a 20 20  yncPgno..  **.  
31000 2a 2a 20 49 66 20 74 68 65 20 69 73 43 6f 6d 6d  ** If the isComm
31010 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  it flag is set, 
31020 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
31030 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61   to remember tha
31040 74 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  t.  ** the journ
31050 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  al needs to be s
31060 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64  ync()ed before d
31070 61 74 61 62 61 73 65 20 70 61 67 65 20 70 50 67  atabase page pPg
31080 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a 20 63 61 6e  ->pgno .  ** can
31090 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
310a0 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  The caller has a
310b0 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20  lready promised 
310c0 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  not to write to 
310d0 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  it..  */.  if( (
310e0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
310f0 5f 4e 45 45 44 5f 53 59 4e 43 29 20 26 26 20 21  _NEED_SYNC) && !
31100 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  isCommit ){.    
31110 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70  needSyncPgno = p
31120 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73  Pg->pgno;.    as
31130 73 65 72 74 28 20 70 61 67 65 49 6e 4a 6f 75 72  sert( pageInJour
31140 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70 50 67 2d  nal(pPg) || pPg-
31150 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
31160 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20  OrigSize );.    
31170 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
31180 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
31190 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
311a0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
311b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
311c0 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
311d0 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61  s a page with pa
311e0 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20  ge-number pgno, 
311f0 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66  remove it.  ** f
31200 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 68 61  rom its hash cha
31210 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65  in. Also, if the
31220 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
31230 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a  was set for .  *
31240 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f  * page pgno befo
31250 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70  re the 'move' op
31260 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64  eration, it need
31270 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64  s to be retained
31280 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70   .  ** for the p
31290 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e  age moved there.
312a0 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61  .  */.  pPg->fla
312b0 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45  gs &= ~PGHDR_NEE
312c0 44 5f 53 59 4e 43 3b 0a 20 20 70 50 67 4f 6c 64  D_SYNC;.  pPgOld
312d0 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
312e0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
312f0 20 61 73 73 65 72 74 28 20 21 70 50 67 4f 6c 64   assert( !pPgOld
31300 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66   || pPgOld->nRef
31310 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 50 67  ==1 );.  if( pPg
31320 4f 6c 64 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  Old ){.    pPg->
31330 66 6c 61 67 73 20 7c 3d 20 28 70 50 67 4f 6c 64  flags |= (pPgOld
31340 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
31350 45 44 5f 53 59 4e 43 29 3b 0a 20 20 20 20 73 71  ED_SYNC);.    sq
31360 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
31370 70 50 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20  pPgOld);.  }..  
31380 6f 72 69 67 50 67 6e 6f 20 3d 20 70 50 67 2d 3e  origPgno = pPg->
31390 70 67 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 50  pgno;.  sqlite3P
313a0 63 61 63 68 65 4d 6f 76 65 28 70 50 67 2c 20 70  cacheMove(pPg, p
313b0 67 6e 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  gno);.  sqlite3P
313c0 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
313d0 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  Pg);.  pPager->d
313e0 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 0a  bModified = 1;..
313f0 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67    if( needSyncPg
31400 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  no ){.    /* If 
31410 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20  needSyncPgno is 
31420 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
31430 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
31440 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20  needs to be .   
31450 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66   ** sync()ed bef
31460 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
31470 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62  written to datab
31480 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65  ase file page ne
31490 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20  edSyncPgno..    
314a0 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f  ** Currently, no
314b0 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74   such page exist
314c0 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61  s in the page-ca
314d0 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20  che and the .   
314e0 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e 61 6c 65   ** "is journale
314f0 64 22 20 62 69 74 76 65 63 20 66 6c 61 67 20 68  d" bitvec flag h
31500 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69  as been set. Thi
31510 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  s needs to be re
31520 6d 65 64 69 65 64 20 62 79 0a 20 20 20 20 2a 2a  medied by.    **
31530 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 70 61 67   loading the pag
31540 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72  e into the pager
31550 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74 69  -cache and setti
31560 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  ng the PgHdr.nee
31570 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 66 6c  dSync .    ** fl
31580 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ag..    **.    *
31590 2a 20 49 66 20 74 68 65 20 61 74 74 65 6d 70 74  * If the attempt
315a0 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 70 61 67   to load the pag
315b0 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 2d  e into the page-
315c0 63 61 63 68 65 20 66 61 69 6c 73 2c 20 28 64 75  cache fails, (du
315d0 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20 6d 61  e.    ** to a ma
315e0 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61 69  lloc() or IO fai
315f0 6c 75 72 65 29 2c 20 63 6c 65 61 72 20 74 68 65  lure), clear the
31600 20 62 69 74 20 69 6e 20 74 68 65 20 70 49 6e 4a   bit in the pInJ
31610 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20  ournal[].    ** 
31620 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65  array. Otherwise
31630 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  , if the page is
31640 20 6c 6f 61 64 65 64 20 61 6e 64 20 77 72 69 74   loaded and writ
31650 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20 20 20  ten again in.   
31660 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63   ** this transac
31670 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62 65 20  tion, it may be 
31680 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
31690 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66  atabase file bef
316a0 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74 20 69 73  ore.    ** it is
316b0 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
316c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
316d0 68 69 73 20 77 61 79 2c 20 69 74 20 6d 61 79 20  his way, it may 
316e0 65 6e 64 20 75 70 20 69 6e 0a 20 20 20 20 2a 2a  end up in.    **
316f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
31700 65 20 74 77 69 63 65 2c 20 62 75 74 20 74 68 61  e twice, but tha
31710 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c  t is not a probl
31720 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  em..    **.    *
31730 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50 61 67  * The sqlite3Pag
31740 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d 61 79  erGet() call may
31750 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e   cause the journ
31760 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d  al to sync. So m
31770 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
31780 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79  the Pager.needSy
31790 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  nc flag is set t
317a0 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 50  oo..    */.    P
317b0 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20  gHdr *pPgHdr;.  
317c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
317d0 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
317e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
317f0 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e  gerGet(pPager, n
31800 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50  eedSyncPgno, &pP
31810 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72  gHdr);.    if( r
31820 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
31830 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
31840 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  ->pInJournal && 
31850 6e 65 65 64 53 79 6e 63 50 67 6e 6f 3c 3d 70 50  needSyncPgno<=pP
31860 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
31870 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
31880 72 74 28 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  rt( pPager->pTmp
31890 53 70 61 63 65 21 3d 30 20 29 3b 0a 20 20 20 20  Space!=0 );.    
318a0 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
318b0 63 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70  cClear(pPager->p
318c0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65 64 53  InJournal, needS
318d0 79 6e 63 50 67 6e 6f 2c 20 70 50 61 67 65 72 2d  yncPgno, pPager-
318e0 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20  >pTmpSpace);.   
318f0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
31900 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
31910 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
31920 20 3d 20 31 3b 0a 20 20 20 20 61 73 73 65 72 74   = 1;.    assert
31930 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
31940 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42 20 29 3b  ==0 && !MEMDB );
31950 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 66 6c 61  .    pPgHdr->fla
31960 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
31970 5f 53 59 4e 43 3b 0a 20 20 20 20 73 71 6c 69 74  _SYNC;.    sqlit
31980 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
31990 79 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 73  y(pPgHdr);.    s
319a0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
319b0 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20  (pPgHdr);.  }.. 
319c0 20 2f 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 6e 20   /*.  ** For an 
319d0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
319e0 73 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  se, make sure th
319f0 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  e original page 
31a00 63 6f 6e 74 69 6e 75 65 73 0a 20 20 2a 2a 20 74  continues.  ** t
31a10 6f 20 65 78 69 73 74 2c 20 69 6e 20 63 61 73 65  o exist, in case
31a20 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
31a30 20 6e 65 65 64 73 20 74 6f 20 72 6f 6c 6c 20 62   needs to roll b
31a40 61 63 6b 2e 20 20 57 65 20 61 6c 6c 6f 63 61 74  ack.  We allocat
31a50 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
31a60 6e 6f 77 2c 20 69 6e 73 74 65 61 64 20 6f 66 20  now, instead of 
31a70 61 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 62 65 63  at rollback, bec
31a80 61 75 73 65 20 77 65 20 63 61 6e 20 62 65 74 74  ause we can bett
31a90 65 72 20 64 65 61 6c 0a 20 20 2a 2a 20 77 69 74  er deal.  ** wit
31aa0 68 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f  h an out-of-memo
31ab0 72 79 20 65 72 72 6f 72 20 6e 6f 77 2e 20 20 54  ry error now.  T
31ac0 69 63 6b 65 74 20 23 33 37 36 31 2e 0a 20 20 2a  icket #3761..  *
31ad0 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  /.  if( MEMDB ){
31ae0 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70 4e 65  .    DbPage *pNe
31af0 77 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  w;.    rc = sqli
31b00 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
31b10 70 50 61 67 65 72 2c 20 6f 72 69 67 50 67 6e 6f  pPager, origPgno
31b20 2c 20 26 70 4e 65 77 2c 20 31 29 3b 0a 20 20 20  , &pNew, 1);.   
31b30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31b40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
31b50 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50  te3PcacheMove(pP
31b60 67 2c 20 6f 72 69 67 50 67 6e 6f 29 3b 0a 20 20  g, origPgno);.  
31b70 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
31b80 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
31b90 50 61 67 65 72 55 6e 72 65 66 28 70 4e 65 77 29  PagerUnref(pNew)
31ba0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
31bb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
31bc0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
31bd0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
31be0 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  he data for the 
31bf0 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a  specified page..
31c00 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
31c10 50 61 67 65 72 47 65 74 44 61 74 61 28 44 62 50  PagerGetData(DbP
31c20 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 61 73 73  age *pPg){.  ass
31c30 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
31c40 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 2d   || pPg->pPager-
31c50 3e 6d 65 6d 44 62 20 29 3b 0a 20 20 72 65 74 75  >memDb );.  retu
31c60 72 6e 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 7d  rn pPg->pData;.}
31c70 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
31c80 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
31c90 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74  Pager.nExtra byt
31ca0 65 73 20 6f 66 20 22 65 78 74 72 61 22 20 73 70  es of "extra" sp
31cb0 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ace .** allocate
31cc0 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
31cd0 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e   specified page.
31ce0 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
31cf0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 44  3PagerGetExtra(D
31d00 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50  bPage *pPg){.  P
31d10 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
31d20 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 72 65  Pg->pPager;.  re
31d30 74 75 72 6e 20 28 70 50 61 67 65 72 3f 70 50 67  turn (pPager?pPg
31d40 2d 3e 70 45 78 74 72 61 3a 30 29 3b 0a 7d 0a 0a  ->pExtra:0);.}..
31d50 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68  /*.** Get/set th
31d60 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66  e locking-mode f
31d70 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50  or this pager. P
31d80 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d  arameter eMode m
31d90 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66  ust be one.** of
31da0 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
31db0 44 45 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f  DE_QUERY, PAGER_
31dc0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
31dd0 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f  AL or .** PAGER_
31de0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
31df0 55 53 49 56 45 2e 20 49 66 20 74 68 65 20 70 61  USIVE. If the pa
31e00 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f  rameter is not _
31e10 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74  QUERY, then.** t
31e20 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20  he locking-mode 
31e30 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
31e40 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  lue specified..*
31e50 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
31e60 64 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65  d value is eithe
31e70 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  r PAGER_LOCKINGM
31e80 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a  ODE_NORMAL or.**
31e90 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
31ea0 44 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 69 6e  DE_EXCLUSIVE, in
31eb0 64 69 63 61 74 69 6e 67 20 74 68 65 20 63 75 72  dicating the cur
31ec0 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75  rent (possibly u
31ed0 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69  pdated).** locki
31ee0 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  ng-mode..*/.int 
31ef0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b  sqlite3PagerLock
31f00 69 6e 67 4d 6f 64 65 28 50 61 67 65 72 20 2a 70  ingMode(Pager *p
31f10 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65  Pager, int eMode
31f20 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f  ){.  assert( eMo
31f30 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
31f40 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20  GMODE_QUERY.    
31f50 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
31f60 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
31f70 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  ODE_NORMAL.     
31f80 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
31f90 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
31fa0 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  DE_EXCLUSIVE );.
31fb0 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
31fc0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52  LOCKINGMODE_QUER
31fd0 59 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Y<0 );.  assert(
31fe0 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
31ff0 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20  DE_NORMAL>=0 && 
32000 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
32010 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30 20 29  E_EXCLUSIVE>=0 )
32020 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30  ;.  if( eMode>=0
32030 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
32040 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61  pFile ){.    pPa
32050 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
32060 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a  de = (u8)eMode;.
32070 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e    }.  return (in
32080 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  t)pPager->exclus
32090 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  iveMode;.}../*.*
320a0 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6a 6f  * Get/set the jo
320b0 75 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f 72 20 74  urnal-mode for t
320c0 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d  his pager. Param
320d0 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20  eter eMode must 
320e0 62 65 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a  be one of:.**.**
320f0 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
32100 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 2a 2a 20 20  LMODE_QUERY.**  
32110 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d    PAGER_JOURNALM
32120 4f 44 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20  ODE_DELETE.**   
32130 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
32140 44 45 5f 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20  DE_TRUNCATE.**  
32150 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d    PAGER_JOURNALM
32160 4f 44 45 5f 50 45 52 53 49 53 54 0a 2a 2a 20 20  ODE_PERSIST.**  
32170 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d    PAGER_JOURNALM
32180 4f 44 45 5f 4f 46 46 0a 2a 2a 20 20 20 20 50 41  ODE_OFF.**    PA
32190 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
321a0 4d 45 4d 4f 52 59 0a 2a 2a 0a 2a 2a 20 49 66 20  MEMORY.**.** If 
321b0 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  the parameter is
321c0 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65   not _QUERY, the
321d0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  n the journal_mo
321e0 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  de is set to the
321f0 0a 2a 2a 20 76 61 6c 75 65 20 73 70 65 63 69 66  .** value specif
32200 69 65 64 20 69 66 20 74 68 65 20 63 68 61 6e 67  ied if the chang
32210 65 20 69 73 20 61 6c 6c 6f 77 65 64 2e 20 20 54  e is allowed.  T
32220 68 65 20 63 68 61 6e 67 65 20 69 73 20 64 69 73  he change is dis
32230 61 6c 6c 6f 77 65 64 0a 2a 2a 20 66 6f 72 20 74  allowed.** for t
32240 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 61  he following rea
32250 73 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  sons:.**.**   * 
32260 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   An in-memory da
32270 74 61 62 61 73 65 20 63 61 6e 20 6f 6e 6c 79 20  tabase can only 
32280 68 61 76 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c  have its journal
32290 5f 6d 6f 64 65 20 73 65 74 20 74 6f 20 5f 4f 46  _mode set to _OF
322a0 46 0a 2a 2a 20 20 20 20 20 20 6f 72 20 5f 4d 45  F.**      or _ME
322b0 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  MORY..**.**   * 
322c0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64   The journal mod
322d0 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 68 61  e may not be cha
322e0 6e 67 65 64 20 77 68 69 6c 65 20 61 20 74 72 61  nged while a tra
322f0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
32300 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ve..**.** The re
32310 74 75 72 6e 65 64 20 69 6e 64 69 63 61 74 65 20  turned indicate 
32320 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73  the current (pos
32330 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 20 6a  sibly updated) j
32340 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a  ournal-mode..*/.
32350 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
32360 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65  JournalMode(Page
32370 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
32380 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Mode){.  assert(
32390 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
323a0 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a  URNALMODE_QUERY.
323b0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
323c0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
323d0 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20  NALMODE_DELETE. 
323e0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
323f0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
32400 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a  ALMODE_TRUNCATE.
32410 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
32420 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
32430 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a  NALMODE_PERSIST.
32440 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
32450 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
32460 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
32470 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
32480 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
32490 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20  MODE_MEMORY );. 
324a0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a   assert( PAGER_J
324b0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59  OURNALMODE_QUERY
324c0 3c 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64  <0 );.  if( eMod
324d0 65 3e 3d 30 0a 20 20 20 26 26 20 28 21 4d 45 4d  e>=0.   && (!MEM
324e0 44 42 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47  DB || eMode==PAG
324f0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
32500 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20 20  EMORY .         
32510 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
32520 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
32530 5f 4f 46 46 29 0a 20 20 20 26 26 20 21 70 50 61  _OFF).   && !pPa
32540 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 0a  ger->dbModified.
32550 20 20 20 26 26 20 28 21 69 73 4f 70 65 6e 28 70     && (!isOpen(p
32560 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 30  Pager->jfd) || 0
32570 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
32580 6c 4f 66 66 29 0a 20 20 29 7b 0a 20 20 20 20 69  lOff).  ){.    i
32590 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
325a0 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
325b0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
325c0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
325d0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a   }.    pPager->j
325e0 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 28 75 38  ournalMode = (u8
325f0 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65  )eMode;.  }.  re
32600 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72  turn (int)pPager
32610 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d  ->journalMode;.}
32620 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20  ../*.** Get/set 
32630 74 68 65 20 73 69 7a 65 2d 6c 69 6d 69 74 20 75  the size-limit u
32640 73 65 64 20 66 6f 72 20 70 65 72 73 69 73 74 65  sed for persiste
32650 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
32660 2e 0a 2a 2a 0a 2a 2a 20 53 65 74 74 69 6e 67 20  ..**.** Setting 
32670 74 68 65 20 73 69 7a 65 20 6c 69 6d 69 74 20 74  the size limit t
32680 6f 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 20 6c 69  o -1 means no li
32690 6d 69 74 20 69 73 20 65 6e 66 6f 72 63 65 64 2e  mit is enforced.
326a0 0a 2a 2a 20 41 6e 20 61 74 74 65 6d 70 74 20 74  .** An attempt t
326b0 6f 20 73 65 74 20 61 20 6c 69 6d 69 74 20 73 6d  o set a limit sm
326c0 61 6c 6c 65 72 20 74 68 61 6e 20 2d 31 20 69 73  aller than -1 is
326d0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 36 34   a no-op..*/.i64
326e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75   sqlite3PagerJou
326f0 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 28 50 61  rnalSizeLimit(Pa
32700 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 36 34  ger *pPager, i64
32710 20 69 4c 69 6d 69 74 29 7b 0a 20 20 69 66 28 20   iLimit){.  if( 
32720 69 4c 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20 20  iLimit>=-1 ){.  
32730 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
32740 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 69 4c 69  lSizeLimit = iLi
32750 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  mit;.  }.  retur
32760 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  n pPager->journa
32770 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 2f  lSizeLimit;.}../
32780 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
32790 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 50 61  inter to the pPa
327a0 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 76 61 72  ger->pBackup var
327b0 69 61 62 6c 65 2e 20 54 68 65 20 62 61 63 6b 75  iable. The backu
327c0 70 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 6e 20 62  p module.** in b
327d0 61 63 6b 75 70 2e 63 20 6d 61 69 6e 74 61 69 6e  ackup.c maintain
327e0 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  s the content of
327f0 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 2e 20   this variable. 
32800 54 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 75  This module.** u
32810 73 65 73 20 69 74 20 6f 70 61 71 75 65 6c 79 20  ses it opaquely 
32820 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74  as an argument t
32830 6f 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52  o sqlite3BackupR
32840 65 73 74 61 72 74 28 29 20 61 6e 64 0a 2a 2a 20  estart() and.** 
32850 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
32860 61 74 65 28 29 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  ate() only..*/.s
32870 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 2a  qlite3_backup **
32880 73 71 6c 69 74 65 33 50 61 67 65 72 42 61 63 6b  sqlite3PagerBack
32890 75 70 50 74 72 28 50 61 67 65 72 20 2a 70 50 61  upPtr(Pager *pPa
328a0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 26  ger){.  return &
328b0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 3b  pPager->pBackup;
328c0 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
328d0 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
328e0 20 2a 2f 0a                                       */.