/ Hex Artifact Content
Login

Artifact 1ef321efa5839ebc9e563ace6fce30bfa5bdb661:


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 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 2f 2a 0a 2a 2a 2a 2a  "wal.h"../*.****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 20 4e 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45   NOTES ON THE DE
03a0: 53 49 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45  SIGN OF THE PAGE
03b0: 52 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  R **************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
03d0: 20 57 69 74 68 69 6e 20 74 68 69 73 20 63 6f 6d   Within this com
03e0: 6d 65 6e 74 20 62 6c 6f 63 6b 2c 20 61 20 70 61  ment block, a pa
03f0: 67 65 20 69 73 20 64 65 65 6d 65 64 20 74 6f 20  ge is deemed to 
0400: 68 61 76 65 20 62 65 65 6e 20 73 79 6e 63 65 64  have been synced
0410: 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
0420: 79 20 61 73 20 73 6f 6f 6e 20 61 73 20 69 74 20  y as soon as it 
0430: 69 73 20 77 72 69 74 74 65 6e 20 77 68 65 6e 20  is written when 
0440: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
0450: 75 73 3d 4f 46 46 2e 0a 2a 2a 20 4f 74 68 65 72  us=OFF..** Other
0460: 77 69 73 65 2c 20 74 68 65 20 70 61 67 65 20 69  wise, the page i
0470: 73 20 6e 6f 74 20 73 79 6e 63 65 64 20 75 6e 74  s not synced unt
0480: 69 6c 20 74 68 65 20 78 53 79 6e 63 20 6d 65 74  il the xSync met
0490: 68 6f 64 20 6f 66 20 74 68 65 20 56 46 53 0a 2a  hod of the VFS.*
04a0: 2a 20 69 73 20 63 61 6c 6c 65 64 20 73 75 63 63  * is called succ
04b0: 65 73 73 66 75 6c 6c 79 20 6f 6e 20 74 68 65 20  essfully on the 
04c0: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
04d0: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
04e0: 44 65 66 69 6e 69 74 69 6f 6e 3a 20 20 41 20 70  Definition:  A p
04f0: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
0500: 61 73 65 20 66 69 6c 65 20 69 73 20 73 61 69 64  ase file is said
0510: 20 74 6f 20 62 65 20 22 6f 76 65 72 77 72 69 74   to be "overwrit
0520: 65 61 62 6c 65 22 20 69 66 0a 2a 2a 20 6f 6e 65  eable" if.** one
0530: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
0540: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
0550: 75 65 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  ue about the pag
0560: 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 61  e:.** .**     (a
0570: 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  )  The original 
0580: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
0590: 61 67 65 20 61 73 20 69 74 20 77 61 73 20 61 74  age as it was at
05a0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
05b0: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 68  f.**          th
05c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
05d0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69  s been written i
05e0: 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  nto the rollback
05f0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20   journal and.** 
0600: 20 20 20 20 20 20 20 20 20 73 79 6e 63 65 64 2e           synced.
0610: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20  .** .**     (b) 
0620: 20 54 68 65 20 70 61 67 65 20 77 61 73 20 61 20   The page was a 
0630: 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61  freelist leaf pa
0640: 67 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ge at the start 
0650: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0660: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28  on..** .**     (
0670: 63 29 20 20 54 68 65 20 70 61 67 65 20 6e 75 6d  c)  The page num
0680: 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
0690: 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  han the largest 
06a0: 70 61 67 65 20 74 68 61 74 20 65 78 69 73 74 65  page that existe
06b0: 64 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  d in.**         
06c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
06d0: 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  le at the start 
06e0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
06f0: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 31 29 20 41  on..** .** (1) A
0700: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
0710: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 65  abase file is ne
0720: 76 65 72 20 6f 76 65 72 77 72 69 74 74 65 6e 20  ver overwritten 
0730: 75 6e 6c 65 73 73 20 6f 6e 65 20 6f 66 20 74 68  unless one of th
0740: 65 0a 2a 2a 20 20 20 20 20 66 6f 6c 6c 6f 77 69  e.**     followi
0750: 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 20  ng are true:.** 
0760: 0a 2a 2a 20 20 20 20 20 28 61 29 20 54 68 65 20  .**     (a) The 
0770: 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 6f 74 68  page and all oth
0780: 65 72 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  er pages on the 
0790: 73 61 6d 65 20 73 65 63 74 6f 72 20 61 72 65 20  same sector are 
07a0: 6f 76 65 72 77 72 69 74 65 61 62 6c 65 2e 0a 2a  overwriteable..*
07b0: 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20 54 68  * .**     (b) Th
07c0: 65 20 61 74 6f 6d 69 63 20 70 61 67 65 20 77 72  e atomic page wr
07d0: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
07e0: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6e 64   is enabled, and
07f0: 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 20   the entire.**  
0800: 20 20 20 20 20 20 20 74 72 61 6e 73 61 63 74 69         transacti
0810: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  on other than th
0820: 65 20 75 70 64 61 74 65 20 6f 66 20 74 68 65 20  e update of the 
0830: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 71 75  transaction sequ
0840: 65 6e 63 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  ence.**         
0850: 6e 75 6d 62 65 72 20 63 6f 6e 73 69 73 74 73 20  number consists 
0860: 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
0870: 20 63 68 61 6e 67 65 2e 0a 2a 2a 20 0a 2a 2a 20   change..** .** 
0880: 28 32 29 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  (2) The content 
0890: 6f 66 20 61 20 70 61 67 65 20 77 72 69 74 74 65  of a page writte
08a0: 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62  n into the rollb
08b0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 65 78 61 63  ack journal exac
08c0: 74 6c 79 20 6d 61 74 63 68 65 73 0a 2a 2a 20 20  tly matches.**  
08d0: 20 20 20 62 6f 74 68 20 74 68 65 20 63 6f 6e 74     both the cont
08e0: 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
08f0: 61 73 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6c  ase when the rol
0900: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 77 61  lback journal wa
0910: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 20  s written.**    
0920: 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
0930: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
0940: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
0950: 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  g of the current
0960: 0a 2a 2a 20 20 20 20 20 74 72 61 6e 73 61 63 74  .**     transact
0970: 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 33 29 20  ion..** .** (3) 
0980: 57 72 69 74 65 73 20 74 6f 20 74 68 65 20 64 61  Writes to the da
0990: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
09a0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
09b0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  ple of the page 
09c0: 73 69 7a 65 0a 2a 2a 20 20 20 20 20 69 6e 20 6c  size.**     in l
09d0: 65 6e 67 74 68 20 61 6e 64 20 61 72 65 20 61 6c  ength and are al
09e0: 69 67 6e 65 64 20 74 6f 20 61 20 70 61 67 65 20  igned to a page 
09f0: 62 6f 75 6e 64 61 72 79 2e 0a 2a 2a 20 0a 2a 2a  boundary..** .**
0a00: 20 28 34 29 20 52 65 61 64 73 20 66 72 6f 6d 20   (4) Reads from 
0a10: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
0a20: 65 20 61 72 65 20 65 69 74 68 65 72 20 61 6c 69  e are either ali
0a30: 67 6e 65 64 20 6f 6e 20 61 20 70 61 67 65 20 62  gned on a page b
0a40: 6f 75 6e 64 61 72 79 20 61 6e 64 0a 2a 2a 20 20  oundary and.**  
0a50: 20 20 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75     an integer mu
0a60: 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
0a70: 67 65 20 73 69 7a 65 20 69 6e 20 6c 65 6e 67 74  ge size in lengt
0a80: 68 20 6f 72 20 61 72 65 20 74 61 6b 65 6e 20 66  h or are taken f
0a90: 72 6f 6d 20 74 68 65 0a 2a 2a 20 20 20 20 20 66  rom the.**     f
0aa0: 69 72 73 74 20 31 30 30 20 62 79 74 65 73 20 6f  irst 100 bytes o
0ab0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
0ac0: 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 35 29 20  ile..** .** (5) 
0ad0: 41 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74 68  All writes to th
0ae0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0af0: 61 72 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72  are synced prior
0b00: 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   to the rollback
0b10: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
0b20: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2c 20 74  being deleted, t
0b30: 72 75 6e 63 61 74 65 64 2c 20 6f 72 20 7a 65 72  runcated, or zer
0b40: 6f 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 28 36 29 20  oed..** .** (6) 
0b50: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
0b60: 6e 61 6c 20 66 69 6c 65 20 69 73 20 75 73 65 64  nal file is used
0b70: 2c 20 74 68 65 6e 20 61 6c 6c 20 77 72 69 74 65  , then all write
0b80: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
0b90: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 72  e file.**     ar
0ba0: 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74  e synced prior t
0bb0: 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
0bc0: 72 6e 61 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  rnal being delet
0bd0: 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 44 65 66 69 6e  ed..** .** Defin
0be0: 69 74 69 6f 6e 3a 20 54 77 6f 20 64 61 74 61 62  ition: Two datab
0bf0: 61 73 65 73 20 28 6f 72 20 74 68 65 20 73 61 6d  ases (or the sam
0c00: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 77  e database at tw
0c10: 6f 20 70 6f 69 6e 74 73 20 69 74 20 74 69 6d 65  o points it time
0c20: 29 0a 2a 2a 20 61 72 65 20 73 61 69 64 20 74 6f  ).** are said to
0c30: 20 62 65 20 22 6c 6f 67 69 63 61 6c 6c 79 20 65   be "logically e
0c40: 71 75 69 76 61 6c 65 6e 74 22 20 69 66 20 74 68  quivalent" if th
0c50: 65 79 20 67 69 76 65 20 74 68 65 20 73 61 6d 65  ey give the same
0c60: 20 61 6e 73 77 65 72 20 74 6f 0a 2a 2a 20 61 6c   answer to.** al
0c70: 6c 20 71 75 65 72 69 65 73 2e 20 20 4e 6f 74 65  l queries.  Note
0c80: 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74   in particular t
0c90: 68 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  he the content o
0ca0: 66 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66 0a  f freelist leaf.
0cb0: 2a 2a 20 70 61 67 65 73 20 63 61 6e 20 62 65 20  ** pages can be 
0cc0: 63 68 61 6e 67 65 64 20 61 72 62 69 74 61 72 69  changed arbitari
0cd0: 6c 79 20 77 69 74 68 6f 75 74 20 65 66 66 65 63  ly without effec
0ce0: 74 69 6e 67 20 74 68 65 20 6c 6f 67 69 63 61 6c  ting the logical
0cf0: 20 65 71 75 69 76 61 6c 65 6e 63 65 0a 2a 2a 20   equivalence.** 
0d00: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
0d10: 0a 2a 2a 20 0a 2a 2a 20 28 37 29 20 41 74 20 61  .** .** (7) At a
0d20: 6e 79 20 74 69 6d 65 2c 20 69 66 20 61 6e 79 20  ny time, if any 
0d30: 73 75 62 73 65 74 2c 20 69 6e 63 6c 75 64 69 6e  subset, includin
0d40: 67 20 74 68 65 20 65 6d 70 74 79 20 73 65 74 20  g the empty set 
0d50: 61 6e 64 20 74 68 65 20 74 6f 74 61 6c 20 73 65  and the total se
0d60: 74 2c 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 65  t,.**     of the
0d70: 20 75 6e 73 79 6e 63 65 64 20 63 68 61 6e 67 65   unsynced change
0d80: 73 20 74 6f 20 61 20 72 6f 6c 6c 62 61 63 6b 20  s to a rollback 
0d90: 6a 6f 75 72 6e 61 6c 20 61 72 65 20 72 65 6d 6f  journal are remo
0da0: 76 65 64 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ved and the .** 
0db0: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 72      journal is r
0dc0: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0dd0: 72 65 73 75 6c 74 69 6e 67 20 64 61 74 61 62 61  resulting databa
0de0: 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  se file will be 
0df0: 6c 6f 67 69 63 61 6c 0a 2a 2a 20 20 20 20 20 65  logical.**     e
0e00: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
0e10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
0e20: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
0e30: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0e40: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 38 29 20 57  on..** .** (8) W
0e50: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
0e60: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
0e70: 2c 20 74 68 65 20 78 54 72 75 6e 63 61 74 65 20  , the xTruncate 
0e80: 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 56 46  method of the VF
0e90: 53 0a 2a 2a 20 20 20 20 20 69 73 20 63 61 6c 6c  S.**     is call
0ea0: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
0eb0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0ec0: 74 6f 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65  to the same size
0ed0: 20 69 74 20 77 61 73 20 61 74 0a 2a 2a 20 20 20   it was at.**   
0ee0: 20 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20    the beginning 
0ef0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0f00: 6f 6e 2e 20 20 28 49 6e 20 73 6f 6d 65 20 56 46  on.  (In some VF
0f10: 53 65 73 2c 20 74 68 65 20 78 54 72 75 6e 63 61  Ses, the xTrunca
0f20: 74 65 0a 2a 2a 20 20 20 20 20 6d 65 74 68 6f 64  te.**     method
0f30: 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 62 75 74   is a no-op, but
0f40: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 63   that does not c
0f50: 68 61 6e 67 65 20 74 68 65 20 66 61 63 74 20 74  hange the fact t
0f60: 68 65 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 2a  he SQLite will.*
0f70: 2a 20 20 20 20 20 69 6e 76 6f 6b 65 20 69 74 2e  *     invoke it.
0f80: 29 0a 2a 2a 20 0a 2a 2a 20 28 39 29 20 57 68 65  ).** .** (9) Whe
0f90: 6e 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61  never the databa
0fa0: 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 64 69 66  se file is modif
0fb0: 69 65 64 2c 20 61 74 20 6c 65 61 73 74 20 6f 6e  ied, at least on
0fc0: 65 20 62 69 74 20 69 6e 20 74 68 65 20 72 61 6e  e bit in the ran
0fd0: 67 65 0a 2a 2a 20 20 20 20 20 6f 66 20 62 79 74  ge.**     of byt
0fe0: 65 73 20 66 72 6f 6d 20 32 34 20 74 68 72 6f 75  es from 24 throu
0ff0: 67 68 20 33 39 20 69 6e 63 6c 75 73 69 76 65 20  gh 39 inclusive 
1000: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20  will be changed 
1010: 70 72 69 6f 72 20 74 6f 20 72 65 6c 65 61 73 69  prior to releasi
1020: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 45 58  ng.**     the EX
1030: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 0a 2a 2a  CLUSIVE lock..**
1040: 0a 2a 2a 20 28 31 30 29 20 54 68 65 20 70 61 74  .** (10) The pat
1050: 74 65 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20  tern of bits in 
1060: 62 79 74 65 73 20 32 34 20 74 68 72 6f 75 67 68  bytes 24 through
1070: 20 33 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65   39 shall not re
1080: 70 65 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20  peat in less.** 
1090: 20 20 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69       than one bi
10a0: 6c 6c 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f  llion transactio
10b0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41  ns..**.** (11) A
10c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
10d0: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74  s well-formed at
10e0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61   the beginning a
10f0: 6e 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  nd at the conclu
1100: 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20  sion.**      of 
1110: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
1120: 6e 2e 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e  n..**.** (12) An
1130: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1140: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
1150: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
1160: 6e 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20  n writing to.** 
1170: 20 20 20 20 20 74 68 65 20 64 61 74 61 62 61 73       the databas
1180: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31  e file..**.** (1
1190: 33 29 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b  3) A SHARED lock
11a0: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
11b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
11c0: 69 6c 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a  ile reading any.
11d0: 2a 2a 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20  **      content 
11e0: 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
11f0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 0a 2f 2a  ase file..*/../*
1200: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
1210: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
1220: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
1230: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e   off.*/.#if 0.in
1240: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
1250: 61 63 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20  ace=1;  /* True 
1260: 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e  to enable tracin
1270: 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c  g */.#define sql
1280: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
1290: 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50  printf.#define P
12a0: 41 47 45 52 54 52 41 43 45 28 58 29 20 20 20 20  AGERTRACE(X)    
12b0: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
12c0: 72 54 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65  rTrace ){ sqlite
12d0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20  3DebugPrintf X; 
12e0: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
12f0: 50 41 47 45 52 54 52 41 43 45 28 58 29 0a 23 65  PAGERTRACE(X).#e
1300: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1310: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61  following two ma
1320: 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69  cros are used wi
1330: 74 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52  thin the PAGERTR
1340: 41 43 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  ACE() macros abo
1350: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
1360: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
1370: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
1380: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
1390: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
13a0: 20 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61   struct as its a
13b0: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
13c0: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
13d0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
13e0: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
13f0: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
1400: 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20  sqlite3_file.** 
1410: 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72  struct as its ar
1420: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69  gument..*/.#defi
1430: 6e 65 20 50 41 47 45 52 49 44 28 70 29 20 28 28  ne PAGERID(p) ((
1440: 69 6e 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65  int)(p->fd)).#de
1450: 66 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49  fine FILEHANDLEI
1460: 44 28 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a  D(fd) ((int)fd).
1470: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
1480: 63 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65  cache as a whole
1490: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e   is always in on
14a0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
14b0: 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a  ng.** states:.**
14c0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f  .**   PAGER_UNLO
14d0: 43 4b 20 20 20 20 20 20 20 20 54 68 65 20 70 61  CK        The pa
14e0: 67 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ge cache is not 
14f0: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
1500: 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  g or .**        
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
1520: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
1530: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65  ase file.  There
1540: 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20   is no.**       
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1560: 64 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d  data held in mem
1570: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68  ory.  This is th
1580: 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20  e initial.**    
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a0: 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20     state..**.** 
15b0: 20 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20    PAGER_SHARED  
15c0: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
15d0: 61 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20  ache is reading 
15e0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69         Writing i
1610: 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
1620: 20 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a    There can be.*
1630: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1640: 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65          multiple
1650: 20 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69   readers accessi
1660: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
1670: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
1690: 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
16a0: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ime..**.**   PAG
16b0: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 20  ER_RESERVED     
16c0: 20 54 68 69 73 20 70 72 6f 63 65 73 73 20 68 61   This process ha
16d0: 73 20 72 65 73 65 72 76 65 64 20 74 68 65 20 64  s reserved the d
16e0: 61 74 61 62 61 73 65 20 66 6f 72 20 77 72 69 74  atabase for writ
16f0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74               but
1710: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64   has not yet mad
1720: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20  e any changes.  
1730: 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73  Only one process
1740: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1750: 20 20 20 20 20 20 20 20 20 20 61 74 20 61 20 74            at a t
1760: 69 6d 65 20 63 61 6e 20 72 65 73 65 72 76 65 20  ime can reserve 
1770: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
1780: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  he original.**  
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
17b0: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
17c0: 6d 6f 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65  modified so othe
17d0: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
17e0: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65             proce
17f0: 73 73 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62  sses may still b
1800: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e  e reading the on
1810: 2d 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20  -disk.**        
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1830: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1840: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c  .**   PAGER_EXCL
1850: 55 53 49 56 45 20 20 20 20 20 54 68 65 20 70 61  USIVE     The pa
1860: 67 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74  ge cache is writ
1870: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1880: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
1890: 20 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73             Acces
18a0: 73 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  s is exclusive. 
18b0: 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   No other proces
18c0: 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ses or.**       
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 74 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72  threads can be r
18f0: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1900: 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20  g while one.**  
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20       process is 
1930: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  writing..**.**  
1940: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
1950: 20 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d       The pager m
1960: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
1970: 74 65 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58  te from PAGER_EX
1980: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20  CLUSIVE.**      
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a0: 20 61 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79   after all dirty
19b0: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
19c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
19d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
19e0: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
19f0: 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
1a00: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
1a10: 63 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ced to.**       
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a30: 64 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72  disk. All that r
1a40: 65 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20  emains to do is 
1a50: 74 6f 20 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20  to remove or.** 
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 74 72 75 6e 63 61 74 65 20 74        truncate t
1a80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a90: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
1aa0: 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ion .**         
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
1ac0: 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e  ll be committed.
1ad0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
1ae0: 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69  cache comes up i
1af0: 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  n PAGER_UNLOCK. 
1b00: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
1b10: 61 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  a.** sqlite3Page
1b20: 72 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  rGet() occurs, t
1b30: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
1b40: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
1b50: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
1b60: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
1b70: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
1b80: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
1b90: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
1ba0: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
1bb0: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
1bc0: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
1bd0: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
1be0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1bf0: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
1c00: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
1c10: 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
1c20: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
1c30: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
1c40: 72 57 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  rWrite() can onl
1c50: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
1c60: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
1c70: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
1c80: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
1c90: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
1ca0: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
1cb0: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
1cc0: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
1cd0: 56 45 44 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52  VED.).** PAGER_R
1ce0: 45 53 45 52 56 45 44 20 6d 65 61 6e 73 20 74 68  ESERVED means th
1cf0: 61 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f  at there is an o
1d00: 70 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  pen rollback jou
1d10: 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61  rnal..** The tra
1d20: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
1d30: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
1d40: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  s before any cha
1d50: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
1d60: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1d70: 20 66 69 6c 65 2c 20 74 68 6f 75 67 68 20 77 72   file, though wr
1d80: 69 74 65 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c  ites to the roll
1d90: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
1da0: 6f 63 63 75 72 73 20 77 69 74 68 20 6a 75 73 74  occurs with just
1db0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
1dc0: 20 20 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74    After an sqlit
1dd0: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1de0: 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 50  ).** or sqlite3P
1df0: 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
1e00: 77 6f 28 29 2c 20 74 68 65 20 73 74 61 74 65 20  wo(), the state 
1e10: 63 61 6e 20 67 6f 20 62 61 63 6b 20 74 6f 20 50  can go back to P
1e20: 41 47 45 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20  AGER_SHARED,.** 
1e30: 6f 72 20 69 74 20 63 61 6e 20 73 74 61 79 20 61  or it can stay a
1e40: 74 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  t PAGER_EXCLUSIV
1e50: 45 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 65  E if we are in e
1e60: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
1e70: 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  mode..*/.#define
1e80: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
1e90: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
1ea0: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 31  ER_SHARED      1
1eb0: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48     /* same as SH
1ec0: 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  ARED_LOCK */.#de
1ed0: 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52  fine PAGER_RESER
1ee0: 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61  VED    2   /* sa
1ef0: 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c  me as RESERVED_L
1f00: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1f10: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20  AGER_EXCLUSIVE  
1f20: 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   4   /* same as 
1f30: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a  EXCLUSIVE_LOCK *
1f40: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1f50: 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f  SYNCED      5../
1f60: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
1f70: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
1f80: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
1f90: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
1fa0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
1fb0: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
1fc0: 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c  EC1(P,D,N,X,E) \
1fd0: 0a 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64  .    if( P->xCod
1fe0: 65 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28  ec && P->xCodec(
1ff0: 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29  P->pCodec,D,N,X)
2000: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65  ==0 ){ E; }.# de
2010: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
2020: 4e 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69  N,X,E,O) \.    i
2030: 66 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20  f( P->xCodec==0 
2040: 29 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d  ){ O=(char*)D; }
2050: 65 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28  else \.    if( (
2060: 4f 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f  O=(char*)(P->xCo
2070: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c  dec(P->pCodec,D,
2080: 4e 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20  N,X)))==0 ){ E; 
2090: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
20a0: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c   CODEC1(P,D,N,X,
20b0: 45 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  E)   /* NO-OP */
20c0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
20d0: 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d  (P,D,N,X,E,O) O=
20e0: 28 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a  (char*)D.#endif.
20f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
2100: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f  um allowed secto
2110: 72 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49  r size. 64KiB. I
2120: 66 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a  f the xSectorsiz
2130: 65 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72  e() method .** r
2140: 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c  eturns a value l
2150: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c  arger than this,
2160: 20 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52   then MAX_SECTOR
2170: 5f 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e  _SIZE is used in
2180: 73 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63  stead..** This c
2190: 6f 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79  ould conceivably
21a0: 20 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f   cause corruptio
21b0: 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f  n following a po
21c0: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a  wer failure on.*
21d0: 2a 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e  * such a system.
21e0: 20 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74   This is current
21f0: 6c 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74  ly an undocument
2200: 65 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65  ed limit..*/.#de
2210: 66 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f  fine MAX_SECTOR_
2220: 53 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a  SIZE 0x10000../*
2230: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
2240: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2250: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
2260: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
2270: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
2280: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
2290: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
22a0: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
22b0: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
22c0: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
22d0: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
22e0: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
22f0: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
2300: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
2310: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
2320: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
2330: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
2340: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
2350: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
2360: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
2370: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
2380: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
2390: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
23a0: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
23b0: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
23c0: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
23d0: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
23e0: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
23f0: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
2400: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
2410: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
2420: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
2430: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
2440: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
2450: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
2460: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
2470: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
2480: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
2490: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
24a0: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
24b0: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
24c0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
24d0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
24e0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
24f0: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
2500: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
2510: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
2520: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
2530: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
2540: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
2550: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
2560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2570: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
2580: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
2590: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
25a0: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
25b0: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
25c0: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25e0: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
25f0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
2600: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
2610: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
2620: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2630: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
2640: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
2650: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2660: 4d 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57  MIT_WAL.  u32 aW
2670: 61 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50  alData[WAL_SAVEP
2680: 4f 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20  OINT_NDATA];    
2690: 20 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70      /* WAL savep
26a0: 6f 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  oint context */.
26b0: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
26c0: 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63   A open page cac
26d0: 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  he is an instanc
26e0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
26f0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ng structure..**
2700: 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a  .** errCode.**.*
2710: 2a 20 20 20 50 61 67 65 72 2e 65 72 72 43 6f 64  *   Pager.errCod
2720: 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  e may be set to 
2730: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
2740: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72  LITE_CORRUPT, or
2750: 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49 54 45 5f  .**   or SQLITE_
2760: 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f  FULL. Once one o
2770: 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  f the first thre
2780: 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73 2c  e errors occurs,
2790: 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a 20   it persists.** 
27a0: 20 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65    and is returne
27b0: 64 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20  d as the result 
27c0: 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70  of every major p
27d0: 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20  ager API call.  
27e0: 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f  The.**   SQLITE_
27f0: 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64 65  FULL return code
2800: 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69 66   is slightly dif
2810: 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73 69  ferent. It persi
2820: 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74  sts only until t
2830: 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20 73 75 63  he.**   next suc
2840: 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b  cessful rollback
2850: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e   is performed on
2860: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
2870: 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20 53 51 4c  . Also,.**   SQL
2880: 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f  ITE_FULL does no
2890: 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71 6c  t affect the sql
28a0: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 61  ite3PagerGet() a
28b0: 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nd sqlite3PagerL
28c0: 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20 41 50 49  ookup().**   API
28d0: 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69 6c  s, they may stil
28e0: 6c 20 62 65 20 75 73 65 64 20 73 75 63 63 65 73  l be used succes
28f0: 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 64 62  sfully..**.** db
2900: 53 69 7a 65 56 61 6c 69 64 2c 20 64 62 53 69 7a  SizeValid, dbSiz
2910: 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 2c 20 64  e, dbOrigSize, d
2920: 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20  bFileSize.**.** 
2930: 20 20 4d 61 6e 61 67 69 6e 67 20 74 68 65 20 73    Managing the s
2940: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
2950: 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65  ase file in page
2960: 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20 63 6f  s is a little co
2970: 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20 20 20  mplicated..**   
2980: 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67  The variable Pag
2990: 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74 61 69  er.dbSize contai
29a0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
29b0: 20 70 61 67 65 73 20 74 68 61 74 20 74 68 65 20   pages that the 
29c0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 69 6d  database.**   im
29d0: 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  age currently co
29e0: 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65 20 64  ntains. As the d
29f0: 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 67 72  atabase image gr
2a00: 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73 20 74  ows or shrinks t
2a10: 68 69 73 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c  his.**   variabl
2a20: 65 20 69 73 20 75 70 64 61 74 65 64 2e 20 54 68  e is updated. Th
2a30: 65 20 76 61 72 69 61 62 6c 65 20 50 61 67 65 72  e variable Pager
2a40: 2e 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74  .dbFileSize cont
2a50: 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 0a  ains the number.
2a60: 2a 2a 20 20 20 6f 66 20 70 61 67 65 73 20 69 6e  **   of pages in
2a70: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a80: 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 62 65 20  le. This may be 
2a90: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 50  different from P
2aa0: 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a 2a 20 20  ager.dbSize.**  
2ab0: 20 69 66 20 73 6f 6d 65 20 70 61 67 65 73 20 68   if some pages h
2ac0: 61 76 65 20 62 65 65 6e 20 61 70 70 65 6e 64 65  ave been appende
2ad0: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
2ae0: 65 20 69 6d 61 67 65 20 62 75 74 20 6e 6f 74 20  e image but not 
2af0: 79 65 74 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20  yet written.**  
2b00: 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20 63 61   out from the ca
2b10: 63 68 65 20 74 6f 20 74 68 65 20 61 63 74 75 61  che to the actua
2b20: 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  l file on disk. 
2b30: 4f 72 20 69 66 20 74 68 65 20 69 6d 61 67 65 20  Or if the image 
2b40: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 74 72  has been.**   tr
2b50: 75 6e 63 61 74 65 64 20 62 79 20 61 6e 20 69 6e  uncated by an in
2b60: 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
2b70: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65 20   operation. The 
2b80: 50 61 67 65 72 2e 64 62 4f 72 69 67 53 69 7a 65  Pager.dbOrigSize
2b90: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20 63   variable.**   c
2ba0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62  ontains the numb
2bb0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
2bc0: 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
2bd0: 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  e when the curre
2be0: 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73 61 63 74  nt.**   transact
2bf0: 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20  ion was opened. 
2c00: 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  The contents of 
2c10: 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74 68 65  all three of the
2c20: 73 65 20 76 61 72 69 61 62 6c 65 73 20 69 73 0a  se variables is.
2c30: 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61 72 61 6e  **   only guaran
2c40: 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72 72 65  teed to be corre
2c50: 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c 65 61  ct if the boolea
2c60: 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 56 61  n Pager.dbSizeVa
2c70: 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  lid is true..**.
2c80: 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e 64 65 72  **   TODO: Under
2c90: 20 77 68 61 74 20 63 6f 6e 64 69 74 69 6f 6e 73   what conditions
2ca0: 20 69 73 20 64 62 53 69 7a 65 56 61 6c 69 64 20   is dbSizeValid 
2cb0: 73 65 74 3f 20 43 6c 65 61 72 65 64 3f 0a 2a 2a  set? Cleared?.**
2cc0: 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  .** changeCountD
2cd0: 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  one.**.**   This
2ce0: 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c   boolean variabl
2cf0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b  e is used to mak
2d00: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
2d10: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a  change-counter .
2d20: 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74 65  **   (the 4-byte
2d30: 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61 74   header field at
2d40: 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34 20   byte offset 24 
2d50: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2d60: 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20 6e  file) is .**   n
2d70: 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65 20  ot updated more 
2d80: 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65 73  often than neces
2d90: 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49  sary. .**.**   I
2da0: 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  t is set to true
2db0: 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65   when the change
2dc0: 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20 69  -counter field i
2dd0: 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63 68  s updated, which
2de0: 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79 20   .**   can only 
2df0: 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78 63  happen if an exc
2e00: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 68  lusive lock is h
2e10: 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
2e20: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 49  ase file..**   I
2e30: 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73 65  t is cleared (se
2e40: 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65 6e  t to false) when
2e50: 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69 76  ever an exclusiv
2e60: 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20 20  e lock is .**   
2e70: 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e 20  relinquished on 
2e80: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e90: 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20 74  e. Each time a t
2ea0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
2eb0: 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54 68  mmitted,.**   Th
2ec0: 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
2ed0: 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65 63  e flag is inspec
2ee0: 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74 72  ted. If it is tr
2ef0: 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66 0a  ue, the work of.
2f00: 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74 68  **   updating th
2f10: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
2f20: 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72 20   is omitted for 
2f30: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
2f40: 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  saction..**.**  
2f50: 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d 20   This mechanism 
2f60: 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e 20  means that when 
2f70: 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
2f80: 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f 6e  sive mode, a con
2f90: 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e 65  nection .**   ne
2fa0: 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20 74  ed only update t
2fb0: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2fc0: 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65 20  r once, for the 
2fd0: 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69 6f  first transactio
2fe0: 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65 64  n.**   committed
2ff0: 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64 69 66 69  ..**.** dbModifi
3000: 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 64  ed.**.**   The d
3010: 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67 20 69  bModified flag i
3020: 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20 61  s set whenever a
3030: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 69   database page i
3040: 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a 20 20 20  s dirtied..**   
3050: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 61 74  It is cleared at
3060: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   the end of each
3070: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
3080: 0a 2a 2a 20 20 20 49 74 20 69 73 20 75 73 65 64  .**   It is used
3090: 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
30a0: 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20 65 6e   or otherwise en
30b0: 64 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ding a transacti
30c0: 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74 68 65 20  on. If.**   the 
30d0: 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67 20  dbModified flag 
30e0: 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 6c 65  is clear then le
30f0: 73 73 20 77 6f 72 6b 20 68 61 73 20 74 6f 20 62  ss work has to b
3100: 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 6a 6f  e done..**.** jo
3110: 75 72 6e 61 6c 53 74 61 72 74 65 64 0a 2a 2a 0a  urnalStarted.**.
3120: 2a 2a 20 20 20 54 68 69 73 20 66 6c 61 67 20 69  **   This flag i
3130: 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20 74  s set whenever t
3140: 68 65 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  he the main jour
3150: 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 20 61 6e  nal is opened an
3160: 64 0a 2a 2a 20 20 20 69 6e 69 74 69 61 6c 69 7a  d.**   initializ
3170: 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 70  ed.**.**   The p
3180: 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c 61  oint of this fla
3190: 67 20 69 73 20 74 68 61 74 20 69 74 20 6d 75 73  g is that it mus
31a0: 74 20 62 65 20 73 65 74 20 61 66 74 65 72 20 74  t be set after t
31b0: 68 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20 6a  he .**   first j
31c0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
31d0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
31e0: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
31f0: 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41 66  to disk..**   Af
3200: 74 65 72 20 74 68 69 73 20 68 61 73 20 68 61 70  ter this has hap
3210: 70 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65 73  pened, new pages
3220: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
3230: 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20   database .**   
3240: 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20  do not need the 
3250: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
3260: 66 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68 65  flag set, as the
3270: 79 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a  y do not need.**
3280: 20 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61     to wait for a
3290: 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62 65   journal sync be
32a0: 66 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62 65  fore they can be
32b0: 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a   written out to.
32c0: 2a 2a 20 20 20 74 68 65 20 64 61 74 61 62 61 73  **   the databas
32d0: 65 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e 63  e file (see func
32e0: 74 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74 65  tion pager_write
32f0: 28 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73 65  ())..**   .** se
3300: 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20  tMaster.**.**   
3310: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
3320: 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
3330: 74 68 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  that the master 
3340: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
3350: 65 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29 20  e.**   (if any) 
3360: 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e 20  is only written 
3370: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
3380: 20 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a   file once..**.*
3390: 2a 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74 74  *   When committ
33a0: 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
33b0: 6e 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  n, the master jo
33c0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
33d0: 28 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d 61  (if any).**   ma
33e0: 79 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  y be written int
33f0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
3400: 6c 65 20 77 68 69 6c 65 20 74 68 65 20 70 61 67  le while the pag
3410: 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a 2a  er is still in.*
3420: 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56  *   PAGER_RESERV
3430: 45 44 20 73 74 61 74 65 20 28 73 65 65 20 43 6f  ED state (see Co
3440: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 66  mmitPhaseOne() f
3450: 6f 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e 20  or the action). 
3460: 49 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74 74  It.**   then att
3470: 65 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64 65  empts to upgrade
3480: 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65   to an exclusive
3490: 20 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20 61   lock. If this a
34a0: 74 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69 6c  ttempt.**   fail
34b0: 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 42  s, then SQLITE_B
34c0: 55 53 59 20 6d 61 79 20 62 65 20 72 65 74 75 72  USY may be retur
34d0: 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20  ned to the user 
34e0: 61 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a 20  and the user.** 
34f0: 20 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f    may attempt to
3500: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
3510: 73 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61  saction again la
3520: 74 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a 20  ter (calling.** 
3530: 20 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65    CommitPhaseOne
3540: 28 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73 20  () again). This 
3550: 66 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f 20  flag is used to 
3560: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
3570: 0a 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f 75  .**   master jou
3580: 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e 6c  rnal name is onl
3590: 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
35a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
35b0: 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69 6d  e first.**   tim
35c0: 65 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  e CommitPhaseOne
35d0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
35e0: 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 2c 20  .** doNotSpill, 
35f0: 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 0a 2a  doNotSyncSpill.*
3600: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 65 6e 61 62  *.**   When enab
3610: 6c 65 64 2c 20 63 61 63 68 65 20 73 70 69 6c 6c  led, cache spill
3620: 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64  s are prohibited
3630: 2e 20 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c  .  The doNotSpil
3640: 6c 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20  l variable.**   
3650: 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63 61 63  inhibits all cac
3660: 68 65 20 73 70 69 6c 6c 20 61 6e 64 20 64 6f 4e  he spill and doN
3670: 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 6e 68 69  otSyncSpill inhi
3680: 62 69 74 73 20 74 68 6f 73 65 20 73 70 69 6c 6c  bits those spill
3690: 73 20 74 68 61 74 0a 2a 2a 20 20 20 77 6f 75 6c  s that.**   woul
36a0: 64 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  d require a jour
36b0: 6e 61 6c 20 73 79 6e 63 2e 20 20 54 68 65 20 64  nal sync.  The d
36c0: 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 73  oNotSyncSpill is
36d0: 20 73 65 74 20 61 6e 64 20 63 6c 65 61 72 65 64   set and cleared
36e0: 20 0a 2a 2a 20 20 20 62 79 20 73 71 6c 69 74 65   .**   by sqlite
36f0: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 6e  3PagerWrite() in
3700: 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65 6e   order to preven
3710: 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  t a journal sync
3720: 20 66 72 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20   from happening 
3730: 0a 2a 2a 20 20 20 69 6e 20 62 65 74 77 65 65 6e  .**   in between
3740: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67   the journalling
3750: 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f 6e   of two pages on
3760: 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72   the same sector
3770: 2e 20 20 54 68 65 0a 2a 2a 20 20 20 64 6f 4e 6f  .  The.**   doNo
3780: 74 53 70 69 6c 6c 20 76 61 6c 75 65 20 73 65 74  tSpill value set
3790: 20 74 6f 20 70 72 65 76 65 6e 74 20 70 61 67 65   to prevent page
37a0: 72 53 74 72 65 73 73 28 29 20 66 72 6f 6d 20 74  rStress() from t
37b0: 72 79 69 6e 67 20 74 6f 20 75 73 65 0a 2a 2a 20  rying to use.** 
37c0: 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 75    the journal du
37d0: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
37e0: 0a 2a 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a  .**.** needSync.
37f0: 2a 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74  **.**   TODO: It
3800: 20 6d 69 67 68 74 20 62 65 20 65 61 73 69 65 72   might be easier
3810: 20 74 6f 20 73 65 74 20 74 68 69 73 20 76 61 72   to set this var
3820: 69 61 62 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f  iable in writeJo
3830: 75 72 6e 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20  urnalHdr().**   
3840: 61 6e 64 20 77 72 69 74 65 4d 61 73 74 65 72 4a  and writeMasterJ
3850: 6f 75 72 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43  ournal() only. C
3860: 68 61 6e 67 65 20 69 74 73 20 6d 65 61 6e 69 6e  hange its meanin
3870: 67 20 74 6f 20 22 75 6e 73 79 6e 63 65 64 20 64  g to "unsynced d
3880: 61 74 61 0a 2a 2a 20 20 20 68 61 73 20 62 65 65  ata.**   has bee
3890: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
38a0: 20 6a 6f 75 72 6e 61 6c 22 2e 0a 2a 2a 0a 2a 2a   journal"..**.**
38b0: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a   subjInMemory.**
38c0: 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20  .**   This is a 
38d0: 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65  boolean variable
38e0: 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20  . If true, then 
38f0: 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62  any required sub
3900: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73  -journal.**   is
3910: 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
3920: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
3930: 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20  file. If false, 
3940: 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  then in-memory.*
3950: 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73  *   sub-journals
3960: 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66   are only used f
3970: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  or in-memory pag
3980: 65 72 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 72  er files..*/.str
3990: 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71  uct Pager {.  sq
39a0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b  lite3_vfs *pVfs;
39b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20            /* OS 
39c0: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65  functions to use
39d0: 20 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20   for IO */.  u8 
39e0: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20  exclusiveMode;  
39f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c           /* Bool
3a00: 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63  ean. True if loc
3a10: 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55  king_mode==EXCLU
3a20: 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75  SIVE */.  u8 jou
3a30: 72 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20  rnalMode;       
3a40: 20 20 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74        /* On of t
3a50: 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  he PAGER_JOURNAL
3a60: 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  MODE_* values */
3a70: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
3a80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3a90: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
3aa0: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
3ab0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
3ac0: 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20  Readlock;       
3ad0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
3ae0: 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69   bother to obtai
3af0: 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20  n readlocks */. 
3b00: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
3b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3b20: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
3b30: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
3b40: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
3b50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3b60: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
3b70: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
3b80: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
3b90: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c   */.  u8 sync_fl
3ba0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
3bb0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43    /* One of SYNC
3bc0: 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f  _NORMAL or SYNC_
3bd0: 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d  FULL */.  u8 tem
3be0: 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  pFile;          
3bf0: 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
3c00: 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  me is a temporar
3c10: 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72  y file */.  u8 r
3c20: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
3c30: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3c40: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
3c50: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
3c60: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
3c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3c80: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
3c90: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20   file I/O */..  
3ca0: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
3cb0: 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20   block contains 
3cc0: 74 68 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62  those class memb
3cd0: 65 72 73 20 74 68 61 74 20 61 72 65 20 64 79 6e  ers that are dyn
3ce0: 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f  amically.  ** mo
3cf0: 64 69 66 69 65 64 20 64 75 72 69 6e 67 20 6e 6f  dified during no
3d00: 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e  rmal operations.
3d10: 20 54 68 65 20 6f 74 68 65 72 20 76 61 72 69 61   The other varia
3d20: 62 6c 65 73 20 69 6e 20 74 68 69 73 20 73 74 72  bles in this str
3d30: 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 72 65 20  ucture.  ** are 
3d40: 65 69 74 68 65 72 20 63 6f 6e 73 74 61 6e 74 20  either constant 
3d50: 74 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 6c  throughout the l
3d60: 69 66 65 74 69 6d 65 20 6f 66 20 74 68 65 20 70  ifetime of the p
3d70: 61 67 65 72 2c 20 6f 72 20 65 6c 73 65 0a 20 20  ager, or else.  
3d80: 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ** used to store
3d90: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 70   configuration p
3da0: 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 61  arameters that a
3db0: 66 66 65 63 74 20 74 68 65 20 77 61 79 20 74 68  ffect the way th
3dc0: 65 20 70 61 67 65 72 20 0a 20 20 2a 2a 20 6f 70  e pager .  ** op
3dd0: 65 72 61 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  erates..  **.  *
3de0: 2a 20 54 68 65 20 27 73 74 61 74 65 27 20 76 61  * The 'state' va
3df0: 72 69 61 62 6c 65 20 69 73 20 64 65 73 63 72 69  riable is descri
3e00: 62 65 64 20 69 6e 20 6d 6f 72 65 20 64 65 74 61  bed in more deta
3e10: 69 6c 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  il along with th
3e20: 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74 69  e.  ** descripti
3e30: 6f 6e 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ons of the value
3e40: 73 20 69 74 20 6d 61 79 20 74 61 6b 65 20 2d 20  s it may take - 
3e50: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 65 74 63  PAGER_UNLOCK etc
3e60: 2e 20 4d 61 6e 79 20 6f 66 20 74 68 65 0a 20 20  . Many of the.  
3e70: 2a 2a 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c  ** other variabl
3e80: 65 73 20 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b  es in this block
3e90: 20 61 72 65 20 64 65 73 63 72 69 62 65 64 20 69   are described i
3ea0: 6e 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 64 69  n the comment di
3eb0: 72 65 63 74 6c 79 20 0a 20 20 2a 2a 20 61 62 6f  rectly .  ** abo
3ec0: 76 65 20 74 68 69 73 20 63 6c 61 73 73 20 64 65  ve this class de
3ed0: 66 69 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  finition..  */. 
3ee0: 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20   u8 state;      
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3f00: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53  PAGER_UNLOCK, _S
3f10: 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44  HARED, _RESERVED
3f20: 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 64  , etc. */.  u8 d
3f30: 62 4d 6f 64 69 66 69 65 64 3b 20 20 20 20 20 20  bModified;      
3f40: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3f50: 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
3f60: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
3f70: 44 62 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53  Db */.  u8 needS
3f80: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
3f90: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
3fa0: 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65  n fsync() is nee
3fb0: 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  ded on the journ
3fc0: 61 6c 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  al */.  u8 journ
3fd0: 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20 20  alStarted;      
3fe0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68      /* True if h
3ff0: 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  eader of journal
4000: 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20   is synced */.  
4010: 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  u8 changeCountDo
4020: 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ne;         /* S
4030: 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65  et after increme
4040: 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  nting the change
4050: 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38  -counter */.  u8
4060: 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20   setMaster;     
4070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4080: 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20  e if a m-j name 
4090: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
40a0: 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38   to jrnl */.  u8
40b0: 20 64 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20 20   doNotSpill;    
40c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
40d0: 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61  not spill the ca
40e0: 63 68 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72  che when non-zer
40f0: 6f 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53  o */.  u8 doNotS
4100: 79 6e 63 53 70 69 6c 6c 3b 20 20 20 20 20 20 20  yncSpill;       
4110: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 6f 20     /* Do not do 
4120: 61 20 73 70 69 6c 6c 20 74 68 61 74 20 72 65 71  a spill that req
4130: 75 69 72 65 73 20 6a 72 6e 6c 20 73 79 6e 63 20  uires jrnl sync 
4140: 2a 2f 0a 20 20 75 38 20 64 62 53 69 7a 65 56 61  */.  u8 dbSizeVa
4150: 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  lid;            
4160: 20 2f 2a 20 53 65 74 20 77 68 65 6e 20 64 62 53   /* Set when dbS
4170: 69 7a 65 20 69 73 20 63 6f 72 72 65 63 74 20 2a  ize is correct *
4180: 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d  /.  u8 subjInMem
4190: 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ory;            
41a0: 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69  /* True to use i
41b0: 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75  n-memory sub-jou
41c0: 72 6e 61 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20  rnals */.  Pgno 
41d0: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
41e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
41f0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
4200: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
4210: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
4220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
4230: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
4240: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
4250: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
4260: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
4270: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4280: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
4290: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
42a0: 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20    int errCode;  
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
42c0: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
42d0: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
42e0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4300: 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61   /* Pages journa
4310: 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20  lled since last 
4320: 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  j-header written
4330: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
4340: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
4350: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
4360: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
4370: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
4380: 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63  */.  u32 nSubRec
4390: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
43a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
43b0: 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f  cords written to
43c0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
43d0: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
43e0: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
43f0: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
4400: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
4410: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
4420: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
4430: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
4440: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
4450: 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  for database */.
4460: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
4470: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  jfd;          /*
4480: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
4490: 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   for main journa
44a0: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  l */.  sqlite3_f
44b0: 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20  ile *sjfd;      
44c0: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
44d0: 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f  iptor for sub-jo
44e0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a  urnal */.  i64 j
44f0: 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20  ournalOff;      
4500: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
4510: 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69  t write offset i
4520: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
4530: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  le */.  i64 jour
4540: 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20  nalHdr;         
4550: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
4560: 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a  et to previous j
4570: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
4580: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69  .  i64 journalSi
4590: 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f  zeLimit;       /
45a0: 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72  * Size limit for
45b0: 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72   persistent jour
45c0: 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 50  nal files */.  P
45d0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61  agerSavepoint *a
45e0: 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72  Savepoint; /* Ar
45f0: 72 61 79 20 6f 66 20 61 63 74 69 76 65 20 73 61  ray of active sa
4600: 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e  vepoints */.  in
4610: 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  t nSavepoint;   
4620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4630: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
4640: 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20  in aSavepoint[] 
4650: 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65  */.  char dbFile
4660: 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20  Vers[16];       
4670: 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e   /* Changes when
4680: 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69  ever database fi
4690: 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  le changes */.  
46a0: 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20  u32 sectorSize; 
46b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
46c0: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
46d0: 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ze during rollba
46e0: 63 6b 20 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ck */..  u16 nEx
46f0: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
4700: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
4710: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
4720: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
4730: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
4740: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
4750: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4760: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
4770: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
4780: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
4790: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
47a0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
47b0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
47c0: 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  n() */.  int pag
47d0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
47e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
47f0: 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67  f bytes in a pag
4800: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67  e */.  Pgno mxPg
4810: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
4820: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c     /* Maximum al
4830: 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68  lowed size of th
4840: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
4850: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
4860: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4870: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
4880: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ase file */.  ch
4890: 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
48a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
48b0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
48c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28   file */.  int (
48d0: 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76  *xBusyHandler)(v
48e0: 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69  oid*); /* Functi
48f0: 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20  on to call when 
4900: 62 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  busy */.  void *
4910: 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b  pBusyHandlerArg;
4920: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
4930: 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78 42   argument for xB
4940: 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 23 69  usyHandler */.#i
4950: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
4960: 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69  .  int nHit, nMi
4970: 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ss;            /
4980: 2a 20 43 61 63 68 65 20 68 69 74 73 20 61 6e 64  * Cache hits and
4990: 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e   missing */.  in
49a0: 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b  t nRead, nWrite;
49b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
49c0: 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61 64  abase pages read
49d0: 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64  /written */.#end
49e0: 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  if.  void (*xRei
49f0: 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b  niter)(DbPage*);
4a00: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
4a10: 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61  utine when reloa
4a20: 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69  ding pages */.#i
4a30: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
4a40: 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a  CODEC.  void *(*
4a50: 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
4a60: 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f  id*,Pgno,int); /
4a70: 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e  * Routine for en
4a80: 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a  /decoding data *
4a90: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  /.  void (*xCode
4aa0: 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a  cSizeChng)(void*
4ab0: 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f  ,int,int); /* No
4ac0: 74 69 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a  tify of page siz
4ad0: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76  e changes */.  v
4ae0: 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65  oid (*xCodecFree
4af0: 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20  )(void*);       
4b00: 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63        /* Destruc
4b10: 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65  tor for the code
4b20: 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f  c */.  void *pCo
4b30: 64 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  dec;            
4b40: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
4b50: 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e  ment to xCodec..
4b60: 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e  . methods */.#en
4b70: 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70  dif.  char *pTmp
4b80: 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
4b90: 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53    /* Pager.pageS
4ba0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
4bb0: 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a  ce for tmp use *
4bc0: 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61  /.  PCache *pPCa
4bd0: 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  che;            
4be0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
4bf0: 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20  ge cache object 
4c00: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63  */.  sqlite3_bac
4c10: 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20  kup *pBackup;   
4c20: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c   /* Pointer to l
4c30: 69 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62  ist of ongoing b
4c40: 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20  ackup processes 
4c50: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
4c60: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c  E_OMIT_WAL.  Wal
4c70: 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20   *pWal;         
4c80: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
4c90: 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64  e-ahead log used
4ca0: 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   by "journal_mod
4cb0: 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72  e=wal" */.  char
4cc0: 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20   *zWal;         
4cd0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
4ce0: 6e 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61  name for write-a
4cf0: 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64  head log */.#end
4d00: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  if.};../*.** The
4d10: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
4d20: 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64  l variables hold
4d30: 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66   counters used f
4d40: 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75  or.** testing pu
4d50: 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68  rposes only.  Th
4d60: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f  ese variables do
4d70: 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a   not exist in.**
4d80: 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62   a non-testing b
4d90: 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72  uild.  These var
4da0: 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74  iables are not t
4db0: 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23  hread-safe..*/.#
4dc0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
4dd0: 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  T.int sqlite3_pa
4de0: 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
4df0: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
4e00: 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73  er of full pages
4e10: 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f   read from DB */
4e20: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
4e30: 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74  er_writedb_count
4e40: 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65   = 0;   /* Numbe
4e50: 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20  r of full pages 
4e60: 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f  written to DB */
4e70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
4e80: 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20  er_writej_count 
4e90: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  = 0;    /* Numbe
4ea0: 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74  r of pages writt
4eb0: 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f  en to journal */
4ec0: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
4ed0: 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c  INCR(v)  v++.#el
4ee0: 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45  se.# define PAGE
4ef0: 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66  R_INCR(v).#endif
4f00: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61  ..../*.** Journa
4f10: 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69  l files begin wi
4f20: 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
4f30: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20   magic string.  
4f40: 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20  The data.** was 
4f50: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64  obtained from /d
4f60: 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69  ev/random.  It i
4f70: 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61  s used only as a
4f80: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a   sanity check..*
4f90: 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69  *.** Since versi
4fa0: 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f  on 2.8.0, the jo
4fb0: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
4fc0: 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c  tains additional
4fd0: 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b   sanity.** check
4fe0: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  ing information.
4ff0: 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66    If the power f
5000: 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a  ails while the j
5010: 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a  ournal is being.
5020: 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69  ** written, semi
5030: 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20  -random garbage 
5040: 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61  data might appea
5050: 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
5060: 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70  .** file after p
5070: 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
5080: 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74  .  If an attempt
5090: 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a   is then made.**
50a0: 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75   to roll the jou
50b0: 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64  rnal back, the d
50c0: 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65  atabase could be
50d0: 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65   corrupted.  The
50e0: 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73   additional.** s
50f0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64  anity checking d
5100: 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ata is an attemp
5110: 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68  t to discover th
5120: 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65  e garbage in the
5130: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
5140: 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ignore it..**.**
5150: 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   The sanity chec
5160: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
5170: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75   for the new jou
5180: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73  rnal format cons
5190: 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d  ists.** of a 32-
51a0: 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20  bit checksum on 
51b0: 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74  each page of dat
51c0: 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d  a.  The checksum
51d0: 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20   covers both.** 
51e0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
51f0: 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e  and the pPager->
5200: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
5210: 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70  f data for the p
5220: 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73  age..** This cks
5230: 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  um is initialize
5240: 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61  d to a 32-bit ra
5250: 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20  ndom value that 
5260: 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a  appears in the.*
5270: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72  * journal file r
5280: 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68  ight after the h
5290: 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64  eader.  The rand
52a0: 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69  om initializer i
52b0: 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20  s important,.** 
52c0: 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20  because garbage 
52d0: 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72  data that appear
52e0: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
52f0: 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b  a journal is lik
5300: 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74  ely.** data that
5310: 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68   was once in oth
5320: 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61  er files that ha
5330: 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65  ve now been dele
5340: 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  ted.  If the.** 
5350: 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d  garbage data cam
5360: 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65  e from an obsole
5370: 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  te journal file,
5380: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d   the checksums m
5390: 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65  ight.** be corre
53a0: 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74  ct.  But by init
53b0: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65  ializing the che
53c0: 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20  cksum to random 
53d0: 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69  value which.** i
53e0: 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20  s different for 
53f0: 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77  every journal, w
5400: 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20  e minimize that 
5410: 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  risk..*/.static 
5420: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
5430: 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  har aJournalMagi
5440: 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20  c[] = {.  0xd9, 
5450: 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39  0xd5, 0x05, 0xf9
5460: 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78  , 0x20, 0xa1, 0x
5470: 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a  63, 0xd7,.};../*
5480: 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
5490: 74 68 65 20 6f 66 20 65 61 63 68 20 70 61 67 65  the of each page
54a0: 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a   record in the j
54b0: 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20  ournal is given 
54c0: 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  by.** the follow
54d0: 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64  ing macro..*/.#d
54e0: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47  efine JOURNAL_PG
54f0: 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70  _SZ(pPager)  ((p
5500: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
5510: 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   + 8)../*.** The
5520: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5530: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61  size for this pa
5540: 67 65 72 2e 20 54 68 69 73 20 69 73 20 75 73 75  ger. This is usu
5550: 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a  ally the same .*
5560: 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67  * size as a sing
5570: 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20  le disk sector. 
5580: 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74  See also setSect
5590: 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65  orSize()..*/.#de
55a0: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  fine JOURNAL_HDR
55b0: 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61  _SZ(pPager) (pPa
55c0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
55d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72  ../*.** The macr
55e0: 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20  o MEMDB is true 
55f0: 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  if we are dealin
5600: 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d  g with an in-mem
5610: 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  ory database..**
5620: 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61   We do this as a
5630: 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69   macro so that i
5640: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49  f the SQLITE_OMI
5650: 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f  T_MEMORYDB macro
5660: 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20   is set,.** the 
5670: 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77  value of MEMDB w
5680: 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e  ill be a constan
5690: 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c  t and the compil
56a0: 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65  er will optimize
56b0: 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61  .** out code tha
56c0: 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78  t would never ex
56d0: 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  ecute..*/.#ifdef
56e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
56f0: 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d  ORYDB.# define M
5700: 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64  EMDB 0.#else.# d
5710: 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67  efine MEMDB pPag
5720: 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66  er->memDb.#endif
5730: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ../*.** The maxi
5740: 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  mum legal page n
5750: 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d  umber is (2^31 -
5760: 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20   1)..*/.#define 
5770: 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32  PAGER_MAX_PGNO 2
5780: 31 34 37 34 38 33 36 34 37 0a 0a 23 69 66 6e 64  147483647..#ifnd
5790: 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a  ef NDEBUG ./*.**
57a0: 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   Usage:.**.**   
57b0: 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
57c0: 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
57d0: 72 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20  r) );.*/.static 
57e0: 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65 72  int assert_pager
57f0: 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 50  _state(Pager *pP
5800: 61 67 65 72 29 7b 0a 0a 20 20 2f 2a 20 41 20 74  ager){..  /* A t
5810: 65 6d 70 2d 66 69 6c 65 20 69 73 20 61 6c 77 61  emp-file is alwa
5820: 79 73 20 69 6e 20 50 41 47 45 52 5f 45 58 43 4c  ys in PAGER_EXCL
5830: 55 53 49 56 45 20 6f 72 20 50 41 47 45 52 5f 53  USIVE or PAGER_S
5840: 59 4e 43 45 44 20 73 74 61 74 65 2e 20 2a 2f 0a  YNCED state. */.
5850: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
5860: 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
5870: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
5880: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
5890: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 63 68 61  );..  /* The cha
58a0: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61  ngeCountDone fla
58b0: 67 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20  g is always set 
58c0: 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 20 2a  for temp-files *
58d0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
58e0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20  er->tempFile==0 
58f0: 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  || pPager->chang
5900: 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20  eCountDone );.. 
5910: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
5920: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
5930: 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73 20  n true if it is 
5940: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
5950: 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74  te page *pPg int
5960: 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
5970: 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65  l..** A page nee
5980: 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ds to be written
5990: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
59a0: 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65  urnal if there e
59b0: 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20  xists one.** or 
59c0: 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f  more open savepo
59d0: 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a  ints for which:.
59e0: 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61  **.**   * The pa
59f0: 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge-number is les
5a00: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
5a10: 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  to PagerSavepoin
5a20: 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20  t.nOrig, and.** 
5a30: 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72    * The bit corr
5a40: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
5a50: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
5a60: 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20  not set in.**   
5a70: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
5a80: 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a  .pInSavepoint..*
5a90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  /.static int sub
5aa0: 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50 67  jRequiresPage(Pg
5ab0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 67 6e  Hdr *pPg){.  Pgn
5ac0: 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  o pgno = pPg->pg
5ad0: 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  no;.  Pager *pPa
5ae0: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
5af0: 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  r;.  int i;.  fo
5b00: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d  r(i=0; i<pPager-
5b10: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b  >nSavepoint; i++
5b20: 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65  ){.    PagerSave
5b30: 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67  point *p = &pPag
5b40: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
5b50: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f  ];.    if( p->nO
5b60: 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d  rig>=pgno && 0==
5b70: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
5b80: 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  t(p->pInSavepoin
5b90: 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  t, pgno) ){.    
5ba0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
5bb0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
5bc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
5bd0: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61  n true if the pa
5be0: 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ge is already in
5bf0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5c00: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
5c10: 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50   pageInJournal(P
5c20: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65  gHdr *pPg){.  re
5c30: 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76  turn sqlite3Bitv
5c40: 65 63 54 65 73 74 28 70 50 67 2d 3e 70 50 61 67  ecTest(pPg->pPag
5c50: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
5c60: 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f  pPg->pgno);.}../
5c70: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62  *.** Read a 32-b
5c80: 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20  it integer from 
5c90: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
5ca0: 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72  escriptor.  Stor
5cb0: 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  e the integer.**
5cc0: 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e   that is read in
5cd0: 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20   *pRes.  Return 
5ce0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
5cf0: 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20  rything worked, 
5d00: 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63  or an.** error c
5d10: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
5d20: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a   goes wrong..**.
5d30: 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72  ** All values ar
5d40: 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b  e stored on disk
5d50: 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a   as big-endian..
5d60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
5d70: 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33  ad32bits(sqlite3
5d80: 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f  _file *fd, i64 o
5d90: 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73  ffset, u32 *pRes
5da0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
5db0: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20  ar ac[4];.  int 
5dc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
5dd0: 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f  ad(fd, ac, sizeo
5de0: 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a  f(ac), offset);.
5df0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5e00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  _OK ){.    *pRes
5e10: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
5e20: 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65  te(ac);.  }.  re
5e30: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
5e40: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
5e50: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20   integer into a 
5e60: 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e  string buffer in
5e70: 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65   big-endian byte
5e80: 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69   order..*/.#defi
5e90: 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42  ne put32bits(A,B
5ea0: 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79  )  sqlite3Put4by
5eb0: 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a  te((u8*)A,B)../*
5ec0: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
5ed0: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
5ee0: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
5ef0: 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75  escriptor.  Retu
5f00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
5f10: 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
5f20: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
5f30: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
5f40: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
5f50: 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28 73  nt write32bits(s
5f60: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
5f70: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
5f80: 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63   val){.  char ac
5f90: 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73  [4];.  put32bits
5fa0: 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74  (ac, val);.  ret
5fb0: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69  urn sqlite3OsWri
5fc0: 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66  te(fd, ac, 4, of
5fd0: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fset);.}../*.** 
5fe0: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  The argument to 
5ff0: 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20  this macro is a 
6000: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
6010: 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69  (type sqlite3_fi
6020: 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  le*)..** Return 
6030: 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f  0 if it is not o
6040: 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  pen, or non-zero
6050: 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20   (but not 1) if 
6060: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  it is..**.** Thi
6070: 73 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70  s is so that exp
6080: 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20  ressions can be 
6090: 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a  written as:.**.*
60a0: 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  *   if( isOpen(p
60b0: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e  Pager->jfd) ){ .
60c0: 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64  ...**.** instead
60d0: 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20   of.**.**   if( 
60e0: 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
60f0: 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a  thods ){ ....*/.
6100: 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70  #define isOpen(p
6110: 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74  Fd) ((pFd)->pMet
6120: 68 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  hods)../*.** If 
6130: 66 69 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e  file pFd is open
6140: 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73  , call sqlite3Os
6150: 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a  Unlock() on it..
6160: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73  */.static int os
6170: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
6180: 69 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c  ile *pFd, int eL
6190: 6f 63 6b 29 7b 0a 20 20 69 66 28 20 21 69 73 4f  ock){.  if( !isO
61a0: 70 65 6e 28 70 46 64 29 20 29 7b 0a 20 20 20 20  pen(pFd) ){.    
61b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
61c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
61d0: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
61e0: 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f  Fd, eLock);.}../
61f0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
6200: 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  on determines wh
6210: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
6220: 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
6230: 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61  timization.** ca
6240: 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74  n be used with t
6250: 68 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f  his pager. The o
6260: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
6270: 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a  be used if:.**.*
6280: 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65  *  (a) the value
6290: 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44   returned by OsD
62a0: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
62b0: 74 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73  tics() indicates
62c0: 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20   that.**      a 
62d0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61  database page ma
62e0: 79 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f  y be written ato
62f0: 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20  mically, and.** 
6300: 20 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72   (b) the value r
6310: 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63  eturned by OsSec
6320: 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73  torSize() is les
6330: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  s than or equal.
6340: 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70  **      to the p
6350: 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  age size..**.** 
6360: 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  The optimization
6370: 20 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20   is also always 
6380: 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70  enabled for temp
6390: 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20  orary files. It 
63a0: 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74  is.** an error t
63b0: 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  o call this func
63c0: 74 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69  tion if pPager i
63d0: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69  s opened on an i
63e0: 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61  n-memory.** data
63f0: 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  base..**.** If t
6400: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
6410: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20  cannot be used, 
6420: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  0 is returned. I
6430: 66 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64  f it can be used
6440: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61  ,.** then the va
6450: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
6460: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
6470: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65  journal file whe
6480: 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  n it.** contains
6490: 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66   rollback data f
64a0: 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70  or exactly one p
64b0: 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  age..*/.#ifdef S
64c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
64d0: 4d 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63  MIC_WRITE.static
64e0: 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53   int jrnlBufferS
64f0: 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
6500: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d  r){.  assert( !M
6510: 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70  EMDB );.  if( !p
6520: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
6530: 29 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20  ){.    int dc;  
6540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6550: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69           /* Devi
6560: 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
6570: 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53  cs */.    int nS
6580: 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20  ector;          
6590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
65a0: 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20  ector size */.  
65b0: 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20    int szPage;   
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65d0: 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65      /* Page size
65e0: 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
65f0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
6600: 66 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20  fd) );.    dc = 
6610: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
6620: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
6630: 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
6640: 6e 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72  nSector = pPager
6650: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20  ->sectorSize;.  
6660: 20 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65    szPage = pPage
6670: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20  r->pageSize;..  
6680: 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
6690: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d  IOCAP_ATOMIC512=
66a0: 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20  =(512>>8));.    
66b0: 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
66c0: 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28  CAP_ATOMIC64K==(
66d0: 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20  65536>>8));.    
66e0: 69 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49  if( 0==(dc&(SQLI
66f0: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c  TE_IOCAP_ATOMIC|
6700: 28 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20  (szPage>>8)) || 
6710: 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20  nSector>szPage) 
6720: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
6730: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
6740: 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48  return JOURNAL_H
6750: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20  DR_SZ(pPager) + 
6760: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
6770: 61 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ager);.}.#endif.
6780: 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  ./*.** If SQLITE
6790: 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20  _CHECK_PAGES is 
67a0: 64 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20  defined then we 
67b0: 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63  do some sanity c
67c0: 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68  hecking.** on th
67d0: 65 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20  e cache using a 
67e0: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20  hash function.  
67f0: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
6800: 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20   testing.** and 
6810: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
6820: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
6830: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a  _CHECK_PAGES./*.
6840: 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62  ** Return a 32-b
6850: 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70  it hash of the p
6860: 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61  age data for pPa
6870: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  ge..*/.static u3
6880: 32 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  2 pager_datahash
6890: 28 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69  (int nByte, unsi
68a0: 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61  gned char *pData
68b0: 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20  ){.  u32 hash = 
68c0: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  0;.  int i;.  fo
68d0: 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20  r(i=0; i<nByte; 
68e0: 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d  i++){.    hash =
68f0: 20 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70   (hash*1039) + p
6900: 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72  Data[i];.  }.  r
6910: 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74  eturn hash;.}.st
6920: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70  atic u32 pager_p
6930: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
6940: 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  Page){.  return 
6950: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70  pager_datahash(p
6960: 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61  Page->pPager->pa
6970: 67 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65  geSize, (unsigne
6980: 64 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e  d char *)pPage->
6990: 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63  pData);.}.static
69a0: 20 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f   void pager_set_
69b0: 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a  pagehash(PgHdr *
69c0: 70 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d  pPage){.  pPage-
69d0: 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
69e0: 72 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65  r_pagehash(pPage
69f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
6a00: 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f  CHECK_PAGE macro
6a10: 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20   takes a PgHdr* 
6a20: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
6a30: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
6a40: 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69  PAGES.** is defi
6a50: 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20  ned, and NDEBUG 
6a60: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20  is not defined, 
6a70: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
6a80: 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20  ement checks.** 
6a90: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
6aa0: 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72   either dirty or
6ab0: 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74   still matches t
6ac0: 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61  he calculated pa
6ad0: 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66  ge-hash..*/.#def
6ae0: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
6af0: 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73  ) checkPage(x).s
6b00: 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
6b10: 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
6b20: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
6b30: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
6b40: 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d  .  assert( !pPg-
6b50: 3e 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61  >pageHash || pPa
6b60: 67 65 72 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20  ger->errCode.   
6b70: 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67     || (pPg->flag
6b80: 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c  s&PGHDR_DIRTY) |
6b90: 7c 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d  | pPg->pageHash=
6ba0: 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28  =pager_pagehash(
6bb0: 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65  pPg) );.}..#else
6bc0: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64  .#define pager_d
6bd0: 61 74 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a  atahash(X,Y)  0.
6be0: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61  #define pager_pa
6bf0: 67 65 68 61 73 68 28 58 29 20 20 30 0a 23 64 65  gehash(X)  0.#de
6c00: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
6c10: 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51  x).#endif  /* SQ
6c20: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
6c30: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20   */../*.** When 
6c40: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74  this is called t
6c50: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
6c60: 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
6c70: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a   must be open..*
6c80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
6c90: 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64  attempts to read
6ca0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
6cb0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d  l file name from
6cc0: 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20   the .** end of 
6cd0: 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66  the file and, if
6ce0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70   successful, cop
6cf0: 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f  ies it into memo
6d00: 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20  ry supplied .** 
6d10: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53  by the caller. S
6d20: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
6d30: 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  e writeMasterJou
6d40: 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66  rnal() for the f
6d50: 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f  ormat.** used to
6d60: 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20   store a master 
6d70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
6d80: 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
6d90: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  a journal file..
6da0: 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75  **.** zMaster mu
6db0: 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  st point to a bu
6dc0: 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74  ffer of at least
6dd0: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 61   nMaster bytes a
6de0: 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
6df0: 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20  he caller. This 
6e00: 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65  should be sqlite
6e10: 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65  3_vfs.mxPathname
6e20: 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68  +1 (to ensure th
6e30: 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68  ere is.** enough
6e40: 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20   space to write 
6e50: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
6e60: 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65  al name). If the
6e70: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
6e80: 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a  ** name in the j
6e90: 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72  ournal is longer
6ea0: 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79   than nMaster by
6eb0: 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61  tes (including a
6ec0: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
6ed0: 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69  or), then this i
6ee0: 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20  s handled as if 
6ef0: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
6f00: 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70  l name.** were p
6f10: 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f  resent in the jo
6f20: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
6f30: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
6f40: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72   file name is pr
6f50: 65 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64  esent at the end
6f60: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
6f70: 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  ** file, then it
6f80: 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20   is copied into 
6f90: 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
6fa0: 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
6fb0: 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  . A.** nul-termi
6fc0: 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20 61 70  nator byte is ap
6fd0: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75  pended to the bu
6fe0: 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ffer following t
6ff0: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
7000: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a  rnal file name..
7010: 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64  **.** If it is d
7020: 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e  etermined that n
7030: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
7040: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72   file name is pr
7050: 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65  esent .** zMaste
7060: 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30  r[0] is set to 0
7070: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
7080: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
7090: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
70a0: 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  s while reading 
70b0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
70c0: 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65   file, an SQLite
70d0: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
70e0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
70f0: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61  tatic int readMa
7100: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69  sterJournal(sqli
7110: 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c  te3_file *pJrnl,
7120: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20   char *zMaster, 
7130: 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20  u32 nMaster){.  
7140: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
7150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
7160: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
7170: 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  32 len;         
7180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
7190: 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20  gth in bytes of 
71a0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
71b0: 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a  ame */.  i64 szJ
71c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
71d0: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
71e0: 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f  e in bytes of jo
71f0: 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c  urnal file pJrnl
7200: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
7210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7220: 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20   /* MJ checksum 
7230: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
7240: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
7250: 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
7260: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
7270: 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
7280: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
7290: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20  har aMagic[8];  
72a0: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
72b0: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
72c0: 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74  eader */.  zMast
72d0: 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  er[0] = '\0';.. 
72e0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
72f0: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
7300: 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26  ileSize(pJrnl, &
7310: 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c  szJ)).   || szJ<
7320: 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  16.   || SQLITE_
7330: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
7340: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  bits(pJrnl, szJ-
7350: 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c  16, &len)).   ||
7360: 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20   len>=nMaster . 
7370: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
7380: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
7390: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20  (pJrnl, szJ-12, 
73a0: 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53  &cksum)).   || S
73b0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
73c0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
73d0: 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20  rnl, aMagic, 8, 
73e0: 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65  szJ-8)).   || me
73f0: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
7400: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20  urnalMagic, 8). 
7410: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
7420: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52  (rc = sqlite3OsR
7430: 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74  ead(pJrnl, zMast
7440: 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d  er, len, szJ-16-
7450: 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  len)).  ){.    r
7460: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
7470: 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63   /* See if the c
7480: 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20  hecksum matches 
7490: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
74a0: 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72  al name */.  for
74b0: 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b  (u=0; u<len; u++
74c0: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20  ){.    cksum -= 
74d0: 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a  zMaster[u];.  }.
74e0: 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20    if( cksum ){. 
74f0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65     /* If the che
7500: 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64  cksum doesn't ad
7510: 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f  d up, then one o
7520: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69  r more of the di
7530: 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a  sk sectors.    *
7540: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
7550: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7560: 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72  filename is corr
7570: 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e  upted. This mean
7580: 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74  s.    ** definit
7590: 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73  ely roll back, s
75a0: 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  o just return SQ
75b0: 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f  LITE_OK and repo
75c0: 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a  rt a (nul).    *
75d0: 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
75e0: 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a   filename..    *
75f0: 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20  /.    len = 0;. 
7600: 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e   }.  zMaster[len
7610: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20  ] = '\0';.   .  
7620: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7630: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
7640: 6e 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  n the offset of 
7650: 74 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  the sector bound
7660: 61 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69  ary at or immedi
7670: 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  ately .** follow
7680: 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ing the value in
7690: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
76a0: 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20  Off, assuming a 
76b0: 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20  sector .** size 
76c0: 6f 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  of pPager->secto
76d0: 72 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a  rSize bytes..**.
76e0: 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63  ** i.e for a sec
76f0: 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a  tor size of 512:
7700: 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a  .**.**   Pager.j
7710: 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20  ournalOff       
7720: 20 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a     Return value.
7730: 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
7740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
7760: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
7770: 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a              0.**
7780: 20 20 20 35 31 32 20 20 20 20 20 20 20 20 20 20     512          
7790: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
77a0: 0a 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20 20  .**   100       
77b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77c0: 35 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20  512.**   2000   
77d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77e0: 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73     2048.** .*/.s
77f0: 74 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61  tatic i64 journa
7800: 6c 48 64 72 4f 66 66 73 65 74 28 50 61 67 65 72  lHdrOffset(Pager
7810: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
7820: 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69   offset = 0;.  i
7830: 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a  64 c = pPager->j
7840: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28  ournalOff;.  if(
7850: 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74   c ){.    offset
7860: 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41   = ((c-1)/JOURNA
7870: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
7880: 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f   + 1) * JOURNAL_
7890: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
78a0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66    }.  assert( of
78b0: 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52  fset%JOURNAL_HDR
78c0: 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29  _SZ(pPager)==0 )
78d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
78e0: 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72  et>=c );.  asser
78f0: 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f  t( (offset-c)<JO
7900: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
7910: 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
7920: 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   offset;.}../*.*
7930: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
7940: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
7950: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
7960: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  on is called..**
7970: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
7980: 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  n is a no-op if 
7990: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
79a0: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72   has not been wr
79b0: 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68  itten to.** with
79c0: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  in the current t
79d0: 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e  ransaction (i.e.
79e0: 20 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   if Pager.journa
79f0: 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20  lOff==0)..**.** 
7a00: 49 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73  If doTruncate is
7a10: 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65   non-zero or the
7a20: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69   Pager.journalSi
7a30: 7a 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65  zeLimit variable
7a40: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c   is.** set to 0,
7a50: 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74   then truncate t
7a60: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7a70: 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
7a80: 20 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65   size. Otherwise
7a90: 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38  ,.** zero the 28
7aa0: 2d 62 79 74 65 20 68 65 61 64 65 72 20 61 74 20  -byte header at 
7ab0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
7ac0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
7ad0: 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a  n either case, .
7ae0: 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ** if the pager 
7af0: 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e  is not in no-syn
7b00: 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65  c mode, sync the
7b10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d   journal file im
7b20: 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66  mediately .** af
7b30: 74 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74  ter writing or t
7b40: 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a  runcating it..**
7b50: 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75  .** If Pager.jou
7b60: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73  rnalSizeLimit is
7b70: 20 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69   set to a positi
7b80: 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  ve, non-zero val
7b90: 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f  ue, and.** follo
7ba0: 77 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74  wing the truncat
7bb0: 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64  ion or zeroing d
7bc0: 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 74  escribed above t
7bd0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a  he size of the .
7be0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
7bf0: 69 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72 67  in bytes is larg
7c00: 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c  er than this val
7c10: 75 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74  ue, then truncat
7c20: 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  e the.** journal
7c30: 20 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a   file to Pager.j
7c40: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
7c50: 62 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e  bytes. The journ
7c60: 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20  al file does.** 
7c70: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73  not need to be s
7c80: 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20  ynced following 
7c90: 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  this operation..
7ca0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
7cb0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61  rror occurs, aba
7cc0: 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  ndon processing 
7cd0: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 49  and return the I
7ce0: 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  O error code..**
7cf0: 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
7d00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  rn SQLITE_OK..*/
7d10: 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f  .static int zero
7d20: 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72  JournalHdr(Pager
7d30: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f   *pPager, int do
7d40: 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74  Truncate){.  int
7d50: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
7d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7d80: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
7d90: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
7da0: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
7db0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
7dc0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20  journalOff ){.  
7dd0: 20 20 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d    const i64 iLim
7de0: 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  it = pPager->jou
7df0: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20  rnalSizeLimit;  
7e00: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
7e10: 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20   of jsl */..    
7e20: 49 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48  IOTRACE(("JZEROH
7e30: 44 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  DR %p\n", pPager
7e40: 29 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75  )).    if( doTru
7e50: 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d  ncate || iLimit=
7e60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
7e70: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
7e80: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
7e90: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
7ea0: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
7eb0: 74 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32  t char zeroHdr[2
7ec0: 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20  8] = {0};.      
7ed0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
7ee0: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
7ef0: 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66   zeroHdr, sizeof
7f00: 28 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20  (zeroHdr), 0);. 
7f10: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
7f20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70  =SQLITE_OK && !p
7f30: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
7f40: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
7f50: 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
7f60: 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59  ->jfd, SQLITE_SY
7f70: 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67  NC_DATAONLY|pPag
7f80: 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
7f90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
7fa0: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
7fb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
7fc0: 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68  committed but th
7fd0: 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20  e write lock .  
7fe0: 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65    ** is still he
7ff0: 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20  ld on the file. 
8000: 49 66 20 74 68 65 72 65 20 69 73 20 61 20 73 69  If there is a si
8010: 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75  ze limit configu
8020: 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20  red for .    ** 
8030: 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a  the persistent j
8040: 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a  ournal and the j
8050: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72  ournal file curr
8060: 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d  ently consumes m
8070: 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65  ore.    ** space
8080: 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74   than that limit
8090: 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75   allows for, tru
80a0: 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68  ncate it now. Th
80b0: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20  ere is no need. 
80c0: 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68     ** to sync th
80d0: 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67  e file following
80e0: 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e   this operation.
80f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
8100: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
8110: 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20   iLimit>0 ){.   
8120: 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20     i64 sz;.     
8130: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
8140: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
8150: 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20  jfd, &sz);.     
8160: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8170: 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20  OK && sz>iLimit 
8180: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
8190: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
81a0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  e(pPager->jfd, i
81b0: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a  Limit);.      }.
81c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
81d0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
81e0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
81f0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
8200: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
8210: 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75  is called. A jou
8220: 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28  rnal.** header (
8230: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
8240: 79 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e  ytes) is written
8250: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
8260: 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a  l file at the.**
8270: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
8280: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  n..**.** The for
8290: 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  mat for the jour
82a0: 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73  nal header is as
82b0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38   follows:.** - 8
82c0: 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64   bytes: Magic id
82d0: 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61  entifying journa
82e0: 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34  l format..** - 4
82f0: 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f   bytes: Number o
8300: 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75  f records in jou
8310: 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73  rnal, or -1 no-s
8320: 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a  ync mode is on..
8330: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61  ** - 4 bytes: Ra
8340: 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64  ndom number used
8350: 20 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a   for page hash..
8360: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e  ** - 4 bytes: In
8370: 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70  itial database p
8380: 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20  age count..** - 
8390: 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20  4 bytes: Sector 
83a0: 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65  size used by the
83b0: 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72   process that wr
83c0: 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ote this journal
83d0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
83e0: 44 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  Database page si
83f0: 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f  ze..** .** Follo
8400: 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f  wed by (JOURNAL_
8410: 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74  HDR_SZ - 28) byt
8420: 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61  es of unused spa
8430: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ce..*/.static in
8440: 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  t writeJournalHd
8450: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
8460: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
8470: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
8480: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
8490: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72  n code */.  char
84a0: 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67   *zHeader = pPag
84b0: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20  er->pTmpSpace;  
84c0: 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61  /* Temporary spa
84d0: 63 65 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64  ce used to build
84e0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
84f0: 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67 65   nHeader = pPage
8500: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 20  r->pageSize;    
8510: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66   /* Size of buff
8520: 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  er pointed to by
8530: 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33   zHeader */.  u3
8540: 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  2 nWrite;       
8550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8560: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65    /* Bytes of he
8570: 61 64 65 72 20 73 65 63 74 6f 72 20 77 72 69 74  ader sector writ
8580: 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b  ten */.  int ii;
8590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
85b0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
85c0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
85d0: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
85e0: 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61  ;      /* Journa
85f0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
8600: 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e  pen. */..  if( n
8610: 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48  Header>JOURNAL_H
8620: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b  DR_SZ(pPager) ){
8630: 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a  .    nHeader = J
8640: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
8650: 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
8660: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63   If there are ac
8670: 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
8680: 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20  and any of them 
8690: 77 65 72 65 20 63 72 65 61 74 65 64 20 0a 20 20  were created .  
86a0: 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73  ** since the mos
86b0: 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c  t recent journal
86c0: 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74   header was writ
86d0: 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20  ten, update the 
86e0: 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70  .  ** PagerSavep
86f0: 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20  oint.iHdrOffset 
8700: 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f  fields now..  */
8710: 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
8720: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
8730: 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69  nt; ii++){.    i
8740: 66 28 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65  f( pPager->aSave
8750: 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66  point[ii].iHdrOf
8760: 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  fset==0 ){.     
8770: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
8780: 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73  int[ii].iHdrOffs
8790: 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  et = pPager->jou
87a0: 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20  rnalOff;.    }. 
87b0: 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
87c0: 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
87d0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
87e0: 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
87f0: 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20  (pPager);..  /* 
8800: 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20  .  ** Write the 
8810: 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65  nRec Field - the
8820: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
8830: 72 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c  records that fol
8840: 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f  low this.  ** jo
8850: 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f  urnal header. No
8860: 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20  rmally, zero is 
8870: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20  written to this 
8880: 76 61 6c 75 65 20 61 74 20 74 68 69 73 20 74 69  value at this ti
8890: 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74  me..  ** After t
88a0: 68 65 20 72 65 63 6f 72 64 73 20 61 72 65 20 61  he records are a
88b0: 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72  dded to the jour
88c0: 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75  nal (and the jou
88d0: 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20  rnal synced, .  
88e0: 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79  ** if in full-sy
88f0: 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65  nc mode), the ze
8900: 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74 74 65  ro is overwritte
8910: 6e 20 77 69 74 68 20 74 68 65 20 74 72 75 65 20  n with the true 
8920: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72  number.  ** of r
8930: 65 63 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63  ecords (see sync
8940: 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a  Journal())..  **
8950: 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61  .  ** A faster a
8960: 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f  lternative is to
8970: 20 77 72 69 74 65 20 30 78 46 46 46 46 46 46 46   write 0xFFFFFFF
8980: 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69  F to the nRec fi
8990: 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72  eld. When.  ** r
89a0: 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  eading the journ
89b0: 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20 74 65  al this value te
89c0: 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73  lls SQLite to as
89d0: 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20  sume that the.  
89e0: 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a  ** rest of the j
89f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74  ournal file cont
8a00: 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20  ains valid page 
8a10: 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73  records. This as
8a20: 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  sumption.  ** is
8a30: 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69   dangerous, as i
8a40: 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75  f a failure occu
8a50: 72 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74  rred whilst writ
8a60: 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
8a70: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20  al.  ** file it 
8a80: 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65  may contain some
8a90: 20 67 61 72 62 61 67 65 20 64 61 74 61 2e 20 54   garbage data. T
8aa0: 68 65 72 65 20 61 72 65 20 74 77 6f 20 73 63 65  here are two sce
8ab0: 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72  narios.  ** wher
8ac0: 65 20 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20  e this risk can 
8ad0: 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a  be ignored:.  **
8ae0: 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74  .  **   * When t
8af0: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e  he pager is in n
8b00: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72  o-sync mode. Cor
8b10: 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c  ruption can foll
8b20: 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f  ow a.  **     po
8b30: 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74  wer failure in t
8b40: 68 69 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e  his case anyway.
8b50: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
8b60: 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49  hen the SQLITE_I
8b70: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
8b80: 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68   flag is set. Th
8b90: 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20  is guarantees.  
8ba0: 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61 72 62  **     that garb
8bb0: 61 67 65 20 64 61 74 61 20 69 73 20 6e 65 76 65  age data is neve
8bc0: 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  r appended to th
8bd0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
8be0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69    */.  assert( i
8bf0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
8c00: 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ) || pPager->noS
8c10: 79 6e 63 20 29 3b 0a 20 20 69 66 28 20 28 70 50  ync );.  if( (pP
8c20: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 7c 7c  ager->noSync) ||
8c30: 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   (pPager->journa
8c40: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
8c50: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29  RNALMODE_MEMORY)
8c60: 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f  .   || (sqlite3O
8c70: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
8c80: 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
8c90: 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  d)&SQLITE_IOCAP_
8ca0: 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20  SAFE_APPEND) .  
8cb0: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48  ){.    memcpy(zH
8cc0: 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
8cd0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
8ce0: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
8cf0: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
8d00: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
8d10: 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66  rnalMagic)], 0xf
8d20: 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73  fffffff);.  }els
8d30: 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48  e{.    memset(zH
8d40: 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  eader, 0, sizeof
8d50: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
8d60: 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  4);.  }..  /* Th
8d70: 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68  e random check-h
8d80: 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20  ash initialiser 
8d90: 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61  */ .  sqlite3_ra
8da0: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
8db0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
8dc0: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
8dd0: 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32  umInit);.  put32
8de0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
8df0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
8e00: 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+4], pPager->
8e10: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a  cksumInit);.  /*
8e20: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
8e30: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
8e40: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
8e50: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
8e60: 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61  alMagic)+8], pPa
8e70: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29  ger->dbOrigSize)
8e80: 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d  ;.  /* The assum
8e90: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66  ed sector size f
8ea0: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  or this process 
8eb0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
8ec0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
8ed0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32  JournalMagic)+12
8ee0: 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ], pPager->secto
8ef0: 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  rSize);..  /* Th
8f00: 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  e page size */. 
8f10: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
8f20: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
8f30: 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70  nalMagic)+16], p
8f40: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
8f50: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
8f60: 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66  zing the tail of
8f70: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e   the buffer is n
8f80: 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45  ot necessary.  E
8f90: 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77  verything.  ** w
8fa0: 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65  orks find if the
8fb0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65   following memse
8fc0: 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20  t() is omitted. 
8fd0: 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   But initializin
8fe0: 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72  g.  ** the memor
8ff0: 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72  y prevents valgr
9000: 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69  ind from complai
9010: 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20  ning, so we are 
9020: 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20  willing to.  ** 
9030: 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d  take the perform
9040: 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20  ance hit..  */. 
9050: 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72   memset(&zHeader
9060: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
9070: 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20  Magic)+20], 0,. 
9080: 20 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d          nHeader-
9090: 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  (sizeof(aJournal
90a0: 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20  Magic)+20));..  
90b0: 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74  /* In theory, it
90c0: 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61   is only necessa
90d0: 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ry to write the 
90e0: 32 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68  28 bytes that th
90f0: 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  e .  ** journal 
9100: 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20  header consumes 
9110: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
9120: 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69  ile here. Then i
9130: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ncrement the .  
9140: 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ** Pager.journal
9150: 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20  Off variable by 
9160: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73  JOURNAL_HDR_SZ s
9170: 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
9180: 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20  .  ** record is 
9190: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66  written to the f
91a0: 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20  ollowing sector 
91b0: 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69  (leaving a gap i
91c0: 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  n the file.  ** 
91d0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70  that will be imp
91e0: 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69  licitly filled i
91f0: 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20  n by the OS)..  
9200: 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20  **.  ** However 
9210: 69 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63  it has been disc
9220: 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73  overed that on s
9230: 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73  ome systems this
9240: 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20   pattern can .  
9250: 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e  ** be significan
9260: 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20  tly slower than 
9270: 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69  contiguously wri
9280: 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65  ting data to the
9290: 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e   file,.  ** even
92a0: 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65   if that means e
92b0: 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e  xplicitly writin
92c0: 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c  g data to the bl
92d0: 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f  ock of .  ** (JO
92e0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
92f0: 38 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69  8) bytes that wi
9300: 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20  ll not be used. 
9310: 53 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a  So that is what.
9320: 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20    ** is done. . 
9330: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f   **.  ** The loo
9340: 70 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65  p is required he
9350: 72 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  re in case the s
9360: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
9370: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20  rger than the . 
9380: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67   ** database pag
9390: 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68  e size. Since th
93a0: 65 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72  e zHeader buffer
93b0: 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70   is only Pager.p
93c0: 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74  ageSize.  ** byt
93d0: 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65  es in size, more
93e0: 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74   than one call t
93f0: 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  o sqlite3OsWrite
9400: 28 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72  () may be requir
9410: 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c  ed.  ** to popul
9420: 61 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a  ate the entire j
9430: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
9440: 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  ctor..  */ .  fo
9450: 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d  r(nWrite=0; rc==
9460: 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74  SQLITE_OK&&nWrit
9470: 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e<JOURNAL_HDR_SZ
9480: 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65  (pPager); nWrite
9490: 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20  +=nHeader){.    
94a0: 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
94b0: 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
94c0: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
94d0: 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65  urnalHdr, nHeade
94e0: 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r)).    rc = sql
94f0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
9500: 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
9510: 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65  , nHeader, pPage
9520: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
9530: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9540: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
9550: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
9560: 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67  lOff );.    pPag
9570: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
9580: 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a  = nHeader;.  }..
9590: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
95a0: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
95b0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
95c0: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73  pen when this is
95d0: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
95e0: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a  al header file.*
95f0: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
9600: 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64  Z bytes) is read
9610: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
9620: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
9630: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
9640: 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c  e. The current l
9650: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
9660: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67  ournal file is g
9670: 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65  iven by.** pPage
9680: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53  r->journalOff. S
9690: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
96a0: 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  e function write
96b0: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72  JournalHdr() for
96c0: 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f  .** a descriptio
96d0: 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n of the journal
96e0: 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a   header format..
96f0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61  **.** If the hea
9700: 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63  der is read succ
9710: 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63  essfully, *pNRec
9720: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
9730: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
9740: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
9750: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
9760: 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73  nd *pDbSize is s
9770: 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  et to the size o
9780: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
9790: 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  e before the tra
97a0: 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20  nsaction began, 
97b0: 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20  in pages. Also, 
97c0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
97d0: 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74  t.** is set to t
97e0: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
97f0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
9800: 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b  eader. SQLITE_OK
9810: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
9820: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
9830: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
9840: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61  al header file a
9850: 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72  ppears to be cor
9860: 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
9870: 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ONE is.** return
9880: 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e  ed and *pNRec an
9890: 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75  d *PDbSize are u
98a0: 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f  ndefined.  If JO
98b0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
98c0: 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  es.** cannot be 
98d0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
98e0: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72  urnal file an er
98f0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
9900: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
9910: 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  int readJournalH
9920: 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  dr(.  Pager *pPa
9930: 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
9940: 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
9950: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f  ct */.  int isHo
9960: 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  t,.  i64 journal
9970: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
9980: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
9990: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
99a0: 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
99b0: 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20   u32 *pNRec,    
99c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
99d0: 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64   OUT: Value read
99e0: 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66   from the nRec f
99f0: 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70  ield */.  u32 *p
9a00: 44 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  DbSize          
9a10: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
9a20: 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c  alue of original
9a30: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66   database size f
9a40: 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ield */.){.  int
9a50: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
9a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
9a70: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e  urn code */.  un
9a80: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
9a90: 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20  ic[8];     /* A 
9aa0: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
9ab0: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
9ac0: 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66  */.  i64 iHdrOff
9ad0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9ae0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a    /* Offset of j
9af0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65  ournal header be
9b00: 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61  ing read */..  a
9b10: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
9b20: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
9b30: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
9b40: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
9b50: 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63   */..  /* Advanc
9b60: 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  e Pager.journalO
9b70: 66 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ff to the start 
9b80: 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  of the next sect
9b90: 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  or. If the.  ** 
9ba0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
9bb0: 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68  too small for th
9bc0: 65 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64  ere to be a head
9bd0: 65 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69  er stored at thi
9be0: 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65  s.  ** point, re
9bf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
9c00: 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
9c10: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
9c20: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
9c30: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
9c40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9c50: 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
9c60: 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61  pPager) > journa
9c70: 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  lSize ){.    ret
9c80: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
9c90: 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d  .  }.  iHdrOff =
9ca0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9cb0: 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  Off;..  /* Read 
9cc0: 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62  in the first 8 b
9cd0: 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ytes of the jour
9ce0: 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74  nal header. If t
9cf0: 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  hey do not match
9d00: 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63  .  ** the  magic
9d10: 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74   string found at
9d20: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
9d30: 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ch journal heade
9d40: 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  r, return.  ** S
9d50: 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61  QLITE_DONE. If a
9d60: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
9d70: 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  s, return an err
9d80: 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69  or code. Otherwi
9d90: 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64  se,.  ** proceed
9da0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48  ..  */.  if( isH
9db0: 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70  ot || iHdrOff!=p
9dc0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
9dd0: 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  r ){.    rc = sq
9de0: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
9df0: 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
9e00: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c   sizeof(aMagic),
9e10: 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69   iHdrOff);.    i
9e20: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
9e30: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
9e40: 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61      if( memcmp(a
9e50: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
9e60: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
9e70: 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
9e80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9e90: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
9ea0: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66  .  /* Read the f
9eb0: 69 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69  irst three 32-bi
9ec0: 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
9ed0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20  journal header: 
9ee0: 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69  The nRec.  ** fi
9ef0: 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75  eld, the checksu
9f00: 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e  m-initializer an
9f10: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
9f20: 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ize at the start
9f30: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61  .  ** of the tra
9f40: 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e  nsaction. Return
9f50: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
9f60: 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
9f70: 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66  wrong..  */.  if
9f80: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
9f90: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
9fa0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
9fb0: 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20  ff+8, pNRec)).  
9fc0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
9fd0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
9fe0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
9ff0: 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72  rOff+12, &pPager
a000: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20  ->cksumInit)).  
a010: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
a020: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
a030: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
a040: 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65  rOff+16, pDbSize
a050: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
a060: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
a070: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
a080: 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75  lOff==0 ){.    u
a090: 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20  32 iPageSize;   
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
a0b0: 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  age-size field o
a0c0: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
a0d0: 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63   */.    u32 iSec
a0e0: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
a0f0: 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73       /* Sector-s
a100: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75  ize field of jou
a110: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20  rnal header */. 
a120: 20 20 20 75 31 36 20 69 50 61 67 65 53 69 7a 65     u16 iPageSize
a130: 31 36 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  16;             
a140: 2f 2a 20 43 6f 70 79 20 6f 66 20 69 50 61 67 65  /* Copy of iPage
a150: 53 69 7a 65 20 69 6e 20 31 36 2d 62 69 74 20 76  Size in 16-bit v
a160: 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20  ariable */..    
a170: 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
a180: 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
a190: 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65  -size journal he
a1a0: 61 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a  ader fields. */.
a1b0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
a1c0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
a1d0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
a1e0: 20 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53   iHdrOff+20, &iS
a1f0: 65 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20  ectorSize)).    
a200: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
a210: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
a220: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
a230: 72 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53  rOff+24, &iPageS
a240: 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  ize)).    ){.   
a250: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
a260: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
a270: 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
a280: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
a290: 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
a2a0: 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73  ctor-size fields
a2b0: 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68  .    ** are with
a2c0: 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20  in range. To be 
a2d0: 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68  'in range', both
a2e0: 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20   values need to 
a2f0: 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a  be a power.    *
a300: 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72  * of two greater
a310: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
a320: 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64  o 512 or 32, and
a330: 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61   not greater tha
a340: 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20  n their .    ** 
a350: 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69  respective compi
a360: 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20  le time maximum 
a370: 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  limits..    */. 
a380: 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65     if( iPageSize
a390: 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20  <512            
a3a0: 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72        || iSector
a3b0: 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20  Size<32.     || 
a3c0: 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  iPageSize>SQLITE
a3d0: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c  _MAX_PAGE_SIZE |
a3e0: 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41  | iSectorSize>MA
a3f0: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20  X_SECTOR_SIZE.  
a400: 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a     || ((iPageSiz
a410: 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21  e-1)&iPageSize)!
a420: 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f  =0   || ((iSecto
a430: 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72  rSize-1)&iSector
a440: 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b  Size)!=0 .    ){
a450: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
a460: 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65   either the page
a470: 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d  -size or sector-
a480: 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  size in the jour
a490: 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20  nal-header is . 
a4a0: 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c       ** invalid,
a4b0: 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
a4c0: 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65  s that wrote the
a4d0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
a4e0: 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20  must have .     
a4f0: 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f   ** crashed befo
a500: 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61  re the header wa
a510: 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69  s synced. In thi
a520: 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64  s case stop read
a530: 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ing .      ** th
a540: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
a550: 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ere..      */.  
a560: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a570: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
a580: 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
a590: 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61   page-size to ma
a5a0: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65  tch the value re
a5b0: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
a5c0: 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65  nal. .    ** Use
a5d0: 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61   a testcase() ma
a5e0: 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  cro to make sure
a5f0: 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69   that malloc fai
a600: 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20  lure within .   
a610: 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65   ** PagerSetPage
a620: 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64  size() is tested
a630: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 50 61  ..    */.    iPa
a640: 67 65 53 69 7a 65 31 36 20 3d 20 28 75 31 36 29  geSize16 = (u16)
a650: 69 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72  iPageSize;.    r
a660: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
a670: 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67  SetPagesize(pPag
a680: 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65 31 36  er, &iPageSize16
a690: 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63  , -1);.    testc
a6a0: 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
a6b0: 4f 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  OK );.    assert
a6c0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a6d0: 7c 7c 20 69 50 61 67 65 53 69 7a 65 31 36 3d 3d  || iPageSize16==
a6e0: 28 75 31 36 29 69 50 61 67 65 53 69 7a 65 20 29  (u16)iPageSize )
a6f0: 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  ;..    /* Update
a700: 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   the assumed sec
a710: 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  tor-size to matc
a720: 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64  h the value used
a730: 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   by .    ** the 
a740: 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65  process that cre
a750: 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61  ated this journa
a760: 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e  l. If this journ
a770: 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72  al was.    ** cr
a780: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
a790: 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ss other than th
a7a0: 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69  is one, then thi
a7b0: 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  s routine.    **
a7c0: 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
a7d0: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
a7e0: 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54  er_playback(). T
a7f0: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20  he local value. 
a800: 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73     ** of Pager.s
a810: 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73  ectorSize is res
a820: 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
a830: 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65   of that routine
a840: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
a850: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
a860: 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20  = iSectorSize;. 
a870: 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
a880: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
a890: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
a8a0: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
a8b0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
a8c0: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61   the supplied ma
a8d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
a8e0: 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
a8f0: 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
a900: 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74  r.** pPager at t
a910: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
a920: 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20  ion. The master 
a930: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
a940: 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a  t be the last.**
a950: 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74   thing written t
a960: 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  o a journal file
a970: 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
a980: 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  s in full-sync m
a990: 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  ode, the.** jour
a9a0: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
a9b0: 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20  tor is advanced 
a9c0: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
a9d0: 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f  or boundary befo
a9e0: 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69  re.** anything i
a9f0: 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66  s written. The f
aa00: 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  ormat is:.**.** 
aa10: 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47    + 4 bytes: PAG
aa20: 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20  ER_MJ_PGNO..**  
aa30: 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74   + N bytes: Mast
aa40: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
aa50: 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a  ame in utf-8..**
aa60: 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20     + 4 bytes: N 
aa70: 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65  (length of maste
aa80: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
aa90: 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d  n bytes, no nul-
aaa0: 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20  terminator)..** 
aab0: 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73    + 4 bytes: Mas
aac0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
aad0: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20   checksum..**   
aae0: 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72  + 8 bytes: aJour
aaf0: 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a  nalMagic[]..**.*
ab00: 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
ab10: 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73  rnal page checks
ab20: 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  um is the sum of
ab30: 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
ab40: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
ab50: 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20  nal name, where 
ab60: 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  each byte is int
ab70: 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69  erpreted as a si
ab80: 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67  gned 8-bit integ
ab90: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61  er..**.** If zMa
aba0: 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70  ster is a NULL p
abb0: 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66  ointer (occurs f
abc0: 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
abd0: 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
abe0: 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c  ), .** this call
abf0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
ac00: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
ac10: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61  MasterJournal(Pa
ac20: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
ac30: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
ac40: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
ac50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac60: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
ac70: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  code */.  int nM
ac80: 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
ac90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
aca0: 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a  ngth of string z
acb0: 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20  Master */.  i64 
acc0: 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ace0: 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
acf0: 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   in journal file
ad00: 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69   */.  i64 jrnlSi
ad10: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
ad20: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
ad30: 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  f journal file o
ad40: 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20  n disk */.  u32 
ad50: 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20  cksum = 0;      
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ad70: 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69  Checksum of stri
ad80: 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20  ng zMaster */.. 
ad90: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c   if( !zMaster ||
ada0: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
adb0: 65 72 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  er.   || pPager-
adc0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
add0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
ade0: 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50  MEMORY .   || pP
adf0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
ae00: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
ae10: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20  MODE_OFF .  ){. 
ae20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ae30: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
ae40: 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31  r->setMaster = 1
ae50: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
ae60: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
ae70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
ae80: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
ae90: 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
aea0: 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43  alOff );..  /* C
aeb0: 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e  alculate the len
aec0: 67 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64  gth in bytes and
aed0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66   the checksum of
aee0: 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f   zMaster */.  fo
aef0: 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61  r(nMaster=0; zMa
af00: 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e  ster[nMaster]; n
af10: 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63  Master++){.    c
af20: 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
af30: 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20  nMaster];.  }.. 
af40: 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
af50: 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
af60: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
af70: 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
af80: 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
af90: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
afa0: 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
afb0: 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
afc0: 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
afd0: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
afe0: 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
aff0: 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
b000: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
b010: 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
b020: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
b030: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
b040: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
b050: 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
b060: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
b070: 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  ff;..  /* Write 
b080: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
b090: 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65  al data to the e
b0a0: 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
b0b0: 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20  l file. If.  ** 
b0c0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
b0d0: 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
b0e0: 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
b0f0: 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ller..  */.  if(
b100: 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
b110: 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
b120: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50  >jfd, iHdrOff, P
b130: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
b140: 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30  ger)))).   || (0
b150: 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
b160: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
b170: 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  >jfd, zMaster, n
b180: 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b  Master, iHdrOff+
b190: 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  4))).   || (0 !=
b1a0: 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
b1b0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
b1c0: 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
b1d0: 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20  r, nMaster))).  
b1e0: 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
b1f0: 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
b200: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
b210: 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b  +4+nMaster+4, ck
b220: 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  sum))).   || (0 
b230: 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
b240: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
b250: 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
b260: 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34  ic, 8, iHdrOff+4
b270: 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20  +nMaster+8))).  
b280: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
b290: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
b2a0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e  journalOff += (n
b2b0: 4d 61 73 74 65 72 2b 32 30 29 3b 0a 20 20 70 50  Master+20);.  pP
b2c0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
b2d0: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
b2e0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
b2f0: 61 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73  ager is in peris
b300: 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64  tent-journal mod
b310: 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73  e, then the phys
b320: 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ical .  ** journ
b330: 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65  al-file may exte
b340: 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  nd past the end 
b350: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
b360: 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20  urnal name.  ** 
b370: 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d  and 8 bytes of m
b380: 61 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77  agic data just w
b390: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69  ritten to the fi
b3a0: 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a  le. This is .  *
b3b0: 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61  * dangerous beca
b3c0: 75 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  use the code to 
b3d0: 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a  rollback a hot-j
b3e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
b3f0: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c   will not be abl
b400: 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61  e to find the ma
b410: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
b420: 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a  e to determine .
b430: 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20    ** whether or 
b440: 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
b450: 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20  is hot. .  **.  
b460: 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67  ** Easiest thing
b470: 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73   to do in this s
b480: 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72  cenario is to tr
b490: 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
b4a0: 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f  al .  ** file to
b4b0: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69   the required si
b4c0: 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20  ze..  */ .  if( 
b4d0: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
b4e0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
b4f0: 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
b500: 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26  &jrnlSize)).   &
b510: 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65  & jrnlSize>pPage
b520: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
b530: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
b540: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
b550: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
b560: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
b570: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
b580: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
b590: 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73   page in the has
b5a0: 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74  h table given it
b5b0: 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52  s page number. R
b5c0: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
b5d0: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f  er to the page o
b5e0: 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65  r NULL if the re
b5f0: 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
b600: 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20  not .** already 
b610: 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  in memory..*/.st
b620: 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
b630: 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  r_lookup(Pager *
b640: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
b650: 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20  o){.  PgHdr *p; 
b660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b670: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
b680: 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a  n value */..  /*
b690: 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
b6a0: 62 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74  ble for a call t
b6b0: 6f 20 50 63 61 63 68 65 46 65 74 63 68 28 29 20  o PcacheFetch() 
b6c0: 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d  with createFlag=
b6d0: 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c  =0 to.  ** fail,
b6e0: 20 73 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70   since no attemp
b6f0: 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79  t to allocate dy
b700: 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c  namic memory wil
b710: 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a  l be made..  */.
b720: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50    (void)sqlite3P
b730: 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
b740: 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
b750: 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75  , 0, &p);.  retu
b760: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  rn p;.}../*.** U
b770: 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
b780: 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74  is in error-stat
b790: 65 2c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69  e, discard all i
b7a0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2e 20  n-memory pages. 
b7b0: 49 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  If.** the pager 
b7c0: 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74  is in error-stat
b7d0: 65 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c  e, then this cal
b7e0: 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  l is a no-op..**
b7f0: 0a 2a 2a 20 54 4f 44 4f 3a 20 57 68 79 20 63 61  .** TODO: Why ca
b800: 6e 20 77 65 20 6e 6f 74 20 72 65 73 65 74 20 74  n we not reset t
b810: 68 65 20 70 61 67 65 72 20 77 68 69 6c 65 20 69  he pager while i
b820: 6e 20 65 72 72 6f 72 20 73 74 61 74 65 3f 0a 2a  n error state?.*
b830: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
b840: 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20  ger_reset(Pager 
b850: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
b860: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 70 50 61 67 65  SQLITE_OK==pPage
b870: 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
b880: 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
b890: 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
b8a0: 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 73 71 6c  Backup);.    sql
b8b0: 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28  ite3PcacheClear(
b8c0: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
b8d0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
b8e0: 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20  SizeValid = 0;. 
b8f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
b900: 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20   all structures 
b910: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
b920: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20  vepoint[] array 
b930: 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20  and set both.** 
b940: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
b950: 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65   and Pager.nSave
b960: 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43  point to zero. C
b970: 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75  lose the sub-jou
b980: 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73  rnal.** if it is
b990: 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
b9a0: 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
b9b0: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f  clusive mode..*/
b9c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
b9d0: 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
b9e0: 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
b9f0: 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
ba00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
ba10: 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e  rator for loopin
ba20: 67 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e  g through Pager.
ba30: 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20  aSavepoint */.  
ba40: 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
ba50: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
ba60: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   ii++){.    sqli
ba70: 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
ba80: 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
ba90: 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  int[ii].pInSavep
baa0: 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  oint);.  }.  if(
bab0: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
bac0: 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74  iveMode || sqlit
bad0: 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
bae0: 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
baf0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
bb00: 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  se(pPager->sjfd)
bb10: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
bb20: 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61  free(pPager->aSa
bb30: 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67  vepoint);.  pPag
bb40: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d  er->aSavepoint =
bb50: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53   0;.  pPager->nS
bb60: 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
bb70: 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20  pPager->nSubRec 
bb80: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
bb90: 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72  t the bit number
bba0: 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67   pgno in the Pag
bbb0: 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
bbc0: 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74  avepoint .** bit
bbd0: 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e  vecs of all open
bbe0: 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74   savepoints. Ret
bbf0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
bc00: 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f   successful.** o
bc10: 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  r SQLITE_NOMEM i
bc20: 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  f a malloc failu
bc30: 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  re occurs..*/.st
bc40: 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61  atic int addToSa
bc50: 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50  vepointBitvecs(P
bc60: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
bc70: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
bc80: 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
bc90: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
bca0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
bcb0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
bcc0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
bcd0: 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69  ode */..  for(ii
bce0: 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
bcf0: 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
bd00: 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  {.    PagerSavep
bd10: 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65  oint *p = &pPage
bd20: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
bd30: 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  ];.    if( pgno<
bd40: 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20  =p->nOrig ){.   
bd50: 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33     rc |= sqlite3
bd60: 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e  BitvecSet(p->pIn
bd70: 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29  Savepoint, pgno)
bd80: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
bd90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
bda0: 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EM );.      asse
bdb0: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
bdc0: 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
bdd0: 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20  NOMEM );.    }. 
bde0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
bdf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
be00: 74 72 75 65 20 69 66 20 74 68 69 73 20 70 61 67  true if this pag
be10: 65 72 20 75 73 65 73 20 61 20 77 72 69 74 65 2d  er uses a write-
be20: 61 68 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61  ahead log instea
be30: 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a  d of the usual.*
be40: 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
be50: 61 6c 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61  al. Otherwise fa
be60: 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  lse..*/.#ifndef 
be70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
be80: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
be90: 55 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50  UseWal(Pager *pP
bea0: 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
beb0: 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30  (pPager->pWal!=0
bec0: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
bed0: 69 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28  ine pagerUseWal(
bee0: 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  x) 0.# define pa
bef0: 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78  gerRollbackWal(x
bf00: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
bf10: 65 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c  erWalFrames(v,w,
bf20: 78 2c 79 2c 7a 29 20 30 0a 23 20 64 65 66 69 6e  x,y,z) 0.# defin
bf30: 65 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66  e pagerOpenWalIf
bf40: 50 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54  Present(z) SQLIT
bf50: 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61  E_OK.# define pa
bf60: 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
bf70: 73 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54  saction(z) SQLIT
bf80: 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E_OK.#endif../*.
bf90: 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ** Unlock the da
bfa0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69  tabase file. Thi
bfb0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
bfc0: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67  no-op if the pag
bfd0: 65 72 0a 2a 2a 20 69 73 20 69 6e 20 65 78 63 6c  er.** is in excl
bfe0: 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a  usive mode..**.*
bff0: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
c000: 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65  s currently in e
c010: 72 72 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63  rror state, disc
c020: 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ard the contents
c030: 20 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68   of .** the cach
c040: 65 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20  e and reset the 
c050: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
c060: 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20  internal state. 
c070: 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  If there is.** a
c080: 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66  n open journal-f
c090: 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65  ile, then the ne
c0a0: 78 74 20 74 69 6d 65 20 61 20 73 68 61 72 65 64  xt time a shared
c0b0: 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65  -lock is obtaine
c0c0: 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65  d.** on the page
c0d0: 72 20 66 69 6c 65 20 28 62 79 20 74 68 69 73 20  r file (by this 
c0e0: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
c0f0: 63 65 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62  cess), it will b
c100: 65 0a 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20  e.** treated as 
c110: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e  a hot-journal an
c120: 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  d rolled back..*
c130: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
c140: 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72  ger_unlock(Pager
c150: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
c160: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
c170: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69  iveMode ){.    i
c180: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c190: 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  K;          /* R
c1a0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
c1b0: 20 20 69 6e 74 20 69 44 63 20 3d 20 69 73 4f 70    int iDc = isOp
c1c0: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 3f 73  en(pPager->fd)?s
c1d0: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
c1e0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
c1f0: 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20  ager->fd):0;..  
c200: 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 65 72    /* If the oper
c210: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70  ating system sup
c220: 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66  port deletion of
c230: 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74 68 65   open files, the
c240: 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74  n.    ** close t
c250: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c260: 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68  when dropping th
c270: 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e  e database lock.
c280: 20 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20    Otherwise.    
c290: 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65  ** another conne
c2a0: 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e  ction with journ
c2b0: 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d  al_mode=delete m
c2c0: 69 67 68 74 20 64 65 6c 65 74 65 20 74 68 65 20  ight delete the 
c2d0: 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20  file.    ** out 
c2e0: 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20  from under us.. 
c2f0: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
c300: 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
c310: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20  MODE_MEMORY   & 
c320: 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
c330: 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
c340: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20  NALMODE_OFF     
c350: 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
c360: 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
c370: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20  OURNALMODE_WAL  
c380: 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20      & 5)!=1 );. 
c390: 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
c3a0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
c3b0: 4c 45 54 45 20 20 20 26 20 35 29 21 3d 31 20 29  LETE   & 5)!=1 )
c3c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
c3d0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
c3e0: 5f 54 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d  _TRUNCATE & 5)==
c3f0: 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
c400: 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
c410: 4f 44 45 5f 50 45 52 53 49 53 54 20 20 26 20 35  ODE_PERSIST  & 5
c420: 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  )==1 );.    if( 
c430: 30 3d 3d 28 69 44 63 20 26 20 53 51 4c 49 54 45  0==(iDc & SQLITE
c440: 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
c450: 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20  LE_WHEN_OPEN).  
c460: 20 20 20 7c 7c 20 31 21 3d 28 70 50 61 67 65 72     || 1!=(pPager
c470: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20  ->journalMode & 
c480: 35 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  5).    ){.      
c490: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
c4a0: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
c4b0: 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42   }..    sqlite3B
c4c0: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
c4d0: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
c4e0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  ;.    pPager->pI
c4f0: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
c500: 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65    releaseAllSave
c510: 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a  points(pPager);.
c520: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
c530: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c  ile is unlocked,
c540: 20 73 6f 6d 65 62 6f 64 79 20 65 6c 73 65 20 6d   somebody else m
c550: 69 67 68 74 20 63 68 61 6e 67 65 20 69 74 2e 20  ight change it. 
c560: 54 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  The.    ** value
c570: 73 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65  s stored in Page
c580: 72 2e 64 62 53 69 7a 65 20 65 74 63 2e 20 6d 69  r.dbSize etc. mi
c590: 67 68 74 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c  ght become inval
c5a0: 69 64 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 69  id if.    ** thi
c5b0: 73 20 68 61 70 70 65 6e 73 2e 20 20 4f 6e 65 20  s happens.  One 
c5c0: 63 61 6e 20 61 72 67 75 65 20 74 68 61 74 20 74  can argue that t
c5d0: 68 69 73 20 64 6f 65 73 6e 27 74 20 6e 65 65 64  his doesn't need
c5e0: 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 0a 20   to be cleared. 
c5f0: 20 20 20 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20     ** until the 
c600: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63  change-counter c
c610: 68 65 63 6b 20 66 61 69 6c 73 20 69 6e 20 50 61  heck fails in Pa
c620: 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 2e  gerSharedLock().
c630: 0a 20 20 20 20 2a 2a 20 43 6c 65 61 72 69 6e 67  .    ** Clearing
c640: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 63   the page size c
c650: 61 63 68 65 20 68 65 72 65 20 69 73 20 62 65 69  ache here is bei
c660: 6e 67 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e  ng conservative.
c670: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
c680: 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
c690: 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 61  = 0;..    if( pa
c6a0: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
c6b0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
c6c0: 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e  e3WalEndReadTran
c6d0: 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
c6e0: 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pWal);.    }else
c6f0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73 55  {.      rc = osU
c700: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
c710: 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
c720: 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  }.    if( rc ){.
c730: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
c740: 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20  rCode = rc;.    
c750: 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  }.    IOTRACE(("
c760: 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50  UNLOCK %p\n", pP
c770: 61 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20 49  ager))..    /* I
c780: 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  f Pager.errCode 
c790: 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74  is set, the cont
c7a0: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
c7b0: 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62  r cache cannot b
c7c0: 65 0a 20 20 20 20 2a 2a 20 74 72 75 73 74 65 64  e.    ** trusted
c7d0: 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 20 70  . Now that the p
c7e0: 61 67 65 72 20 66 69 6c 65 20 69 73 20 75 6e 6c  ager file is unl
c7f0: 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74 65  ocked, the conte
c800: 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  nts of the.    *
c810: 2a 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64  * cache can be d
c820: 69 73 63 61 72 64 65 64 20 61 6e 64 20 74 68 65  iscarded and the
c830: 20 65 72 72 6f 72 20 63 6f 64 65 20 73 61 66 65   error code safe
c840: 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20  ly cleared..    
c850: 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
c860: 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
c870: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c880: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
c890: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
c8a0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
c8b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65      }.      page
c8c0: 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
c8d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67  .    }..    pPag
c8e0: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
c8f0: 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  one = 0;.    pPa
c900: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
c910: 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70  ER_UNLOCK;.    p
c920: 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
c930: 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 0;.  }.}../*
c940: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
c950: 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  n should be call
c960: 65 64 20 77 68 65 6e 20 61 6e 20 49 4f 45 52 52  ed when an IOERR
c970: 2c 20 43 4f 52 52 55 50 54 20 6f 72 20 46 55 4c  , CORRUPT or FUL
c980: 4c 20 65 72 72 6f 72 0a 2a 2a 20 6d 61 79 20 68  L error.** may h
c990: 61 76 65 20 6f 63 63 75 72 72 65 64 2e 20 54 68  ave occurred. Th
c9a0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
c9b0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
c9c0: 20 74 68 65 20 70 61 67 65 72 20 0a 2a 2a 20 73   the pager .** s
c9d0: 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65  tructure, the se
c9e0: 63 6f 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63  cond the error-c
c9f0: 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20  ode about to be 
ca00: 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 61  returned by a pa
ca10: 67 65 72 20 0a 2a 2a 20 41 50 49 20 66 75 6e 63  ger .** API func
ca20: 74 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20  tion. The value 
ca30: 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f  returned is a co
ca40: 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64  py of the second
ca50: 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f   argument .** to
ca60: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
ca70: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
ca80: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
ca90: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53   SQLITE_IOERR, S
caa0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f  QLITE_CORRUPT, o
cab0: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a  r SQLITE_FULL.**
cac0: 20 74 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d   the error becom
cad0: 65 73 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55  es persistent. U
cae0: 6e 74 69 6c 20 74 68 65 20 70 65 72 73 69 73 74  ntil the persist
caf0: 65 6e 74 20 65 72 72 6f 72 20 69 73 20 63 6c 65  ent error is cle
cb00: 61 72 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75  ared,.** subsequ
cb10: 65 6e 74 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e  ent API calls on
cb20: 20 74 68 69 73 20 50 61 67 65 72 20 77 69 6c 6c   this Pager will
cb30: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74   immediately ret
cb40: 75 72 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a  urn the same .**
cb50: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
cb60: 2a 2a 20 41 20 70 65 72 73 69 73 74 65 6e 74 20  ** A persistent 
cb70: 65 72 72 6f 72 20 69 6e 64 69 63 61 74 65 73 20  error indicates 
cb80: 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
cb90: 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63  s of the pager-c
cba0: 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20  ache .** cannot 
cbb0: 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73  be trusted. This
cbc0: 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c   state can be cl
cbd0: 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74  eared by complet
cbe0: 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a  ely discarding .
cbf0: 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ** the contents 
cc00: 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
cc10: 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  he. If a transac
cc20: 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20  tion was active 
cc30: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73  when.** the pers
cc40: 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63  istent error occ
cc50: 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20  urred, then the 
cc60: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
cc70: 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20   may need.** to 
cc80: 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72  be replayed to r
cc90: 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65  estore the conte
cca0: 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
ccb0: 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a  ase file (as if.
ccc0: 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f 74  ** it were a hot
ccd0: 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74  -journal)..*/.st
cce0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
ccf0: 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  rror(Pager *pPag
cd00: 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69  er, int rc){.  i
cd10: 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78  nt rc2 = rc & 0x
cd20: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  ff;.  assert( rc
cd30: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  ==SQLITE_OK || !
cd40: 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
cd50: 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  t(.       pPager
cd60: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
cd70: 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20  E_FULL ||.      
cd80: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
cd90: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20  ==SQLITE_OK ||. 
cda0: 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65        (pPager->e
cdb0: 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d  rrCode & 0xff)==
cdc0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29  SQLITE_IOERR.  )
cdd0: 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c  ;.  if( rc2==SQL
cde0: 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d  ITE_FULL || rc2=
cdf0: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b  =SQLITE_IOERR ){
ce00: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
ce10: 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a 20  Code = rc;.  }. 
ce20: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ce30: 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72  *.** Execute a r
ce40: 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61  ollback if a tra
ce50: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
ce60: 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  ve and unlock th
ce70: 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  e .** database f
ce80: 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ile. .**.** If t
ce90: 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72  he pager has alr
cea0: 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65  eady entered the
ceb0: 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f   error state, do
cec0: 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a   not attempt .**
ced0: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74   the rollback at
cee0: 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74   this time. Inst
cef0: 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63  ead, pager_unloc
cf00: 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54  k() is called. T
cf10: 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61  he.** call to pa
cf20: 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c  ger_unlock() wil
cf30: 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e  l discard all in
cf40: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75  -memory pages, u
cf50: 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74  nlock.** the dat
cf60: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 63  abase file and c
cf70: 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73  lear the error s
cf80: 74 61 74 65 2e 20 49 66 20 74 68 69 73 20 6d 65  tate. If this me
cf90: 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 72  ans that.** ther
cfa0: 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  e is a hot-journ
cfb0: 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  al left in the f
cfc0: 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20  ile-system, the 
cfd0: 6e 65 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  next connection.
cfe0: 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73  ** to obtain a s
cff0: 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
d000: 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d  e pager (which m
d010: 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20  ay be this one) 
d020: 77 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74 20  will.** roll it 
d030: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
d040: 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74  he pager has not
d050: 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
d060: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
d070: 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a  , but an IO or.*
d080: 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  * malloc error o
d090: 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72  ccurs during a r
d0a0: 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68  ollback, then th
d0b0: 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63  is will itself c
d0c0: 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
d0d0: 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
d0e0: 65 72 72 6f 72 20 73 74 61 74 65 2e 20 57 68 69  error state. Whi
d0f0: 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72  ch will be clear
d100: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c  ed by the.** cal
d110: 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
d120: 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65  k(), as describe
d130: 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74  d above..*/.stat
d140: 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
d150: 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
d160: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
d170: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
d180: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
d190: 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  && pPager->state
d1a0: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
d1b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
d1c0: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
d1d0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ();.    sqlite3P
d1e0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
d1f0: 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ger);.    sqlite
d200: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
d210: 28 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f  ();.  }.  pager_
d220: 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
d230: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
d240: 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61  utine ends a tra
d250: 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e  nsaction. A tran
d260: 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c  saction is usual
d270: 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20  ly ended by .** 
d280: 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20  either a COMMIT 
d290: 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70  or a ROLLBACK op
d2a0: 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f  eration. This ro
d2b0: 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c  utine may be cal
d2c0: 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f  led .** after ro
d2d0: 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d  llback of a hot-
d2e0: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61  journal, or if a
d2f0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
d300: 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20  hile opening.** 
d310: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d320: 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
d330: 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e  very first journ
d340: 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a  al-header of a.*
d350: 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  * database trans
d360: 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49  action..** .** I
d370: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
d380: 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6f  n PAGER_SHARED o
d390: 72 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73  r PAGER_UNLOCK s
d3a0: 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
d3b0: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
d3c0: 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
d3d0: 6f 70 20 28 72 65 74 75 72 6e 73 20 53 51 4c 49  op (returns SQLI
d3e0: 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  TE_OK)..**.** Ot
d3f0: 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74  herwise, any act
d400: 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
d410: 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  re released..**.
d420: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
d430: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20  l file is open, 
d440: 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61  then it is "fina
d450: 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a  lized". Once a j
d460: 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20  ournal .** file 
d470: 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
d480: 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  ed it is not pos
d490: 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20  sible to use it 
d4a0: 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a  to roll back a .
d4b0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
d4c0: 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63  Nor will it be c
d4d0: 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
d4e0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79  a hot-journal by
d4f0: 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20   this.** or any 
d500: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
d510: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74  onnection. Exact
d520: 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c  ly how a journal
d530: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a   is finalized.**
d540: 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
d550: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70  her or not the p
d560: 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
d570: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
d580: 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72  e and.** the cur
d590: 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  rent journal-mod
d5a0: 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  e (Pager.journal
d5b0: 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20  Mode value), as 
d5c0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
d5d0: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45   journalMode==ME
d5e0: 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  MORY.**     Jour
d5f0: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
d600: 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c  tor is simply cl
d610: 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72  osed. This destr
d620: 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69  oys an .**     i
d630: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
d640: 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
d650: 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a  lMode==TRUNCATE.
d660: 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
d670: 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
d680: 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
d690: 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  n size..**.**   
d6a0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
d6b0: 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20  SIST.**     The 
d6c0: 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f  first 28 bytes o
d6d0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
d6e0: 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54  le are zeroed. T
d6f0: 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a  his invalidates.
d700: 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74  **     the first
d710: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
d720: 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64  in the file, and
d730: 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72   hence the entir
d740: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
d750: 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69   file. An invali
d760: 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  d journal file c
d770: 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  annot be rolled 
d780: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  back..**.**   jo
d790: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54  urnalMode==DELET
d7a0: 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75  E.**     The jou
d7b0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  rnal file is clo
d7c0: 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20  sed and deleted 
d7d0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
d7e0: 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  elete()..**.**  
d7f0: 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20     If the pager 
d800: 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
d810: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
d820: 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e  is method of fin
d830: 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74  alizing.**     t
d840: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d850: 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49  is never used. I
d860: 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a  nstead, if the j
d870: 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a  ournalMode is.**
d880: 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20       DELETE and 
d890: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
d8a0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
d8b0: 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72  the method descr
d8c0: 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20  ibed under.**   
d8d0: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
d8e0: 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69  ERSIST is used i
d8f0: 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66  nstead..**.** Af
d900: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
d910: 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 69 66  is finalized, if
d920: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d   running in non-
d930: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
d940: 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 6d 6f 76  the.** pager mov
d950: 65 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  es to PAGER_SHAR
d960: 45 44 20 73 74 61 74 65 20 28 61 6e 64 20 64 6f  ED state (and do
d970: 77 6e 67 72 61 64 65 73 20 74 68 65 20 6c 6f 63  wngrades the loc
d980: 6b 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  k on the.** data
d990: 62 61 73 65 20 66 69 6c 65 20 61 63 63 6f 72 64  base file accord
d9a0: 69 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ingly)..**.** If
d9b0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
d9c0: 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
d9d0: 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 73 20 69  ve mode and is i
d9e0: 6e 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 73  n PAGER_SYNCED s
d9f0: 74 61 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76 65  tate,.** it move
da00: 73 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55  s to PAGER_EXCLU
da10: 53 49 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20 61  SIVE. No locks a
da20: 72 65 20 64 6f 77 6e 67 72 61 64 65 64 20 77 68  re downgraded wh
da30: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a 2a  en running in.**
da40: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
da50: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
da60: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
da70: 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  no error occurs.
da80: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
da90: 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e  urs during.** an
daa0: 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72  y of the IO oper
dab0: 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69  ations to finali
dac0: 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
dad0: 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ile or unlock th
dae0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68  e.** database th
daf0: 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
db00: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
db10: 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66   to the user. If
db20: 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69   the .** operati
db30: 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  on to finalize t
db40: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
db50: 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20  fails, then the 
db60: 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72  code still.** tr
db70: 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ies to unlock th
db80: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
db90: 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  if not in exclus
dba0: 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  ive mode. If the
dbb0: 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  .** unlock opera
dbc0: 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65  tion fails as we
dbd0: 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ll, then the fir
dbe0: 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  st error code re
dbf0: 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  lated.** to the 
dc00: 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f  first error enco
dc10: 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75  untered (the jou
dc20: 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
dc30: 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74  n one) is.** ret
dc40: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
dc50: 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74   int pager_end_t
dc60: 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
dc70: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61   *pPager, int ha
dc80: 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  sMaster){.  int 
dc90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
dca0: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
dcb0: 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  de from journal 
dcc0: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65  finalization ope
dcd0: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
dce0: 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
dcf0: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
dd00: 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20  de from db file 
dd10: 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
dd20: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65   */..  if( pPage
dd30: 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
dd40: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
dd50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
dd60: 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 41 6c  .  }.  releaseAl
dd70: 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67  lSavepoints(pPag
dd80: 65 72 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  er);..  assert( 
dd90: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
dda0: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  fd) || pPager->p
ddb0: 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
ddc0: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
ddd0: 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
dde0: 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
ddf0: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
de00: 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a  ..    /* Finaliz
de10: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
de20: 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  le. */.    if( s
de30: 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e  qlite3IsMemJourn
de40: 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  al(pPager->jfd) 
de50: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
de60: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
de70: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
de80: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
de90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
dea0: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
deb0: 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  fd);.    }else i
dec0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
ded0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
dee0: 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
def0: 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  TE ){.      if( 
df00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
df10: 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ff==0 ){.       
df20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
df30: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
df40: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
df50: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
df60: 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
df70: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
df80: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
df90: 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
dfa0: 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
dfb0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
dfc0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
dfd0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
dfe0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
dff0: 53 54 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ST.      || (pPa
e000: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
e010: 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  de && pPager->jo
e020: 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
e030: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
e040: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
e050: 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48  c = zeroJournalH
e060: 64 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61  dr(pPager, hasMa
e070: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70 61 67  ster);.      pag
e080: 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
e090: 20 72 63 29 3b 0a 20 20 20 20 20 20 70 50 61 67   rc);.      pPag
e0a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
e0b0: 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
e0c0: 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
e0d0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
e0e0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
e0f0: 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65  ranch may be exe
e100: 63 75 74 65 64 20 77 69 74 68 20 50 61 67 65 72  cuted with Pager
e110: 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45  .journalMode==ME
e120: 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a  MORY if.      **
e130: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77   a hot-journal w
e140: 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62  as just rolled b
e150: 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ack. In this cas
e160: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  e the journal.  
e170: 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75      ** file shou
e180: 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64  ld be closed and
e190: 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69   deleted. If thi
e1a0: 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69  s connection wri
e1b0: 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  tes to.      ** 
e1c0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
e1d0: 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f  e, it will do so
e1e0: 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d   using an in-mem
e1f0: 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20  ory journal. .  
e200: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
e210: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
e220: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
e230: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
e240: 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  TE .           |
e250: 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
e260: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
e270: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
e280: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
e290: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
e2a0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
e2b0: 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
e2c0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
e2d0: 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
e2e0: 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28  >jfd);.      if(
e2f0: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
e300: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  le ){.        rc
e310: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
e320: 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
e330: 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
e340: 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l, 0);.      }. 
e350: 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
e360: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
e370: 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
e380: 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
e390: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
e3a0: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
e3b0: 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  h);.#endif.  }. 
e3c0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
e3d0: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
e3e0: 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61  nJournal);.  pPa
e3f0: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
e400: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
e410: 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Rec = 0;.  sqlit
e420: 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
e430: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
e440: 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55  );..  if( pagerU
e450: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
e460: 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
e470: 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61  e3WalEndWriteTra
e480: 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
e490: 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65  >pWal);.    asse
e4a0: 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  rt( rc2==SQLITE_
e4b0: 4f 4b 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OK );.    pPager
e4c0: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
e4d0: 53 48 41 52 45 44 3b 0a 0a 20 20 20 20 2f 2a 20  SHARED;..    /* 
e4e0: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
e4f0: 6e 20 77 61 73 20 69 6e 20 6c 6f 63 6b 69 6e 67  n was in locking
e500: 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
e510: 6d 6f 64 65 20 62 75 74 20 69 73 20 6e 6f 20 6c  mode but is no l
e520: 6f 6e 67 65 72 2c 0a 20 20 20 20 2a 2a 20 64 72  onger,.    ** dr
e530: 6f 70 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  op the EXCLUSIVE
e540: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
e550: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
e560: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
e570: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
e580: 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65  veMode && sqlite
e590: 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
e5a0: 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
e5b0: 30 29 20 29 7b 0a 20 20 20 20 20 20 72 63 32 20  0) ){.      rc2 
e5c0: 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  = osUnlock(pPage
e5d0: 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
e5e0: 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  CK);.    }.  }el
e5f0: 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  se if( !pPager->
e600: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
e610: 0a 20 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c  .    rc2 = osUnl
e620: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
e630: 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
e640: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
e650: 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
e660: 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
e670: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
e680: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
e690: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
e6a0: 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20  R_SYNCED ){.    
e6b0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
e6c0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
e6d0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
e6e0: 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
e6f0: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
e700: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
e710: 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b 0a  dbModified = 0;.
e720: 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 74  .  /* TODO: Is t
e730: 68 69 73 20 6f 70 74 69 6d 61 6c 3f 20 57 68 79  his optimal? Why
e740: 20 69 73 20 74 68 65 20 64 62 20 73 69 7a 65 20   is the db size 
e750: 69 6e 76 61 6c 69 64 61 74 65 64 20 68 65 72 65  invalidated here
e760: 20 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20   .  ** when the 
e770: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
e780: 20 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64 3f 20 2a   not unlocked? *
e790: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  /.  pPager->dbOr
e7a0: 69 67 53 69 7a 65 20 3d 20 30 3b 0a 20 20 73 71  igSize = 0;.  sq
e7b0: 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63  lite3PcacheTrunc
e7c0: 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ate(pPager->pPCa
e7d0: 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  che, pPager->dbS
e7e0: 69 7a 65 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d  ize);.  if( !MEM
e7f0: 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  DB ){.    pPager
e800: 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
e810: 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  0;.  }..  return
e820: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f   (rc==SQLITE_OK?
e830: 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rc2:rc);.}../*.*
e840: 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74  * Parameter aDat
e850: 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  a must point to 
e860: 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67  a buffer of pPag
e870: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
e880: 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43  es.** of data. C
e890: 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
e8a0: 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73  n a checksum bas
e8b0: 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65  ed ont the conte
e8c0: 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  nts of the .** p
e8d0: 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20  age of data and 
e8e0: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
e8f0: 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73  e of pPager->cks
e900: 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  umInit..**.** Th
e910: 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c  is is not a real
e920: 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73   checksum. It is
e930: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65   really just the
e940: 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20   sum of the .** 
e950: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76  random initial v
e960: 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b  alue (pPager->ck
e970: 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65  sumInit) and eve
e980: 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a  ry 200th byte.**
e990: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
e9a0: 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  a, starting with
e9b0: 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50   byte offset (pP
e9c0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32  ager->pageSize%2
e9d0: 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74  00)..** Each byt
e9e0: 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  e is interpreted
e9f0: 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73   as an 8-bit uns
ea00: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a  igned integer..*
ea10: 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68  *.** Changing th
ea20: 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74  e formula used t
ea30: 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63  o compute this c
ea40: 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20  hecksum results 
ea50: 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61  in an.** incompa
ea60: 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69  tible journal fi
ea70: 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  le format..**.**
ea80: 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72   If journal corr
ea90: 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75  uption occurs du
eaa0: 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69  e to a power fai
eab0: 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c  lure, the most l
eac0: 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72  ikely .** scenar
ead0: 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  io is that one e
eae0: 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
eaf0: 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
eb00: 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a  ll be changed. .
eb10: 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65  ** It is much le
eb20: 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
eb30: 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
eb40: 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
eb50: 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
eb60: 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
eb70: 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
eb80: 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
eb90: 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
eba0: 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
ebb0: 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
ebc0: 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
ebd0: 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
ebe0: 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
ebf0: 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75  c u32 pager_cksu
ec00: 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  m(Pager *pPager,
ec10: 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
ec20: 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
ec30: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
ec40: 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  it;         /* C
ec50: 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f  hecksum value to
ec60: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
ec70: 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67   i = pPager->pag
ec80: 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20  eSize-200;      
ec90: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
eca0: 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ter */.  while( 
ecb0: 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
ecc0: 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
ecd0: 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
ece0: 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
ecf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20  }../*.** Report 
ed00: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
ed10: 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72   size and number
ed20: 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
ed30: 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68  es back.** to th
ed40: 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64  e codec..*/.#ifd
ed50: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
ed60: 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEC.static void 
ed70: 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
ed80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
ed90: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43    if( pPager->xC
eda0: 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a  odecSizeChng ){.
edb0: 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64      pPager->xCod
edc0: 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65  ecSizeChng(pPage
edd0: 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65  r->pCodec, pPage
ede0: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  r->pageSize,.   
edf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee00: 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50 61          (int)pPa
ee10: 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a  ger->nReserve);.
ee20: 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
ee30: 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74  fine pagerReport
ee40: 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e  Size(X)     /* N
ee50: 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f  o-op if we do no
ee60: 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65  t support a code
ee70: 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c */.#endif../*.
ee80: 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  ** Read a single
ee90: 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65   page from eithe
eea0: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
eeb0: 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e  le (if isMainJrn
eec0: 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d  l==1) or.** from
eed0: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
eee0: 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d   (if isMainJrnl=
eef0: 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b  =0) and playback
ef00: 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54   that page..** T
ef10: 68 65 20 70 61 67 65 20 62 65 67 69 6e 73 20 61  he page begins a
ef20: 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65  t offset *pOffse
ef30: 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  t into the file.
ef40: 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a   The *pOffset.**
ef50: 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61   value is increa
ef60: 73 65 64 20 74 6f 20 74 68 65 20 73 74 61 72 74  sed to the start
ef70: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
ef80: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
ef90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 4d 61  ..**.** The isMa
efa0: 69 6e 4a 72 6e 6c 20 66 6c 61 67 20 69 73 20 74  inJrnl flag is t
efb0: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 74  rue if this is t
efc0: 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
efd0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20   journal and.** 
efe0: 66 61 6c 73 65 20 66 6f 72 20 74 68 65 20 73 74  false for the st
eff0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
f000: 20 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62    The main rollb
f010: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73  ack journal uses
f020: 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 73 20 2d 20  .** checksums - 
f030: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
f040: 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 2e 0a  urnal does not..
f050: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
f060: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
f070: 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61 64  page record read
f080: 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
f090: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
f0a0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
f0b0: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
f0c0: 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a  e of Pager.dbSiz
f0d0: 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b  e, then playback
f0e0: 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61   is.** skipped a
f0f0: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  nd SQLITE_OK is 
f100: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
f110: 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20  If pDone is not 
f120: 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73  NULL, then it is
f130: 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67   a record of pag
f140: 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c 72  es that have alr
f150: 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61  eady.** been pla
f160: 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68  yed back.  If th
f170: 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73  e page at *pOffs
f180: 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  et has already b
f190: 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a  een played back.
f1a0: 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72 65  ** (if the corre
f1b0: 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62  sponding pDone b
f1c0: 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e 20  it is set) then 
f1d0: 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61 63  skip the playbac
f1e0: 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  k..** Make sure 
f1f0: 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f  the pDone bit co
f200: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
f210: 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65  he *pOffset page
f220: 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72   is set.** prior
f230: 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a   to returning..*
f240: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
f250: 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63 65   record is succe
f260: 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f  ssfully read fro
f270: 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
f280: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20  nal file.** and 
f290: 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65  played back, the
f2a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  n SQLITE_OK is r
f2b0: 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
f2c0: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a  O error occurs.*
f2d0: 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  * while reading 
f2e0: 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  the record from 
f2f0: 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
f300: 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20  l file or while 
f310: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68  writing.** to th
f320: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
f330: 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
f340: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
f350: 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20  ned. If data.** 
f360: 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
f370: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
f380: 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
f390: 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f 20   but appears to 
f3a0: 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c  be.** corrupted,
f3b0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
f3c0: 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69  returned. Data i
f3d0: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72  s considered cor
f3e0: 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f  rupted in.** two
f3f0: 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a   circumstances:.
f400: 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  ** .**   * If th
f410: 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75  e record page-nu
f420: 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20  mber is illegal 
f430: 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50  (0 or PAGER_MJ_P
f440: 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20  GNO), or.**   * 
f450: 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  If the record is
f460: 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
f470: 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
f480: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
f490: 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68 65       and the che
f4a0: 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73  cksum field does
f4b0: 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72   not match the r
f4c0: 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a  ecord content..*
f4d0: 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20  *.** Neither of 
f4e0: 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72  these two scenar
f4f0: 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65  ios are possible
f500: 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f   during a savepo
f510: 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  int rollback..**
f520: 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61  .** If this is a
f530: 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
f540: 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79  ack, then memory
f550: 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65 20   may have to be 
f560: 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61  dynamically.** a
f570: 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
f580: 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68   function. If th
f590: 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20 61  is is the case a
f5a0: 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  nd an allocation
f5b0: 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54   fails,.** SQLIT
f5c0: 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
f5d0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
f5e0: 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
f5f0: 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61  k_one_page(.  Pa
f600: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
f610: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f620: 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70  he pager being p
f630: 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20  layed back */.  
f640: 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20  i64 *pOffset,   
f650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f660: 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72   Offset of recor
f670: 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f  d to playback */
f680: 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65  .  Bitvec *pDone
f690: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f6a0: 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61   /* Bitvec of pa
f6b0: 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79  ges already play
f6c0: 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  ed back */.  int
f6d0: 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20   isMainJrnl,    
f6e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
f6f0: 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e  -> main journal.
f700: 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61   0 -> sub-journa
f710: 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61  l. */.  int isSa
f720: 76 65 70 6e 74 20 20 20 20 20 20 20 20 20 20 20  vepnt           
f730: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
f740: 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  r a savepoint ro
f750: 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69  llback */.){.  i
f760: 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
f770: 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  pPg;            
f780: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69         /* An exi
f790: 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68  sting page in th
f7a0: 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e  e cache */.  Pgn
f7b0: 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  o pgno;         
f7c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
f7d0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
f7e0: 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e   a page in journ
f7f0: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  al */.  u32 cksu
f800: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
f810: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
f820: 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74  m used for sanit
f830: 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20  y checking */.  
f840: 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20  char *aData;    
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f860: 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   Temporary stora
f870: 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ge for the page 
f880: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
f890: 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20  e *jfd;         
f8a0: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
f8b0: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
f8c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
f8d0: 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64  /.  int isSynced
f8e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f8f0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75    /* True if jou
f900: 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e  rnal page is syn
f910: 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ced */..  assert
f920: 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31  ( (isMainJrnl&~1
f930: 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  )==0 );      /* 
f940: 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20  isMainJrnl is 0 
f950: 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
f960: 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29  ( (isSavepnt&~1)
f970: 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20  ==0 );       /* 
f980: 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f  isSavepnt is 0 o
f990: 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  r 1 */.  assert(
f9a0: 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70   isMainJrnl || p
f9b0: 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70  Done );     /* p
f9c0: 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64  Done always used
f9d0: 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73   on sub-journals
f9e0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
f9f0: 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65  Savepnt || pDone
fa00: 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e  ==0 );   /* pDon
fa10: 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20  e never used on 
fa20: 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f  non-savepoint */
fa30: 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61 67  ..  aData = pPag
fa40: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
fa50: 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29   assert( aData )
fa60: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  ;         /* Tem
fa70: 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68  p storage must h
fa80: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
fa90: 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20   allocated */.  
faa0: 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
fab0: 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c  Wal(pPager)==0 |
fac0: 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26  | (!isMainJrnl &
fad0: 26 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b 0a  & isSavepnt) );.
fae0: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70  .  /* Read the p
faf0: 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70  age number and p
fb00: 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68  age data from th
fb10: 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62  e journal or sub
fb20: 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69  -journal.  ** fi
fb30: 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  le. Return an er
fb40: 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
fb50: 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20  caller if an IO 
fb60: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20  error occurs..  
fb70: 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69  */.  jfd = isMai
fb80: 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e  nJrnl ? pPager->
fb90: 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a  jfd : pPager->sj
fba0: 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33  fd;.  rc = read3
fbb0: 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66  2bits(jfd, *pOff
fbc0: 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69  set, &pgno);.  i
fbd0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
fbe0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
fbf0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
fc00: 61 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61  ad(jfd, (u8*)aDa
fc10: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
fc20: 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29  Size, (*pOffset)
fc30: 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  +4);.  if( rc!=S
fc40: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
fc50: 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74  n rc;.  *pOffset
fc60: 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
fc70: 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69  Size + 4 + isMai
fc80: 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53  nJrnl*4;..  /* S
fc90: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
fca0: 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
fcb0: 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
fcc0: 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
fcd0: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
fce0: 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
fcf0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
fd00: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
fd10: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
fd20: 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
fd30: 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
fd40: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
fd50: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
fd60: 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
fd70: 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
fd80: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
fd90: 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
fda0: 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
fdb0: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
fdc0: 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
fdd0: 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
fde0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
fdf0: 73 65 72 74 28 20 21 69 73 53 61 76 65 70 6e 74  sert( !isSavepnt
fe00: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
fe10: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
fe20: 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f    if( pgno>(Pgno
fe30: 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
fe40: 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
fe50: 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f  Test(pDone, pgno
fe60: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
fe70: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
fe80: 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
fe90: 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  ){.    rc = read
fea0: 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f  32bits(jfd, (*pO
feb0: 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d  ffset)-4, &cksum
fec0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
fed0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
fee0: 66 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26  f( !isSavepnt &&
fef0: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
ff00: 67 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29  ger, (u8*)aData)
ff10: 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20  !=cksum ){.     
ff20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
ff30: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
ff40: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67    /* If this pag
ff50: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
ff60: 65 6e 20 70 6c 61 79 65 64 20 62 79 20 62 65 66  en played by bef
ff70: 6f 72 65 20 64 75 72 69 6e 67 20 74 68 65 20 63  ore during the c
ff80: 75 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c  urrent.  ** roll
ff90: 62 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74  back, then don't
ffa0: 20 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20   bother to play 
ffb0: 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20  it back again.. 
ffc0: 20 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20   */.  if( pDone 
ffd0: 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  && (rc = sqlite3
ffe0: 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c  BitvecSet(pDone,
fff0: 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f   pgno))!=SQLITE_
10000 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
10010 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
10020 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
10030 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
10040 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
10050 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
10060 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e  VE );..  /* When
10070 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 70 61   playing back pa
10080 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20 74 68  ge 1, restore th
10090 65 20 6e 52 65 73 65 72 76 65 20 73 65 74 74 69  e nReserve setti
100a0 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  ng.  */.  if( pg
100b0 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65 72 2d  no==1 && pPager-
100c0 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75 38 2a  >nReserve!=((u8*
100d0 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a 20  )aData)[20] ){. 
100e0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
100f0 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44 61 74  rve = ((u8*)aDat
10100 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67 65  a)[20];.    page
10110 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
10120 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
10130 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
10140 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  n RESERVED state
10150 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
10160 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
10170 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
10180 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
10190 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
101a0 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
101b0 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
101c0 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
101d0 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
101e0 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
101f0 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
10200 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  se..  **.  ** An
10210 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
10220 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66  e above rule: If
10230 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
10240 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
10250 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65  .  ** and a page
10260 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67   is moved during
10270 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
10280 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20  vacuum then the 
10290 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f  page may.  ** no
102a0 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65  t be in the page
102b0 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20  r cache. Later: 
102c0 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  if a malloc() or
102d0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
102e0 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d  .  ** during a M
102f0 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20  ovepage() call, 
10300 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
10310 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  y not be in the 
10320 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65  cache.  ** eithe
10330 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74  r. So the condit
10340 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e  ion described in
10350 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67   the above parag
10360 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  raph is not.  **
10370 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20   assert()able.. 
10380 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45   **.  ** If in E
10390 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20  XCLUSIVE state, 
103a0 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
103b0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69  he pager cache i
103c0 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a  f it exists.  **
103d0 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
103e0 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
103f0 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20  then marked not 
10400 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dirty..  **.  **
10410 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20   Ticket #1171:  
10420 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  The statement jo
10430 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
10440 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ain page content
10450 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69   that is.  ** di
10460 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
10470 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74   page content at
10480 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
10490 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
104a0 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20   ** This occurs 
104b0 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63  when a page is c
104c0 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20  hanged prior to 
104d0 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73  the start of a s
104e0 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
104f0 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e  en changed again
10500 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
10510 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c  ement.  When rol
10520 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61  ling back such a
10530 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
10540 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74  we must not writ
10550 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  e to the origina
10560 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73  l database unles
10570 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66  s we know.  ** f
10580 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  or certain that 
10590 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
105a0 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65  ntents are synce
105b0 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  d into the main 
105c0 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
105d0 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73  urnal.  Otherwis
105e0 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  e, a power loss 
105f0 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69  might leave modi
10600 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65  fied data in the
10610 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
10620 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65  ile without an e
10630 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c  ntry in the roll
10640 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61  back journal tha
10650 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f  t can.  ** resto
10660 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
10670 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
10680 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69  form.  Two condi
10690 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20  tions must be.  
106a0 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72  ** met before wr
106b0 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
106c0 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29  abase files. (1)
106d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
106e0 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65  st be.  ** locke
106f0 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20  d.  (2) we know 
10700 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
10710 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  l page content i
10720 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20  s fully synced. 
10730 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   ** in the main 
10740 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62  journal either b
10750 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
10760 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
10770 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65  or else.  ** the
10780 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
10790 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a  as needSync==0..
107a0 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30    **.  ** 2008-0
107b0 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65  4-14:  When atte
107c0 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d  mpting to vacuum
107d0 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
107e0 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a  ase file, it.  *
107f0 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  * is possible to
10800 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e   fail a statemen
10810 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20  t on a database 
10820 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65  that does not ye
10830 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f  t exist..  ** Do
10840 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
10850 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73  write if databas
10860 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72  e file has never
10870 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20   been opened..  
10880 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  */.  if( pagerUs
10890 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
108a0 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d      pPg = 0;.  }
108b0 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 20 3d 20  else{.    pPg = 
108c0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
108d0 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  ger, pgno);.  }.
108e0 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c    assert( pPg ||
108f0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 50 41 47   !MEMDB );.  PAG
10900 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42 41  ERTRACE(("PLAYBA
10910 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CK %d page %d ha
10920 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a  sh(%08x) %s\n",.
10930 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
10940 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
10950 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  , pager_datahash
10960 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
10970 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a  e, (u8*)aData),.
10980 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d 61             (isMa
10990 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75  inJrnl?"main-jou
109a0 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e  rnal":"sub-journ
109b0 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28  al").  ));.  if(
109c0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20   isMainJrnl ){. 
109d0 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50     isSynced = pP
109e0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20  ager->noSync || 
109f0 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61  (*pOffset <= pPa
10a00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
10a10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
10a20 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d  sSynced = (pPg==
10a30 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c  0 || 0==(pPg->fl
10a40 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44  ags & PGHDR_NEED
10a50 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69  _SYNC));.  }.  i
10a60 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74  f( (pPager->stat
10a70 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
10a80 56 45 29 0a 20 20 20 26 26 20 69 73 4f 70 65 6e  VE).   && isOpen
10a90 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20  (pPager->fd).   
10aa0 26 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b  && isSynced.  ){
10ab0 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20  .    i64 ofst = 
10ac0 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
10ad0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
10ae0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69      testcase( !i
10af0 73 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21  sSavepnt && pPg!
10b00 3d 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67  =0 && (pPg->flag
10b10 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
10b20 43 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  C)!=0 );.    ass
10b30 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
10b40 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
10b50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
10b60 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
10b70 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61   (u8*)aData, pPa
10b80 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
10b90 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67  fst);.    if( pg
10ba0 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
10bb0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  eSize ){.      p
10bc0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
10bd0 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a  e = pgno;.    }.
10be0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
10bf0 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20  pBackup ){.     
10c00 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
10c10 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  aData, pgno, 3, 
10c20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  rc=SQLITE_NOMEM)
10c30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
10c40 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
10c50 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
10c60 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a  o, (u8*)aData);.
10c70 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
10c80 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
10c90 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 7, rc=SQLITE_N
10ca0 4f 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20  OMEM, aData);.  
10cb0 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
10cc0 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70  !isMainJrnl && p
10cd0 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
10ce0 49 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c  If this is a rol
10cf0 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70  lback of a savep
10d00 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61  oint and data wa
10d10 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f  s not written to
10d20 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
10d30 62 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67  base and the pag
10d40 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f  e is not in-memo
10d50 72 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70  ry, there is a p
10d60 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20  otential.    ** 
10d70 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68  problem. When th
10d80 65 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66  e page is next f
10d90 65 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d  etched by the b-
10da0 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a  tree layer, it .
10db0 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72      ** will be r
10dc0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
10dd0 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63  abase file, whic
10de0 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  h may or may not
10df0 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72   be .    ** curr
10e00 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ent. .    **.   
10e10 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20   ** There are a 
10e20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72  couple of differ
10e30 65 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61  ent ways this ca
10e40 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72  n happen. All ar
10e50 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f  e quite.    ** o
10e60 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e  bscure. When run
10e70 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e  ning in synchron
10e80 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63  ous mode, this c
10e90 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a  an only happen .
10ea0 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61      ** if the pa
10eb0 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65  ge is on the fre
10ec0 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74  e-list at the st
10ed0 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
10ee0 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  action, then.   
10ef0 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74   ** populated, t
10f00 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20  hen moved using 
10f10 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
10f20 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  page()..    **. 
10f30 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69     ** The soluti
10f40 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20  on is to add an 
10f50 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74  in-memory page t
10f60 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  o the cache cont
10f70 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  aining.    ** th
10f80 65 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64  e data just read
10f90 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
10fa0 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20  urnal. Mark the 
10fb0 70 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20  page as dirty . 
10fc0 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65     ** and if the
10fd0 20 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20   pager requires 
10fe0 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20  a journal-sync, 
10ff0 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61  then mark the pa
11000 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65  ge as .    ** re
11010 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61  quiring a journa
11020 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74  l-sync before it
11030 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20   is written..   
11040 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
11050 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20  isSavepnt );.   
11060 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11070 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30 20 29  >doNotSpill==0 )
11080 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
11090 4e 6f 74 53 70 69 6c 6c 2b 2b 3b 0a 20 20 20 20  NotSpill++;.    
110a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
110b0 72 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c  rAcquire(pPager,
110c0 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b   pgno, &pPg, 1);
110d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
110e0 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d  ger->doNotSpill=
110f0 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =1 );.    pPager
11100 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2d 2d 3b 0a  ->doNotSpill--;.
11110 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11120 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
11130 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  c;.    pPg->flag
11140 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44  s &= ~PGHDR_NEED
11150 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74  _READ;.    sqlit
11160 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
11170 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66  y(pPg);.  }.  if
11180 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20  ( pPg ){.    /* 
11190 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65  No page should e
111a0 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c  ver be explicitl
111b0 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  y rolled back th
111c0 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78  at is in use, ex
111d0 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20  cept.    ** for 
111e0 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20  page 1 which is 
111f0 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f  held in use in o
11200 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65  rder to keep the
11210 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
11220 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74   ** database act
11230 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63  ive. However suc
11240 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20  h a page may be 
11250 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
11260 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f   result.    ** o
11270 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72  f an internal er
11280 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e  ror resulting in
11290 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61   an automatic ca
112a0 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
112b0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
112c0 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  k()..    */.    
112d0 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
112e0 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44   pData = pPg->pD
112f0 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ata;.    memcpy(
11300 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74  pData, (u8*)aDat
11310 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
11320 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ize);.    pPager
11330 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29  ->xReiniter(pPg)
11340 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e  ;.    if( isMain
11350 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65  Jrnl && (!isSave
11360 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c  pnt || *pOffset<
11370 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
11380 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Hdr) ){.      /*
11390 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   If the contents
113a0 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65   of this page we
113b0 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64  re just restored
113c0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a   from the main .
113d0 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
113e0 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20   file, then its 
113f0 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20  content must be 
11400 61 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65  as they were whe
11410 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
11420 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
11430 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e  first opened. In
11440 20 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61   this case we ca
11450 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a  n mark the page.
11460 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61        ** as clea
11470 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77  n, since there w
11480 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74  ill be no need t
11490 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74  o write it out t
114a0 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  o the.      ** d
114b0 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
114c0 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65  *.      ** There
114d0 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f   is one exceptio
114e0 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20  n to this rule. 
114f0 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62  If the page is b
11500 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20  eing rolled.    
11510 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72    ** back as par
11520 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  t of a savepoint
11530 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20   (or statement) 
11540 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e  rollback from an
11550 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e   .      ** unsyn
11560 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  ced portion of t
11570 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
11580 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73  file, then it is
11590 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20   not safe.      
115a0 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70  ** to mark the p
115b0 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68  age as clean. Th
115c0 69 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61  is is because ma
115d0 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61  rking the page a
115e0 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e  s.      ** clean
115f0 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20   will clear the 
11600 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
11610 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20  flag. Since the 
11620 70 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  page is.      **
11630 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
11640 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65  journal file (re
11650 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e  corded in Pager.
11660 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a  pInJournal) and.
11670 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48        ** the PGH
11680 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
11690 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66  g is cleared, if
116a0 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69   the page is wri
116b0 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a  tten to.      **
116c0 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
116d0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
116e0 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65  it will be marke
116f0 64 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20  d as dirty but. 
11700 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
11710 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
11720 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74   will not be set
11730 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20  . It could then 
11740 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20  potentially.    
11750 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20    ** be written 
11760 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74  out into the dat
11770 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
11780 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69  e its journal fi
11790 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d  le.      ** segm
117a0 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49  ent is synced. I
117b0 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73  f a crash occurs
117c0 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f   during or follo
117d0 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20  wing this,.     
117e0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72   ** database cor
117f0 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75  ruption may ensu
11800 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
11810 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
11820 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
11830 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
11840 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70  cacheMakeClean(p
11850 50 67 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  Pg);.    }.#ifde
11860 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
11870 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
11880 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
11890 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
118a0 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74  ndif.    /* If t
118b0 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20  his was page 1, 
118c0 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65  then restore the
118d0 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
118e0 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20  dbFileVers..    
118f0 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72  ** Do this befor
11900 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20  e any decoding. 
11910 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  */.    if( pgno=
11920 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  =1 ){.      memc
11930 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
11940 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70  leVers, &((u8*)p
11950 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66  Data)[24],sizeof
11960 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
11970 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ers));.    }..  
11980 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20    /* Decode the 
11990 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66  page just read f
119a0 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20  rom disk */.    
119b0 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
119c0 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
119d0 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   3, rc=SQLITE_NO
119e0 4d 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  MEM);.    sqlite
119f0 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70  3PcacheRelease(p
11a00 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Pg);.  }.  retur
11a10 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
11a20 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
11a30 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
11a40 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
11a50 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
11a60 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
11a70 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
11a80 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11a90 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
11aa0 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
11ab0 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
11ac0 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
11ad0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
11ae0 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
11af0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
11b00 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
11b10 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41  f it is..**.** A
11b20 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20  rgument zMaster 
11b30 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67  may point to Pag
11b40 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f  er.pTmpSpace. So
11b50 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20   that buffer is 
11b60 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  not .** availabl
11b70 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e  e for use within
11b80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
11b90 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73  **.** When a mas
11ba0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11bb0 20 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20   is created, it 
11bc0 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
11bd0 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20  h the names .** 
11be0 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68  of all of its ch
11bf0 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e  ild journals, on
11c00 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c  e after another,
11c10 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74   formatted as ut
11c20 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20  f-8 .** encoded 
11c30 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66  text. The end of
11c40 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   each child jour
11c50 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b  nal file is mark
11c60 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75  ed with a .** nu
11c70 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
11c80 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74  e (0x00). i.e. t
11c90 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
11ca0 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ts of a master j
11cb0 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66  ournal.** file f
11cc0 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
11cd0 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64   involving two d
11ce0 61 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62  atabases might b
11cf0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d  e:.**.**   "/hom
11d00 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72  e/bill/a.db-jour
11d10 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c  nal\x00/home/bil
11d20 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/b.db-journal\x
11d30 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74  00".**.** A mast
11d40 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
11d50 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65  may only be dele
11d60 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20  ted once all of 
11d70 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f  its child .** jo
11d80 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e  urnals have been
11d90 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
11da0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
11db0 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74  n reads the cont
11dc0 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ents of the mast
11dd0 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er-journal file 
11de0 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  into .** memory 
11df0 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67  and loops throug
11e00 68 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68  h each of the ch
11e10 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ild journal name
11e20 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63  s. For.** each c
11e30 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  hild journal, it
11e40 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a   checks if:.**.*
11e50 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69  *   * if the chi
11e60 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  ld journal exist
11e70 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20  s, and if so.** 
11e80 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64    * if the child
11e90 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
11ea0 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
11eb0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11ec0 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61  .**     file zMa
11ed0 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ster.**.** If a 
11ee0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61  child journal ca
11ef0 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20  n be found that 
11f00 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20  matches both of 
11f10 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20  the criteria.** 
11f20 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63  above, this func
11f30 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74  tion returns wit
11f40 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
11f50 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ing. Otherwise, 
11f60 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68  if.** no such ch
11f70 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ild journal can 
11f80 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a  be found, file z
11f90 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65  Master is delete
11fa0 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69  d from.** the fi
11fb0 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20  le-system using 
11fc0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
11fd0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  )..**.** If an I
11fe0 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74  O error within t
11ff0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e  his function, an
12000 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
12010 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a  eturned. This.**
12020 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
12030 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61  tes memory by ca
12040 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c  lling sqlite3Mal
12050 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c  loc(). If an all
12060 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73  ocation.** fails
12070 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
12080 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
12090 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20  rwise, if no IO 
120a0 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  or malloc errors
120b0 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49   .** occur, SQLI
120c0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
120d0 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54  d..**.** TODO: T
120e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
120f0 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20  ocates a single 
12100 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20  block of memory 
12110 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65  to load.** the e
12120 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
12130 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
12140 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
12150 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f  could be.** a co
12160 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65  uple of kilobyte
12170 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74  s or so - potent
12180 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61  ially larger tha
12190 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73  n the page .** s
121a0 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
121b0 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74  nt pager_delmast
121c0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
121d0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
121e0 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  aster){.  sqlite
121f0 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
12200 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
12210 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
12220 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
12230 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
12240 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
12250 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27  r;    /* Malloc'
12260 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  d master-journal
12270 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
12280 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
12290 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20  le *pJournal;   
122a0 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c  /* Malloc'd chil
122b0 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  d-journal file d
122c0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63  escriptor */.  c
122d0 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72  har *zMasterJour
122e0 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74  nal = 0; /* Cont
122f0 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ents of master j
12300 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
12310 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72   i64 nMasterJour
12320 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  nal;       /* Si
12330 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ze of master jou
12340 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63  rnal file */.  c
12350 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20  har *zJournal;  
12360 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
12370 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e  ter to one journ
12380 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c  al within MJ fil
12390 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  e */.  char *zMa
123a0 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20  sterPtr;        
123b0 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c   /* Space to hol
123c0 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72  d MJ filename fr
123d0 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  om a journal fil
123e0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74  e */.  int nMast
123f0 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20  erPtr;          
12400 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70   /* Amount of sp
12410 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ace allocated to
12420 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f   zMasterPtr[] */
12430 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
12440 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74  space for both t
12450 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20  he pJournal and 
12460 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73  pMaster file des
12470 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49  criptors..  ** I
12480 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70  f successful, op
12490 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
124a0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72  urnal file for r
124b0 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70  eading..  */.  p
124c0 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65  Master = (sqlite
124d0 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33  3_file *)sqlite3
124e0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d  MallocZero(pVfs-
124f0 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a  >szOsFile * 2);.
12500 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71    pJournal = (sq
12510 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28  lite3_file *)(((
12520 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20  u8 *)pMaster) + 
12530 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b  pVfs->szOsFile);
12540 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20  .  if( !pMaster 
12550 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
12560 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
12570 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  e{.    const int
12580 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45   flags = (SQLITE
12590 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
125a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
125b0 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  R_JOURNAL);.    
125c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
125d0 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  en(pVfs, zMaster
125e0 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73  , pMaster, flags
125f0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
12600 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
12610 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
12620 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74  ut;..  /* Load t
12630 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
12640 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
12650 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
12660 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69  d from.  ** sqli
12670 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  te3_malloc() and
12680 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
12690 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20  MasterJournal.  
126a0 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a   Also obtain.  *
126b0 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  * sufficient spa
126c0 63 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74  ce (in zMasterPt
126d0 72 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  r) to hold the n
126e0 61 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20  ames of master. 
126f0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
12700 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
12710 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63   regular rollbac
12720 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f  k-journals..  */
12730 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
12740 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65  sFileSize(pMaste
12750 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  r, &nMasterJourn
12760 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  al);.  if( rc!=S
12770 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
12780 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
12790 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56   nMasterPtr = pV
127a0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
127b0 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ;.  zMasterJourn
127c0 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  al = sqlite3Mall
127d0 6f 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a  oc((int)nMasterJ
127e0 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72  ournal + nMaster
127f0 50 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20  Ptr + 1);.  if( 
12800 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  !zMasterJournal 
12810 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
12820 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
12830 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
12840 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50  ;.  }.  zMasterP
12850 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75  tr = &zMasterJou
12860 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72  rnal[nMasterJour
12870 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73  nal+1];.  rc = s
12880 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61  qlite3OsRead(pMa
12890 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75  ster, zMasterJou
128a0 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74  rnal, (int)nMast
128b0 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  erJournal, 0);. 
128c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
128d0 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
128e0 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74  ter_out;.  zMast
128f0 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65  erJournal[nMaste
12900 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a  rJournal] = 0;..
12910 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
12920 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77  sterJournal;.  w
12930 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d  hile( (zJournal-
12940 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c  zMasterJournal)<
12950 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  nMasterJournal )
12960 7b 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73  {.    int exists
12970 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
12980 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
12990 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54   zJournal, SQLIT
129a0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
129b0 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69   &exists);.    i
129c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
129d0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64   ){.      goto d
129e0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
129f0 20 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73    }.    if( exis
12a00 74 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  ts ){.      /* O
12a10 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
12a20 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
12a30 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
12a40 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
12a50 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64    ** Open it and
12a60 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69   check if it poi
12a70 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65  nts at the maste
12a80 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  r journal. If.  
12a90 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72      ** so, retur
12aa0 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69  n without deleti
12ab0 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
12ac0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
12ad0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63    */.      int c
12ae0 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67  ;.      int flag
12af0 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
12b00 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
12b10 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
12b20 41 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  AL);.      rc = 
12b30 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
12b40 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a  fs, zJournal, pJ
12b50 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30  ournal, flags, 0
12b60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
12b70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12b80 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
12b90 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
12ba0 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  }..      rc = re
12bb0 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
12bc0 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65  pJournal, zMaste
12bd0 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72  rPtr, nMasterPtr
12be0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12bf0 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c  OsClose(pJournal
12c00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
12c10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12c20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
12c30 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
12c40 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61  }..      c = zMa
12c50 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26  sterPtr[0]!=0 &&
12c60 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50   strcmp(zMasterP
12c70 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b  tr, zMaster)==0;
12c80 0a 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a  .      if( c ){.
12c90 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61          /* We ha
12ca0 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e  ve a match. Do n
12cb0 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
12cc0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
12cd0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f  e. */.        go
12ce0 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
12cf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12d00 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20      zJournal += 
12d10 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  (sqlite3Strlen30
12d20 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20  (zJournal)+1);. 
12d30 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73   }. .  sqlite3Os
12d40 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a  Close(pMaster);.
12d50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
12d60 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
12d70 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61  ster, 0);..delma
12d80 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  ster_out:.  sqli
12d90 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
12da0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
12db0 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73  pMaster ){.    s
12dc0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d  qlite3OsClose(pM
12dd0 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65  aster);.    asse
12de0 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75  rt( !isOpen(pJou
12df0 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c  rnal) );.    sql
12e00 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65  ite3_free(pMaste
12e10 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
12e20 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
12e30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12e40 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  used to change t
12e50 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f  he actual size o
12e60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  f the database .
12e70 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66  ** file in the f
12e80 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73  ile-system. This
12e90 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68   only happens wh
12ea0 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  en committing a 
12eb0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20  transaction,.** 
12ec0 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  or rolling back 
12ed0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  a transaction (i
12ee0 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67  ncluding rolling
12ef0 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72   back a hot-jour
12f00 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  nal)..**.** If t
12f10 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
12f20 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65   file is not ope
12f30 6e 2c 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  n, or an exclusi
12f40 76 65 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a 2a  ve lock is not.*
12f50 2a 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e  * held, this fun
12f60 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
12f70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
12f80 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
12f90 65 20 69 73 0a 2a 2a 20 63 68 61 6e 67 65 64 20  e is.** changed 
12fa0 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20 28  to nPage pages (
12fb0 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61  nPage*pPager->pa
12fc0 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20 49  geSize bytes). I
12fd0 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 6f 6e  f the file.** on
12fe0 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74   disk is current
12ff0 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e  ly larger than n
13000 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e  Page pages, then
13010 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20   use the VFS.** 
13020 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68  xTruncate() meth
13030 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69  od to truncate i
13040 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20  t..**.** Or, it 
13050 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65 20 74  might might be t
13060 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65  he case that the
13070 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
13080 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a   smaller than .*
13090 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53  * nPage pages. S
130a0 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ome operating sy
130b0 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74  stem implementat
130c0 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e  ions can get con
130d0 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75  fused if .** you
130e0 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65   try to truncate
130f0 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20   a file to some 
13100 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72  size that is lar
13110 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20  ger than it .** 
13120 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f  currently is, so
13130 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73   detect this cas
13140 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69  e and write a si
13150 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74  ngle zero byte t
13160 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  o .** the end of
13170 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e   the new file in
13180 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  stead..**.** If 
13190 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
131a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  rn SQLITE_OK. If
131b0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
131c0 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79  urs while modify
131d0 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ing.** the datab
131e0 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e  ase file, return
131f0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
13200 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
13210 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
13220 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
13230 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
13240 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  nPage){.  int rc
13250 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13260 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
13270 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
13280 56 45 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  VE && isOpen(pPa
13290 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
132a0 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c  i64 currentSize,
132b0 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 2f 2a   newSize;.    /*
132c0 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66   TODO: Is it saf
132d0 65 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64  e to use Pager.d
132e0 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20  bFileSize here? 
132f0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
13300 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
13310 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65  ager->fd, &curre
13320 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77  ntSize);.    new
13330 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
13340 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61  ageSize*(i64)nPa
13350 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ge;.    if( rc==
13360 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72  SQLITE_OK && cur
13370 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a  rentSize!=newSiz
13380 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  e ){.      if( c
13390 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69  urrentSize>newSi
133a0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ze ){.        rc
133b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
133c0 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  cate(pPager->fd,
133d0 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20   newSize);.     
133e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
133f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
13400 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
13410 22 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31  "", 1, newSize-1
13420 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
13430 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13440 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  OK ){.        pP
13450 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
13460 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
13470 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
13480 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13490 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20  * Set the value 
134a0 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65 63  of the Pager.sec
134b0 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65  torSize variable
134c0 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
134d0 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e  * pager based on
134e0 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
134f0 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74  ned by the xSect
13500 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a  orSize method.**
13510 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74   of the open dat
13520 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
13530 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c  sector size will
13540 20 62 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a   be used used .*
13550 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  * to determine t
13560 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67  he size and alig
13570 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c  nment of journal
13580 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20   header and .** 
13590 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
135a0 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63  ointers within c
135b0 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66  reated journal f
135c0 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  iles..**.** For 
135d0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  temporary files 
135e0 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
135f0 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77  ctor size is alw
13600 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a  ays 512 bytes..*
13610 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
13620 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72  for non-temporar
13630 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66  y files, the eff
13640 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
13650 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c  ze is.** the val
13660 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
13670 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29  he xSectorSize()
13680 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20   method rounded 
13690 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69  up to 32 if.** i
136a0 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33  t is less than 3
136b0 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f  2, or rounded do
136c0 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52  wn to MAX_SECTOR
136d0 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69  _SIZE if it.** i
136e0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d  s greater than M
136f0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a  AX_SECTOR_SIZE..
13700 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
13710 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67  etSectorSize(Pag
13720 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
13730 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
13740 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
13750 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
13760 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
13770 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
13780 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
13790 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66  doesn't matter f
137a0 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
137b0 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69  es. Also, the fi
137c0 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  le.    ** may no
137d0 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
137e0 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68  ed yet, in which
137f0 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74   case the OsSect
13800 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
13810 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75  call will segfau
13820 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  lt..    */.    p
13830 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
13840 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63  e = sqlite3OsSec
13850 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  torSize(pPager->
13860 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  fd);.  }.  if( p
13870 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
13880 65 3c 33 32 20 29 7b 0a 20 20 20 20 70 50 61 67  e<32 ){.    pPag
13890 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
138a0 20 35 31 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20   512;.  }.  if( 
138b0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
138c0 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ze>MAX_SECTOR_SI
138d0 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ZE ){.    assert
138e0 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  ( MAX_SECTOR_SIZ
138f0 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 70 50  E>=512 );.    pP
13900 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
13910 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49   = MAX_SECTOR_SI
13920 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ZE;.  }.}../*.**
13930 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f   Playback the jo
13940 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72  urnal and thus r
13950 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
13960 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74  ase file to.** t
13970 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
13980 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61  in before we sta
13990 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e  rted making chan
139a0 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ges.  .**.** The
139b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
139c0 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f  rmat is as follo
139d0 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20  ws: .**.**  (1) 
139e0 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20   8 byte prefix. 
139f0 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72   A copy of aJour
13a00 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20  nalMagic[]..**  
13a10 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (2)  4 byte big-
13a20 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
13a30 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
13a40 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65  er of valid page
13a50 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20   records.**     
13a60 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c    in the journal
13a70 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
13a80 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
13a90 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65  then compute the
13aa0 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72  .**       number
13ab0 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
13ac0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
13ad0 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20  l size..**  (3) 
13ae0 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
13af0 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
13b00 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
13b10 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a  value for the .*
13b20 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63  *       sanity c
13b30 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29  hecksum..**  (4)
13b40 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
13b50 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
13b60 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f  mber of pages to
13b70 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
13b80 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
13b90 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  to during a roll
13ba0 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34  back..**  (5)  4
13bb0 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
13bc0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
13bd0 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  s the sector siz
13be0 65 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a  e.  The header.*
13bf0 2a 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20  *       is this 
13c00 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69  many bytes in si
13c10 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62  ze..**  (6)  4 b
13c20 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
13c30 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
13c40 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
13c50 2a 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64  *  (7)  zero pad
13c60 64 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20  ding out to the 
13c70 6e 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65  next sector size
13c80 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20  ..**  (8)  Zero 
13c90 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e  or more pages in
13ca0 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73  stances, each as
13cb0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20   follows:.**    
13cc0 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61      +  4 byte pa
13cd0 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20  ge number..**   
13ce0 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e       +  pPager->
13cf0 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
13d00 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20  f data..**      
13d10 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63    +  4 byte chec
13d20 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ksum.**.** When 
13d30 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20  we speak of the 
13d40 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
13d50 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73  we mean the firs
13d60 74 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e  t 7 items above.
13d70 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69  .** Each entry i
13d80 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
13d90 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
13da0 74 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a  the 8th item..**
13db0 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c  .** Call the val
13dc0 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  ue from the seco
13dd0 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22  nd bullet "nRec"
13de0 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e  .  nRec is the n
13df0 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69  umber of.** vali
13e00 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69  d page entries i
13e10 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
13e20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79  In most cases, y
13e30 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ou can compute t
13e40 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e  he.** value of n
13e50 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  Rec from the siz
13e60 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
13e70 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61   file.  But if a
13e80 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
13e90 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  e occurred while
13ea0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
13eb0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
13ec0 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a  it could be the.
13ed0 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65  ** case that the
13ee0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
13ef0 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c  rnal file had al
13f00 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
13f10 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20  ased but.** the 
13f20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61  extra entries ha
13f30 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69  d not yet made i
13f40 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b  t safely to disk
13f50 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73  .  In such a cas
13f60 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  e,.** the value 
13f70 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  of nRec computed
13f80 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
13f90 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f  ize would be too
13fa0 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20   large.  For.** 
13fb0 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20  that reason, we 
13fc0 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e  always use the n
13fd0 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65  Rec value in the
13fe0 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   header..**.** I
13ff0 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  f the nRec value
14000 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69   is 0xffffffff i
14010 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65  t means that nRe
14020 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  c should be comp
14030 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  uted.** from the
14040 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69   file size.  Thi
14050 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20  s value is used 
14060 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65  when the user se
14070 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d  lects the.** no-
14080 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20  sync option for 
14090 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20  the journal.  A 
140a0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
140b0 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72  uld lead to corr
140c0 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69  uption.** in thi
140d0 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72  s case.  But for
140e0 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d   things like tem
140f0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68  porary table (wh
14100 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64  ich will be.** d
14110 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
14120 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
14130 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65  d) we don't care
14140 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
14150 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20   file opened as 
14160 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
14170 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66   is not a well-f
14180 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ormed.** journal
14190 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70   file then all p
141a0 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66  ages up to the f
141b0 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70  irst corrupted p
141c0 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a  age are rolled.*
141d0 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61  * back (or no pa
141e0 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ges if the journ
141f0 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72  al header is cor
14200 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75  rupted). The jou
14210 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
14220 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64  then deleted and
14230 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
14240 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20  ned, just as if 
14250 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61  no corruption ha
14260 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e  d.** been encoun
14270 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tered..**.** If 
14280 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63  an I/O or malloc
14290 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
142a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   the journal-fil
142b0 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64  e is not deleted
142c0 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
142d0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
142e0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48  d..**.** The isH
142f0 6f 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64  ot parameter ind
14300 69 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61  icates that we a
14310 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c  re trying to rol
14320 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a  lback a journal.
14330 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  ** that might be
14340 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20   a hot journal. 
14350 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65   Or, it could be
14360 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
14370 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76  l is .** preserv
14380 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f  ed because of JO
14390 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
143a0 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  T or JOURNALMODE
143b0 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66  _TRUNCATE..** If
143c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61   the journal rea
143d0 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65  lly is hot, rese
143e0 74 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  t the pager cach
143f0 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a  e prior rolling.
14400 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74  ** back any cont
14410 65 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75  ent.  If the jou
14420 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70  rnal is merely p
14430 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65  ersistent, no re
14440 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64  set is.** needed
14450 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14460 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50  pager_playback(P
14470 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
14480 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69  t isHot){.  sqli
14490 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
144a0 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
144b0 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
144c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
144d0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
144e0 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
144f0 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20  .  u32 nRec;    
14500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
14510 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
14520 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
14530 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20  */.  u32 u;     
14540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14550 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
14560 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f  ounter */.  Pgno
14570 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20   mxPg = 0;      
14580 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
14590 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  the original fil
145a0 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20  e in pages */.  
145b0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
145c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
145d0 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62  lt code of a sub
145e0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
145f0 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20   res = 1;       
14600 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
14610 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
14620 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a  e3OsAccess() */.
14630 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
14640 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
14650 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  me of master jou
14660 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79  rnal file if any
14670 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61   */.  int needPa
14680 67 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f  gerReset;      /
14690 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20  * True to reset 
146a0 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69  page prior to fi
146b0 72 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63  rst page rollbac
146c0 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  k */..  /* Figur
146d0 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
146e0 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
146f0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72  e journal.  Abor
14700 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20  t early if.  ** 
14710 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65  the journal is e
14720 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mpty..  */.  ass
14730 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
14740 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63  er->jfd) );.  rc
14750 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
14760 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
14770 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
14780 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
14790 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  szJ==0 ){.    go
147a0 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
147b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
147c0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
147d0 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65  al name from the
147e0 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20   journal, if it 
147f0 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a  is present..  **
14800 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
14810 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
14820 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74  s specified, but
14830 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
14840 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e  .  ** present on
14850 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20   disk, then the 
14860 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68  journal is not h
14870 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ot and does not 
14880 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20  need to be.  ** 
14890 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
148a0 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63  *.  ** TODO: Tec
148b0 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c  hnically the fol
148c0 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72  lowing is an err
148d0 6f 72 20 62 65 63 61 75 73 65 20 69 74 20 61 73  or because it as
148e0 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  sumes that.  ** 
148f0 62 75 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d  buffer Pager.pTm
14900 70 53 70 61 63 65 20 69 73 20 28 6d 78 50 61 74  pSpace is (mxPat
14910 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f  hname+1) bytes o
14920 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74  r larger. i.e. t
14930 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72  hat.  ** (pPager
14940 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50  ->pageSize >= pP
14950 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
14960 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67  thname+1). Using
14970 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a   os_unix.c,.  **
14980 20 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20    mxPathname is 
14990 35 31 32 2c 20 77 68 69 63 68 20 69 73 20 74 68  512, which is th
149a0 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69  e same as the mi
149b0 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20  nimum allowable 
149c0 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70  value.  ** for p
149d0 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  ageSize..  */.  
149e0 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72  zMaster = pPager
149f0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72  ->pTmpSpace;.  r
14a00 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
14a10 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
14a20 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  d, zMaster, pPag
14a30 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
14a40 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72  name+1);.  if( r
14a50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
14a60 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20  zMaster[0] ){.  
14a70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14a80 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61  Access(pVfs, zMa
14a90 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43  ster, SQLITE_ACC
14aa0 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73  ESS_EXISTS, &res
14ab0 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  );.  }.  zMaster
14ac0 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d   = 0;.  if( rc!=
14ad0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65  SQLITE_OK || !re
14ae0 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  s ){.    goto en
14af0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
14b00 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
14b10 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64  lOff = 0;.  need
14b20 50 61 67 65 72 52 65 73 65 74 20 3d 20 69 73 48  PagerReset = isH
14b30 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c  ot;..  /* This l
14b40 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65  oop terminates e
14b50 69 74 68 65 72 20 77 68 65 6e 20 61 20 72 65 61  ither when a rea
14b60 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72  dJournalHdr() or
14b70 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61   .  ** pager_pla
14b80 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29  yback_one_page()
14b90 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51   call returns SQ
14ba0 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20  LITE_DONE or an 
14bb0 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f  IO error .  ** o
14bc0 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77  ccurs. .  */.  w
14bd0 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f  hile( 1 ){.    /
14be0 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20  * Read the next 
14bf0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
14c00 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
14c10 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20  file.  If there 
14c20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65  are.    ** not e
14c30 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74  nough bytes left
14c40 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
14c50 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c  file for a compl
14c60 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20  ete header, or. 
14c70 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72     ** it is corr
14c80 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72  upted, then a pr
14c90 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61  ocess must of fa
14ca0 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  iled while writi
14cb0 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ng it..    ** Th
14cc0 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74  is indicates not
14cd0 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20  hing more needs 
14ce0 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
14cf0 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  k..    */.    rc
14d00 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
14d10 72 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c  r(pPager, isHot,
14d20 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78   szJ, &nRec, &mx
14d30 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
14d40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20  =SQLITE_OK ){ . 
14d50 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
14d60 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
14d70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14d80 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
14d90 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
14da0 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ack;.    }..    
14db0 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78  /* If nRec is 0x
14dc0 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74  ffffffff, then t
14dd0 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  his journal was 
14de0 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
14df0 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b  cess.    ** work
14e00 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  ing in no-sync m
14e10 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ode. This means 
14e20 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66  that the rest of
14e30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
14e40 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74   ** file consist
14e50 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72  s of pages, ther
14e60 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f  e are no more jo
14e70 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43  urnal headers. C
14e80 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68  ompute.    ** th
14e90 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
14ea0 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73  based on this as
14eb0 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  sumption..    */
14ec0 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
14ed0 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  xffffffff ){.   
14ee0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
14ef0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
14f00 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
14f10 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e  ager) );.      n
14f20 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a  Rec = (int)((szJ
14f30 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   - JOURNAL_HDR_S
14f40 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e  Z(pPager))/JOURN
14f50 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
14f60 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
14f70 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e   If nRec is 0 an
14f80 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20  d this rollback 
14f90 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  is of a transact
14fa0 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74  ion created by t
14fb0 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  his.    ** proce
14fc0 73 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69  ss and if this i
14fd0 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64  s the final head
14fe0 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  er in the journa
14ff0 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73  l, then it means
15000 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69  .    ** that thi
15010 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f  s part of the jo
15020 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
15030 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e  filled but has n
15040 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20  ot yet been.    
15050 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  ** synced to dis
15060 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20  k.  Compute the 
15070 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
15080 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d  based on the rem
15090 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69  aining.    ** si
150a0 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a  ze of the file..
150b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
150c0 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20  e third term of 
150d0 74 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64  the test was add
150e0 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74  ed to fix ticket
150f0 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57   #2565..    ** W
15100 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
15110 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20   a hot journal, 
15120 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d  nRec==0 always m
15130 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65  eans that the ne
15140 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20  xt.    ** chunk 
15150 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63  of the journal c
15160 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67  ontains zero pag
15170 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  es to be rolled 
15180 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a  back.  But.    *
15190 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52  * when doing a R
151a0 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20  OLLBACK and the 
151b0 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73  nRec==0 chunk is
151c0 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20   the last chunk 
151d0 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  in.    ** the jo
151e0 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20  urnal, it means 
151f0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
15200 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61   might contain a
15210 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a  dditional.    **
15220 20 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64   pages that need
15230 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
15240 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ck and that the 
15250 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
15260 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62  .    ** should b
15270 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64  e computed based
15280 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
15290 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a  file size..    *
152a0 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
152b0 30 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20  0 && !isHot &&. 
152c0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
152d0 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
152e0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
152f0 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
15300 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52  lOff ){.      nR
15310 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
15320 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
15330 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f  lOff) / JOURNAL_
15340 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a  PG_SZ(pPager));.
15350 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
15360 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
15370 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66  st header read f
15380 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
15390 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
153a0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
153b0 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  le back to its o
153c0 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
153d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
153e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
153f0 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
15400 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
15410 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
15420 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50  cate(pPager, mxP
15430 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
15440 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15450 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
15460 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
15470 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
15480 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20  dbSize = mxPg;. 
15490 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70     }..    /* Cop
154a0 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
154b0 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72   out of the jour
154c0 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
154d0 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61  o the .    ** da
154e0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f  tabase file and/
154f0 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20  or page cache.. 
15500 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d     */.    for(u=
15510 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b  0; u<nRec; u++){
15520 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50  .      if( needP
15530 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20  agerReset ){.   
15540 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
15550 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
15560 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74    needPagerReset
15570 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
15580 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
15590 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
155a0 28 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d  (pPager,&pPager-
155b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c  >journalOff,0,1,
155c0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
155d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
155e0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
155f0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
15600 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
15610 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
15620 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
15630 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
15640 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15650 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
15660 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
15670 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
15680 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
15690 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
156a0 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69  en truncated, si
156b0 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e  mply stop readin
156c0 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  g and.          
156d0 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  ** processing th
156e0 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20  e journal. This 
156f0 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20  might happen if 
15700 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a  the journal was.
15710 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74            ** not
15720 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74   completely writ
15730 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70  ten and synced p
15740 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e  rior to a crash.
15750 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20    In that.      
15760 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65      ** case, the
15770 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
15780 20 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e   have never been
15790 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a   written in the.
157a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72            ** fir
157b0 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69  st place so it i
157c0 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61  s OK to simply a
157d0 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62  bandon the rollb
157e0 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ack. */.        
157f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
15800 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
15810 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
15820 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
15830 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
15840 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72   are unable to r
15850 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e  ollback, quit an
15860 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  d return the err
15870 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  or.          ** 
15880 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  code.  This will
15890 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72   cause the pager
158a0 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72   to enter the er
158b0 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20  ror state.      
158c0 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e      ** so that n
158d0 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77  o further harm w
158e0 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65  ill be done.  Pe
158f0 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20  rhaps the next. 
15900 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
15910 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e  ess to come alon
15920 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74  g will be able t
15930 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64  o rollback the d
15940 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20  atabase..       
15950 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
15960 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
15970 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
15980 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
15990 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
159a0 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a    assert( 0 );..
159b0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  end_playback:.  
159c0 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72  /* Following a r
159d0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74  ollback, the dat
159e0 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
159f0 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73  d be back in its
15a00 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73   original.  ** s
15a10 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68  tate prior to th
15a20 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
15a30 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69  ransaction, so i
15a40 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53  nvoke the.  ** S
15a50 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
15a60 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f  NCHANGED file-co
15a70 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20  ntrol method to 
15a80 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a  disable the.  **
15a90 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20   assertion that 
15aa0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
15ab0 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69  counter was modi
15ac0 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  fied..  */.  ass
15ad0 65 72 74 28 0a 20 20 20 20 70 50 61 67 65 72 2d  ert(.    pPager-
15ae0 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30  >fd->pMethods==0
15af0 20 7c 7c 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ||.    sqlite3O
15b00 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61  sFileControl(pPa
15b10 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46  ger->fd,SQLITE_F
15b20 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
15b30 44 2c 30 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b 0a  D,0)>=SQLITE_OK.
15b40 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68    );..  /* If th
15b50 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68  is playback is h
15b60 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74  appening automat
15b70 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75  ically as a resu
15b80 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a  lt of an IO or .
15b90 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f    ** malloc erro
15ba0 72 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 20  r that occurred 
15bb0 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
15bc0 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64  -counter was upd
15bd0 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62  ated but .  ** b
15be0 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
15bf0 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74  ction was commit
15c00 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ted, then the ch
15c10 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20  ange-counter .  
15c20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  ** modification 
15c30 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65  may just have be
15c40 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20  en reverted. If 
15c50 74 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  this happens in 
15c60 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20  exclusive .  ** 
15c70 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65  mode, then subse
15c80 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  quent transactio
15c90 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20  ns performed by 
15ca0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
15cb0 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64  ill not.  ** upd
15cc0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ate the change-c
15cd0 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54  ounter at all. T
15ce0 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20  his may lead to 
15cf0 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65  cache inconsiste
15d00 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d  ncy.  ** problem
15d10 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63  s for other proc
15d20 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f  esses at some po
15d30 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
15d40 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a  e. So, just.  **
15d50 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61   in case this ha
15d60 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61  s happened, clea
15d70 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  r the changeCoun
15d80 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a  tDone flag now..
15d90 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63    */.  pPager->c
15da0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
15db0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
15dc0 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e;..  if( rc==SQ
15dd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a  LITE_OK ){.    z
15de0 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
15df0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
15e00 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
15e10 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
15e20 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  fd, zMaster, pPa
15e30 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
15e40 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65  hname+1);.    te
15e50 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
15e60 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
15e70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15e80 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79   && pPager->noSy
15e90 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  nc==0 && pPager-
15ea0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
15eb0 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72  CLUSIVE ){.    r
15ec0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
15ed0 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  c(pPager->fd, pP
15ee0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
15ef0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
15f00 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
15f10 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20  ager->noSync==0 
15f20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  && pPager->state
15f30 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
15f40 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  E ){.    rc = sq
15f50 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
15f60 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
15f70 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d  sync_flags);.  }
15f80 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
15f90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
15fa0 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
15fb0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a  action(pPager, z
15fc0 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29  Master[0]!='\0')
15fd0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
15fe0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
15ff0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
16000 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
16010 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b  ter[0] && res ){
16020 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
16030 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
16040 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
16050 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
16060 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20  rn success,.    
16070 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
16080 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
16090 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
160a0 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
160b0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
160c0 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a  master(pPager, z
160d0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73  Master);.    tes
160e0 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
160f0 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  E_OK );.  }..  /
16100 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74  * The Pager.sect
16110 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
16120 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70  may have been up
16130 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c  dated while roll
16140 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20  ing.  ** back a 
16150 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
16160 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74  by a process wit
16170 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65  h a different se
16180 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76  ctor size.  ** v
16190 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74  alue. Reset it t
161a0 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  o the correct va
161b0 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  lue for this pro
161c0 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74  cess..  */.  set
161d0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
161e0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
161f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  .}.../*.** Read 
16200 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20  the content for 
16210 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20  page pPg out of 
16220 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16230 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70  e and into .** p
16240 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61  Pg->pData. A sha
16250 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61  red lock or grea
16260 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ter must be held
16270 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
16280 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20  .** file before 
16290 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
162a0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
162b0 66 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64  f page 1 is read
162c0 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
162d0 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65   of Pager.dbFile
162e0 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f  Vers[] is set to
162f0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65  .** the value re
16300 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
16310 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
16320 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
16330 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
16340 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74   IO error is ret
16350 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
16360 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ler..** Otherwis
16370 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  e, SQLITE_OK is 
16380 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
16390 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61  tic int readDbPa
163a0 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
163b0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
163c0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f  = pPg->pPager; /
163d0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  * Pager object a
163e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
163f0 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e  age pPg */.  Pgn
16400 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  o pgno = pPg->pg
16410 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67  no;       /* Pag
16420 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64  e number to read
16430 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
16440 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
16450 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
16460 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 57  e */.  int isInW
16470 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  al = 0;         
16480 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
16490 61 67 65 20 69 73 20 69 6e 20 6c 6f 67 20 66 69  age is in log fi
164a0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a  le */.  int pgsz
164b0 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
164c0 69 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ize; /* Number o
164d0 66 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20  f bytes to read 
164e0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
164f0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
16500 45 52 5f 53 48 41 52 45 44 20 26 26 20 21 4d 45  ER_SHARED && !ME
16510 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
16520 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
16530 66 64 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45  fd) );..  if( NE
16540 56 45 52 28 21 69 73 4f 70 65 6e 28 70 50 61 67  VER(!isOpen(pPag
16550 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20  er->fd)) ){.    
16560 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16570 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
16580 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74  memset(pPg->pDat
16590 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  a, 0, pPager->pa
165a0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 65 74  geSize);.    ret
165b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
165c0 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55   }..  if( pagerU
165d0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
165e0 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70  .    /* Try to p
165f0 75 6c 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f  ull the page fro
16600 6d 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61  m the write-ahea
16610 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63  d log. */.    rc
16620 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61   = sqlite3WalRea
16630 64 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  d(pPager->pWal, 
16640 70 67 6e 6f 2c 20 26 69 73 49 6e 57 61 6c 2c 20  pgno, &isInWal, 
16650 70 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61  pgsz, pPg->pData
16660 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
16670 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 69  =SQLITE_OK && !i
16680 73 49 6e 57 61 6c 20 29 7b 0a 20 20 20 20 69 36  sInWal ){.    i6
16690 34 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e  4 iOffset = (pgn
166a0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
166b0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
166c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
166d0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
166e0 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c  Pg->pData, pgsz,
166f0 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69   iOffset);.    i
16700 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
16710 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
16720 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
16730 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
16740 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  }..  if( pgno==1
16750 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29   ){.    if( rc )
16760 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
16770 65 20 72 65 61 64 20 69 73 20 75 6e 73 75 63 63  e read is unsucc
16780 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20  essful, set the 
16790 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20  dbFileVers[] to 
167a0 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20  something.      
167b0 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76  ** that will nev
167c0 65 72 20 62 65 20 61 20 76 61 6c 69 64 20 66 69  er be a valid fi
167d0 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46  le version.  dbF
167e0 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63  ileVers[] is a c
167f0 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  opy.      ** of 
16800 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20  bytes 24..39 of 
16810 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42  the database.  B
16820 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75  ytes 28..31 shou
16830 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20  ld always be.   
16840 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68     ** zero or th
16850 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
16860 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20  tabase in page. 
16870 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64  Bytes 32..35 and
16880 20 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a   35..39.      **
16890 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20   should be page 
168a0 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72  numbers which ar
168b0 65 20 6e 65 76 65 72 20 30 78 66 66 66 66 66 66  e never 0xffffff
168c0 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a  ff.  So filling.
168d0 20 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d        ** pPager-
168e0 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69  >dbFileVers[] wi
168f0 74 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65  th all 0xff byte
16900 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65  s should suffice
16910 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
16920 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79   ** For an encry
16930 70 74 65 64 20 64 61 74 61 62 61 73 65 2c 20 74  pted database, t
16940 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20  he situation is 
16950 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62  more complex:  b
16960 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34  ytes.      ** 24
16970 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61  ..39 of the data
16980 62 61 73 65 20 61 72 65 20 77 68 69 74 65 20 6e  base are white n
16990 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65 20 70  oise.  But the p
169a0 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20  robability of.  
169b0 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69      ** white noi
169c0 73 69 6e 67 20 65 71 75 61 6c 69 6e 67 20 31 36  sing equaling 16
169d0 20 62 79 74 65 73 20 6f 66 20 30 78 66 66 20 69   bytes of 0xff i
169e0 73 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  s vanishingly sm
169f0 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20  all so.      ** 
16a00 77 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20  we should still 
16a10 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a  be ok..      */.
16a20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
16a30 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
16a40 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50   0xff, sizeof(pP
16a50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
16a60 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
16a70 20 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56       u8 *dbFileV
16a80 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67  ers = &((u8*)pPg
16a90 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20  ->pData)[24];.  
16aa0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
16ab0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
16ac0 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
16ad0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
16ae0 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20  eVers));.    }. 
16af0 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67   }.  CODEC1(pPag
16b00 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20  er, pPg->pData, 
16b10 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51  pgno, 3, rc = SQ
16b20 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20  LITE_NOMEM);..  
16b30 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
16b40 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
16b50 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f  count);.  PAGER_
16b60 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65  INCR(pPager->nRe
16b70 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  ad);.  IOTRACE((
16b80 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20  "PGIN %p %d\n", 
16b90 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
16ba0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 46    PAGERTRACE(("F
16bb0 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20  ETCH %d page %d 
16bc0 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
16be0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
16bf0 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
16c00 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72  ash(pPg)));..  r
16c10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
16c20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16c30 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  _WAL./*.** This 
16c40 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f  function is invo
16c50 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ked once for eac
16c60 68 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  h page that has 
16c70 61 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a  already been .**
16c80 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
16c90 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20  e log file when 
16ca0 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f  a WAL transactio
16cb0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
16cc0 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69  ..** Parameter i
16cd0 50 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  Pg is the page n
16ce0 75 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61  umber of said pa
16cf0 67 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67  ge. The pCtx arg
16d00 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74  ument .** is act
16d10 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  ually a pointer 
16d20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72  to the Pager str
16d30 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
16d40 20 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65   page iPg is pre
16d50 73 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68  sent in the cach
16d60 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75  e, and has no ou
16d70 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
16d80 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64  nces,.** it is d
16d90 69 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77  iscarded. Otherw
16da0 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72  ise, if there ar
16db0 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75  e one or more ou
16dc0 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66  tstanding.** ref
16dd0 65 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67  erences, the pag
16de0 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c  e content is rel
16df0 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64  oaded from the d
16e00 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a  atabase. If the.
16e10 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65  ** attempt to re
16e20 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f  load content fro
16e30 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  m the database i
16e40 73 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66  s required and f
16e50 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e  ails, .** return
16e60 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
16e70 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   code. Otherwise
16e80 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  , SQLITE_OK..*/.
16e90 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
16ea0 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69  UndoCallback(voi
16eb0 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50  d *pCtx, Pgno iP
16ec0 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
16ed0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
16ee0 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67  r *pPager = (Pag
16ef0 65 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48  er *)pCtx;.  PgH
16f00 64 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20  dr *pPg;..  pPg 
16f10 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
16f20 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67  okup(pPager, iPg
16f30 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
16f40 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
16f50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e  cachePageRefcoun
16f60 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20  t(pPg)==1 ){.   
16f70 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
16f80 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d  Drop(pPg);.    }
16f90 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
16fa0 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29   readDbPage(pPg)
16fb0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
16fc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16fd0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
16fe0 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
16ff0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
17000 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
17010 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
17020 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20  /* Normally, if 
17030 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
17040 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e   rolled back, an
17050 79 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73  y backup process
17060 65 73 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61  es are.  ** upda
17070 74 65 64 20 61 73 20 64 61 74 61 20 69 73 20 63  ted as data is c
17080 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65  opied out of the
17090 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
170a0 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20  l and into the. 
170b0 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68   ** database. Th
170c0 69 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61  is is not genera
170d0 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74  lly possible wit
170e0 68 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  h a WAL database
170f0 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61  , as.  ** rollba
17100 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70  ck involves simp
17110 6c 79 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68  ly truncating th
17120 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72  e log file. Ther
17130 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20  efore, if one.  
17140 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65  ** or more frame
17150 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
17160 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
17170 68 65 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72  he log (and ther
17180 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f  efore .  ** also
17190 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
171a0 20 62 61 63 6b 75 70 20 64 61 74 61 62 61 73 65   backup database
171b0 73 29 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  s) as part of th
171c0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a  is transaction,.
171d0 20 20 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73    ** the backups
171e0 20 6d 75 73 74 20 62 65 20 72 65 73 74 61 72 74   must be restart
171f0 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ed..  */.  sqlit
17200 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
17210 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
17220 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
17230 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
17240 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
17250 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74   to rollback a t
17260 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20  ransaction on a 
17270 57 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  WAL database..*/
17280 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
17290 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67  rRollbackWal(Pag
172a0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
172b0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
172c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
172d0 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
172e0 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b  .  PgHdr *pList;
172f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17300 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69     /* List of di
17310 72 74 79 20 70 61 67 65 73 20 74 6f 20 72 65 76  rty pages to rev
17320 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72  ert */..  /* For
17330 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68   all pages in th
17340 65 20 63 61 63 68 65 20 74 68 61 74 20 61 72 65  e cache that are
17350 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79   currently dirty
17360 20 6f 72 20 68 61 76 65 20 61 6c 72 65 61 64 79   or have already
17370 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  .  ** been writt
17380 65 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d  en (but not comm
17390 69 74 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f  itted) to the lo
173a0 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f  g file, do one o
173b0 66 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c  f the .  ** foll
173c0 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  owing:.  **.  **
173d0 20 20 20 2b 20 44 69 73 63 61 72 64 20 74 68 65     + Discard the
173e0 20 63 61 63 68 65 64 20 70 61 67 65 20 28 69 66   cached page (if
173f0 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f   refcount==0), o
17400 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61  r.  **   + Reloa
17410 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66  d page content f
17420 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
17430 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29   (if refcount>0)
17440 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
17450 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
17460 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20  ->dbOrigSize;.  
17470 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55  rc = sqlite3WalU
17480 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ndo(pPager->pWal
17490 2c 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  , pagerUndoCallb
174a0 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61  ack, (void *)pPa
174b0 67 65 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20  ger);.  pList = 
174c0 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
174d0 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
174e0 50 43 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65  PCache);.  while
174f0 28 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53  ( pList && rc==S
17500 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17510 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70  PgHdr *pNext = p
17520 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
17530 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f    rc = pagerUndo
17540 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a  Callback((void *
17550 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e  )pPager, pList->
17560 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74  pgno);.    pList
17570 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20   = pNext;.  }.. 
17580 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17590 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
175a0 6f 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20  on is a wrapper 
175b0 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61  around sqlite3Wa
175c0 6c 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65  lFrames(). As we
175d0 6c 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a  ll as logging.**
175e0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
175f0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67   the list of pag
17600 65 73 20 68 65 61 64 65 64 20 62 79 20 70 4c 69  es headed by pLi
17610 73 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79  st (connected by
17620 20 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69   pDirty),.** thi
17630 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66  s function notif
17640 69 65 73 20 61 6e 79 20 61 63 74 69 76 65 20 62  ies any active b
17650 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20  ackup processes 
17660 74 68 61 74 20 74 68 65 20 70 61 67 65 73 20 68  that the pages h
17670 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20  ave.** changed. 
17680 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/ .static int 
17690 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a  pagerWalFrames(.
176a0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
176b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176c0 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
176d0 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c  t */.  PgHdr *pL
176e0 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
176f0 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
17700 66 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20  f frames to log 
17710 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63  */.  Pgno nTrunc
17720 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
17730 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
17740 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 69 73   size after this
17750 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74   commit */.  int
17760 20 69 73 43 6f 6d 6d 69 74 2c 20 20 20 20 20 20   isCommit,      
17770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17780 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
17790 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e  a commit */.  in
177a0 74 20 73 79 6e 63 5f 66 6c 61 67 73 20 20 20 20  t sync_flags    
177b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
177c0 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74   Flags to pass t
177d0 6f 20 4f 73 53 79 6e 63 28 29 20 28 6f 72 20 30  o OsSync() (or 0
177e0 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ) */.){.  int rc
177f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
17810 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  urn code */..  a
17820 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
17830 57 61 6c 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  Wal );.  rc = sq
17840 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70  lite3WalFrames(p
17850 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20  Pager->pWal, .  
17860 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
17870 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72  Size, pList, nTr
17880 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74  uncate, isCommit
17890 2c 20 73 79 6e 63 5f 66 6c 61 67 73 0a 20 20 29  , sync_flags.  )
178a0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
178b0 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
178c0 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20  >pBackup ){.    
178d0 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f  PgHdr *p;.    fo
178e0 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d  r(p=pList; p; p=
178f0 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
17900 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
17910 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
17920 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20  ackup, p->pgno, 
17930 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b  (u8 *)p->pData);
17940 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
17950 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17960 20 42 65 67 69 6e 20 61 20 72 65 61 64 20 74 72   Begin a read tr
17970 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
17980 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   WAL..**.** This
17990 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f   routine used to
179a0 20 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65   be called "page
179b0 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22  rOpenSnapshot()"
179c0 20 62 65 63 61 75 73 65 20 69 74 20 65 73 73 65   because it esse
179d0 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73  ntially.** makes
179e0 20 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74   a snapshot of t
179f0 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74  he database at t
17a00 68 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74  he current point
17a10 20 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65   in time and pre
17a20 73 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73  serves.** that s
17a30 6e 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20  napshot for use 
17a40 62 79 20 74 68 65 20 72 65 61 64 65 72 20 69 6e  by the reader in
17a50 20 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72   spite of concur
17a60 72 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62  rently changes b
17a70 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65  y.** other write
17a80 72 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74  rs or checkpoint
17a90 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ers..*/.static i
17aa0 6e 74 20 70 61 67 65 72 42 65 67 69 6e 52 65 61  nt pagerBeginRea
17ab0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67  dTransaction(Pag
17ac0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
17ad0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
17ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17af0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
17b00 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d  .  int changed =
17b10 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
17b20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61     /* True if ca
17b30 63 68 65 20 6d 75 73 74 20 62 65 20 72 65 73 65  che must be rese
17b40 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
17b50 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
17b60 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c  er) );..  /* sql
17b70 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72  ite3WalEndReadTr
17b80 61 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20  ansaction() was 
17b90 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74  not called for t
17ba0 68 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a  he previous.  **
17bb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
17bc0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43  locking_mode=EXC
17bd0 4c 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c  LUSIVE.  So call
17be0 20 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a   it now.  If we.
17bf0 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b    ** are in lock
17c00 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20  ing_mode=NORMAL 
17c10 61 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61  and EndRead() wa
17c20 73 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c  s previously cal
17c30 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75  led,.  ** the du
17c40 70 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20  plicate call is 
17c50 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20  harmless..  */. 
17c60 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
17c70 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
17c80 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20  ager->pWal);..  
17c90 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42  rc = sqlite3WalB
17ca0 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
17cb0 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
17cc0 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69  , &changed);.  i
17cd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17ce0 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 75 6d 6d   ){.    int dumm
17cf0 79 3b 0a 20 20 20 20 69 66 28 20 63 68 61 6e 67  y;.    if( chang
17d00 65 64 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  ed ){.      page
17d10 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
17d20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17d30 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c  Pager->errCode |
17d40 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
17d50 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 20 20  Valid==0 );.    
17d60 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
17d70 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
17d80 28 70 50 61 67 65 72 2c 20 26 64 75 6d 6d 79 29  (pPager, &dummy)
17d90 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
17da0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
17db0 41 52 45 44 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ARED;..  return 
17dc0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  rc;.}../*.** Che
17dd0 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20  ck if the *-wal 
17de0 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73  file that corres
17df0 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74  ponds to the dat
17e00 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
17e10 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73  pPager.** exists
17e20 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
17e30 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72   is not empy, or
17e40 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
17e50 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73   *-wal file does
17e60 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20 28 62  .** not exist (b
17e70 79 20 64 65 6c 65 74 69 6e 67 20 69 74 29 20 69  y deleting it) i
17e80 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
17e90 69 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a  ile is empty..**
17ea0 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
17eb0 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  ase is not empty
17ec0 20 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20 66   and the *-wal f
17ed0 69 6c 65 20 65 78 69 73 74 73 2c 20 6f 70 65 6e  ile exists, open
17ee0 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e   the pager.** in
17ef0 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74   WAL mode.  If t
17f00 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
17f10 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d  mpty or if no *-
17f20 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  wal file exists 
17f30 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72  and.** if no err
17f40 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20  or occurs, make 
17f50 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e  sure Pager.journ
17f60 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73 65  alMode is not se
17f70 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f  t to.** PAGER_JO
17f80 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a  URNALMODE_WAL..*
17f90 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
17fa0 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f  TE_OK or an erro
17fb0 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  r code..**.** If
17fc0 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 69 73   the WAL file is
17fd0 20 6f 70 65 6e 65 64 2c 20 61 6c 73 6f 20 6f 70   opened, also op
17fe0 65 6e 20 61 20 73 6e 61 70 73 68 6f 74 20 28 72  en a snapshot (r
17ff0 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ead transaction)
18000 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
18010 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53  er must hold a S
18020 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  HARED lock on th
18030 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
18040 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20  to call this.** 
18050 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73  function. Becaus
18060 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
18070 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69  ock on the db fi
18080 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 74  le is required t
18090 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57  o delete .** a W
180a0 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70  AL on a none-emp
180b0 74 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 69  ty database, thi
180c0 73 20 65 6e 73 75 72 65 73 20 74 68 65 72 65 20  s ensures there 
180d0 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69  is no race condi
180e0 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e  tion .** between
180f0 20 74 68 65 20 78 41 63 63 65 73 73 28 29 20 62   the xAccess() b
18100 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44 65 6c  elow and an xDel
18110 65 74 65 28 29 20 62 65 69 6e 67 20 65 78 65 63  ete() being exec
18120 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a  uted by some .**
18130 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
18140 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
18150 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
18160 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50  resent(Pager *pP
18170 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
18180 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
18190 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
181a0 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  File ){.    int 
181b0 69 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  isWal;          
181c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
181d0 65 20 69 66 20 57 41 4c 20 66 69 6c 65 20 65 78  e if WAL file ex
181e0 69 73 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ists */.    int 
181f0 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
18200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
18210 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
18220 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 61 73  e file */.    as
18230 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
18240 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ate>=SHARED_LOCK
18250 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
18260 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
18270 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67  nt(pPager, &nPag
18280 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
18290 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
182a0 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a  if( nPage==0 ){.
182b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
182c0 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
182d0 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
182e0 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  >zWal, 0);.     
182f0 20 69 73 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20   isWal = 0;.    
18300 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
18310 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
18320 73 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  s(.          pPa
18330 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
18340 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f  r->zWal, SQLITE_
18350 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
18360 69 73 57 61 6c 0a 20 20 20 20 20 20 29 3b 0a 20  isWal.      );. 
18370 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
18380 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18390 20 20 20 20 69 66 28 20 69 73 57 61 6c 20 29 7b      if( isWal ){
183a0 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
183b0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
183c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
183d0 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70  e3PagerOpenWal(p
183e0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
183f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18400 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18410 20 20 72 63 20 3d 20 70 61 67 65 72 42 65 67 69    rc = pagerBegi
18420 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
18430 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
18440 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
18450 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
18460 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
18470 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29  OURNALMODE_WAL )
18480 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
18490 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
184a0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
184b0 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20  E_DELETE;.      
184c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
184d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
184e0 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  f../*.** Playbac
184f0 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76  k savepoint pSav
18500 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70  epoint. Or, if p
18510 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c  Savepoint==NULL,
18520 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a   then playback.*
18530 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  * the entire mas
18540 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18550 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65  . The case pSave
18560 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75  point==NULL occu
18570 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f  rs when .** a RO
18580 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e  LLBACK TO comman
18590 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20  d is invoked on 
185a0 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74  a SAVEPOINT that
185b0 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
185c0 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e  n .** savepoint.
185d0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76  .**.** When pSav
185e0 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55  epoint is not NU
185f0 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f  LL (meaning a no
18600 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  n-transaction sa
18610 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62  vepoint is .** b
18620 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
18630 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  ), then the roll
18640 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66  back consists of
18650 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74 61   up to three sta
18660 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65  ges,.** performe
18670 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73  d in the order s
18680 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20  pecified:.**.** 
18690 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c    * Pages are pl
186a0 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
186b0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
186c0 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74 65  starting at byte
186d0 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50  .**     offset P
186e0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
186f0 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
18700 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20  uing to .**     
18710 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
18720 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f  HdrOffset, or to
18730 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
18740 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  main journal.** 
18750 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67 65      file if Page
18760 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
18770 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a  ffset is zero..*
18780 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65  *.**   * If Page
18790 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
187a0 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72  ffset is not zer
187b0 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  o, then pages ar
187c0 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20  e played.**     
187d0 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72  back starting fr
187e0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
187f0 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c  eader immediatel
18800 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20  y following .** 
18810 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
18820 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f  nt.iHdrOffset to
18830 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
18840 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
18850 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67  e..**.**   * Pag
18860 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79  es are then play
18870 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
18880 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
18890 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20  e, starting.**  
188a0 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67 65     with the Page
188b0 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52  rSavepoint.iSubR
188c0 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  ec and continuin
188d0 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a  g to the end of.
188e0 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
188f0 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  al file..**.** T
18900 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f  hroughout the ro
18910 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20  llback process, 
18920 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67 65  each time a page
18930 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
18940 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f   the.** correspo
18950 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74  nding bit is set
18960 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74 72   in a bitvec str
18970 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c 65  ucture (variable
18980 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a   pDone in the.**
18990 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
189a0 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20  below). This is 
189b0 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  used to ensure t
189c0 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e  hat a page is on
189d0 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  ly.** rolled bac
189e0 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
189f0 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   it is encounter
18a00 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75  ed in either jou
18a10 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  rnal..**.** If p
18a20 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c  Savepoint is NUL
18a30 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  L, then pages ar
18a40 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61  e only played ba
18a50 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
18a60 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
18a70 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  . There is no ne
18a80 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63 20  ed for a bitvec 
18a90 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
18aa0 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61  .** In either ca
18ab0 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62  se, before playb
18ac0 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68  ack commences th
18ad0 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76  e Pager.dbSize v
18ae0 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65  ariable.** is re
18af0 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
18b00 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61 74   that it held at
18b10 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
18b20 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20  e savepoint .** 
18b30 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  (or transaction)
18b40 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61  . No page with a
18b50 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65   page-number gre
18b60 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76  ater than this v
18b70 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65  alue.** is playe
18b80 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69  d back. If one i
18b90 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74  s encountered it
18ba0 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70   is simply skipp
18bb0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
18bc0 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  t pagerPlaybackS
18bd0 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a  avepoint(Pager *
18be0 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76  pPager, PagerSav
18bf0 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69  epoint *pSavepoi
18c00 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  nt){.  i64 szJ; 
18c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a  /* Effective siz
18c30 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  e of the main jo
18c40 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69  urnal */.  i64 i
18c50 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
18c60 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69      /* End of fi
18c70 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d  rst segment of m
18c80 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ain-journal reco
18c90 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  rds */.  int rc 
18ca0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
18cb0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
18cc0 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44   */.  Bitvec *pD
18cd0 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  one = 0;       /
18ce0 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75  * Bitvec to ensu
18cf0 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20  re pages played 
18d00 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a  back only once *
18d10 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
18d20 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
18d30 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f  R_SHARED );..  /
18d40 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74  * Allocate a bit
18d50 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74  vec to use to st
18d60 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70  ore the set of p
18d70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  ages rolled back
18d80 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
18d90 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e  oint ){.    pDon
18da0 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  e = sqlite3Bitve
18db0 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69  cCreate(pSavepoi
18dc0 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20  nt->nOrig);.    
18dd0 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20  if( !pDone ){.  
18de0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18df0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
18e00 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
18e10 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 62   database size b
18e20 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ack to the value
18e30 20 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74   it was before t
18e40 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20  he savepoint .  
18e50 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74 65  ** being reverte
18e60 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20  d was opened..  
18e70 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
18e80 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  ize = pSavepoint
18e90 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e   ? pSavepoint->n
18ea0 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64  Orig : pPager->d
18eb0 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70 50 61  bOrigSize;.  pPa
18ec0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
18ed0 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
18ee0 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20  empFile;..  if( 
18ef0 21 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70  !pSavepoint && p
18f00 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
18f10 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
18f20 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61   pagerRollbackWa
18f30 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  l(pPager);.  }..
18f40 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d    /* Use pPager-
18f50 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74  >journalOff as t
18f60 68 65 20 65 66 66 65 63 74 69 76 65 20 73 69 7a  he effective siz
18f70 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f  e of the main ro
18f80 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
18f90 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c  nal.  The actual
18fa0 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c   file might be l
18fb0 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20  arger than this 
18fc0 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f  in.  ** PAGER_JO
18fd0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
18fe0 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52  TE or PAGER_JOUR
18ff0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e  NALMODE_PERSIST.
19000 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20    But anything. 
19010 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d   ** past pPager-
19020 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f  >journalOff is o
19030 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e  ff-limits to us.
19040 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50  .  */.  szJ = pP
19050 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
19060 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ;.  assert( page
19070 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
19080 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a  =0 || szJ==0 );.
19090 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72  .  /* Begin by r
190a0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f  olling back reco
190b0 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  rds from the mai
190c0 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69  n journal starti
190d0 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72  ng at.  ** Pager
190e0 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65  Savepoint.iOffse
190f0 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  t and continuing
19100 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75   to the next jou
19110 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a  rnal header..  *
19120 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20 62 65  * There might be
19130 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   records in the 
19140 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61  main journal tha
19150 74 20 68 61 76 65 20 61 20 70 61 67 65 20 6e 75  t have a page nu
19160 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65  mber.  ** greate
19170 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
19180 6e 74 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  nt database size
19190 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65   (pPager->dbSize
191a0 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a  ) but those.  **
191b0 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64   will be skipped
191c0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20   automatically. 
191d0 20 50 61 67 65 73 20 61 72 65 20 61 64 64 65 64   Pages are added
191e0 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65   to pDone as the
191f0 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65  y.  ** are playe
19200 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  d back..  */.  i
19210 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26  f( pSavepoint &&
19220 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
19230 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69 48 64  ager) ){.    iHd
19240 72 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e  rOff = pSavepoin
19250 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20  t->iHdrOffset ? 
19260 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72  pSavepoint->iHdr
19270 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20  Offset : szJ;.  
19280 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
19290 6c 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e  lOff = pSavepoin
192a0 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20  t->iOffset;.    
192b0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
192c0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
192d0 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f  journalOff<iHdrO
192e0 66 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ff ){.      rc =
192f0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
19300 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
19310 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
19320 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20  lOff, pDone, 1, 
19330 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
19340 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
19350 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65  _DONE );.  }else
19360 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
19370 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
19380 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65  }..  /* Continue
19390 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65   rolling back re
193a0 63 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65  cords out of the
193b0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
193c0 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74  arting at.  ** t
193d0 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
193e0 20 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64   header seen and
193f0 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69   continuing unti
19400 6c 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  l the effective 
19410 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  end.  ** of the 
19420 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
19430 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20  e.  Continue to 
19440 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67  skip out-of-rang
19450 65 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a  e pages and.  **
19460 20 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67   continue adding
19470 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61   pages rolled ba
19480 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a  ck to pDone..  *
19490 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  /.  while( rc==S
194a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
194b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73  er->journalOff<s
194c0 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69  zJ ){.    u32 ii
194d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
194e0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
194f0 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20      u32 nJRec = 
19500 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  0;     /* Number
19510 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f   of Journal Reco
19520 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64  rds */.    u32 d
19530 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72  ummy;.    rc = r
19540 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
19550 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e  ager, 0, szJ, &n
19560 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  JRec, &dummy);. 
19570 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
19580 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20  QLITE_DONE );.. 
19590 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
195a0 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   "pPager->journa
195b0 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
195c0 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
195d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22  ger->journalOff"
195e0 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20  .    ** test is 
195f0 72 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65  related to ticke
19600 74 20 23 32 35 36 35 2e 20 20 53 65 65 20 74 68  t #2565.  See th
19610 65 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20  e discussion in 
19620 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  the.    ** pager
19630 5f 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63  _playback() func
19640 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f  tion for additio
19650 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
19660 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
19670 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26  nJRec==0 .     &
19680 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
19690 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
196a0 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
196b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
196c0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52      ){.      nJR
196d0 65 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20  ec = (u32)((szJ 
196e0 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
196f0 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  lOff)/JOURNAL_PG
19700 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
19710 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30    }.    for(ii=0
19720 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
19730 26 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70  && ii<nJRec && p
19740 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
19750 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20  f<szJ; ii++){.  
19760 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
19770 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
19780 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
19790 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44  ->journalOff, pD
197a0 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  one, 1, 1);.    
197b0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
197c0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
197d0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72  .  }.  assert( r
197e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
197f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
19800 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a  ff>=szJ );..  /*
19810 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62   Finally,  rollb
19820 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74  ack pages from t
19830 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
19840 20 50 61 67 65 20 74 68 61 74 20 77 65 72 65 0a   Page that were.
19850 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20    ** previously 
19860 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20  rolled back out 
19870 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
19880 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e  nal (and are hen
19890 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a  ce in pDone).  *
198a0 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65  * will be skippe
198b0 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65  d.  Out-of-range
198c0 20 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20   pages are also 
198d0 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
198e0 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29  if( pSavepoint )
198f0 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20  {.    u32 ii;   
19900 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
19910 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
19920 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70 53 61  i64 offset = pSa
19930 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63  vepoint->iSubRec
19940 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
19950 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28 20  Size);..    if( 
19960 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
19970 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
19980 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76 65  = sqlite3WalSave
19990 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65 72  pointUndo(pPager
199a0 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f 69  ->pWal, pSavepoi
199b0 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20  nt->aWalData);. 
199c0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
199d0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62  pSavepoint->iSub
199e0 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  Rec; rc==SQLITE_
199f0 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d  OK && ii<pPager-
19a00 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b  >nSubRec; ii++){
19a10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f  .      assert( o
19a20 66 66 73 65 74 3d 3d 69 69 2a 28 34 2b 70 50 61  ffset==ii*(4+pPa
19a30 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29  ger->pageSize) )
19a40 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
19a50 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
19a60 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66  page(pPager, &of
19a70 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20  fset, pDone, 0, 
19a80 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
19a90 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
19aa0 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20  _DONE );.  }..  
19ab0 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
19ac0 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69  troy(pDone);.  i
19ad0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19ae0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
19af0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
19b00 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
19b10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
19b20 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
19b30 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
19b40 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
19b50 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76  re allowed..*/.v
19b60 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
19b70 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67  SetCachesize(Pag
19b80 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
19b90 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74  mxPage){.  sqlit
19ba0 65 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65  e3PcacheSetCache
19bb0 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43  size(pPager->pPC
19bc0 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d  ache, mxPage);.}
19bd0 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74  ../*.** Adjust t
19be0 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66  he robustness of
19bf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
19c00 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
19c10 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20  S crashes.** or 
19c20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62  power failures b
19c30 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e  y changing the n
19c40 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29  umber of syncs()
19c50 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a  s when writing.*
19c60 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
19c70 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61  ournal.  There a
19c80 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a  re three levels:
19c90 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20  .**.**    OFF   
19ca0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e      sqlite3OsSyn
19cb0 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c  c() is never cal
19cc0 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  led.  This is th
19cd0 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20  e default.**    
19ce0 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65            for te
19cf0 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e  mporary and tran
19d00 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a  sient files..**.
19d10 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20  **    NORMAL    
19d20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
19d30 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72  ynced once befor
19d40 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
19d50 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
19d60 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20        database. 
19d70 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
19d80 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65  y adequate prote
19d90 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20  ction, but.**   
19da0 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73             it is
19db0 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70   theoretically p
19dc0 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20  ossible, though 
19dd0 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a  very unlikely,.*
19de0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
19df0 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e  hat an inopertun
19e00 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  e power failure 
19e10 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20  could leave the 
19e20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
19e30 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61          in a sta
19e40 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63  te which would c
19e50 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74  ause damage to t
19e60 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
19e70 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e              when
19e80 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61   it is rolled ba
19e90 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c  ck..**.**    FUL
19ea0 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  L      The journ
19eb0 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69  al is synced twi
19ec0 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
19ed0 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
19ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
19ef0 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d  tabase (with som
19f00 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  e additional inf
19f10 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e  ormation - the n
19f20 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20  Rec field.**    
19f30 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
19f40 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
19f50 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  - being written 
19f60 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  in between the t
19f70 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  wo.**           
19f80 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77     syncs).  If w
19f90 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72  e assume that wr
19fa0 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  iting a.**      
19fb0 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64          single d
19fc0 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74  isk sector is at
19fd0 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20  omic, then this 
19fe0 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a  mode provides.**
19ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
1a000 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65  surance that the
1a010 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f   journal will no
1a020 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74  t be corrupted t
1a030 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  o the.**        
1a040 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63        point of c
1a050 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f  ausing damage to
1a060 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75   the database du
1a070 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ring rollback..*
1a080 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c  *.** Numeric val
1a090 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ues associated w
1a0a0 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73  ith these states
1a0b0 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52   are OFF==1, NOR
1a0c0 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55  MAL=2,.** and FU
1a0d0 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  LL=3..*/.#ifndef
1a0e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
1a0f0 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20  ER_PRAGMAS.void 
1a100 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
1a110 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72  afetyLevel(Pager
1a120 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65   *pPager, int le
1a130 76 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73  vel, int bFullFs
1a140 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ync){.  pPager->
1a150 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c  noSync =  (level
1a160 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==1 || pPager->t
1a170 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20  empFile) ?1:0;. 
1a180 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
1a190 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26  c = (level==3 &&
1a1a0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
1a1b0 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67  le) ?1:0;.  pPag
1a1c0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d  er->sync_flags =
1a1d0 20 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c   (bFullFsync?SQL
1a1e0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51  ITE_SYNC_FULL:SQ
1a1f0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
1a200 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
1a210 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72  >noSync ) pPager
1a220 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
1a230 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1a240 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  The following gl
1a250 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73  obal variable is
1a260 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65   incremented whe
1a270 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72  never the librar
1a280 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  y.** attempts to
1a290 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
1a2a0 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e  y file.  This in
1a2b0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
1a2c0 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
1a2d0 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
1a2e0 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20  ly.  .*/.#ifdef 
1a2f0 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
1a300 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
1a310 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
1a320 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  if../*.** Open a
1a330 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
1a340 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
1a350 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1a360 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65   into *pFile. Re
1a370 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
1a380 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72  n success .** or
1a390 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
1a3a0 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69  r code if we fai
1a3b0 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61  l. The OS will a
1a3c0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
1a3d0 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70   delete the temp
1a3e0 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20  orary file when 
1a3f0 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
1a400 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61  .** The flags pa
1a410 73 73 65 64 20 74 6f 20 74 68 65 20 56 46 53 20  ssed to the VFS 
1a420 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61  layer xOpen() ca
1a430 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70 65  ll are those spe
1a440 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72  cified.** by par
1a450 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73 20  ameter vfsFlags 
1a460 4f 52 65 64 20 77 69 74 68 20 74 68 65 20 66 6f  ORed with the fo
1a470 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
1a480 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
1a490 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20  EADWRITE.**     
1a4a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1a4b0 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  TE.**     SQLITE
1a4c0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a  _OPEN_EXCLUSIVE.
1a4d0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
1a4e0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
1a4f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1a500 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20  agerOpentemp(.  
1a510 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
1a520 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
1a530 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  er object */.  s
1a540 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
1a550 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68  le,  /* Write th
1a560 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1a570 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  r here */.  int 
1a580 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
1a590 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
1a5a0 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  d through to the
1a5b0 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   VFS */.){.  int
1a5c0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1a5d0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1a5e0 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  e */..#ifdef SQL
1a5f0 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
1a600 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
1a610 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f  t++;  /* Used fo
1a620 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
1a630 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23  alysis only */.#
1a640 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67  endif..  vfsFlag
1a650 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45  s |=  SQLITE_OPE
1a660 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
1a670 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
1a680 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53   |.            S
1a690 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
1a6a0 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  SIVE | SQLITE_OP
1a6b0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
1a6c0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1a6d0 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70  OsOpen(pPager->p
1a6e0 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76  Vfs, 0, pFile, v
1a6f0 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61  fsFlags, 0);.  a
1a700 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
1a710 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
1a720 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75 72  File) );.  retur
1a730 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
1a740 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  et the busy hand
1a750 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  ler function..**
1a760 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 6e  .** The pager in
1a770 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d 68  vokes the busy-h
1a780 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74 65  andler if sqlite
1a790 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e  3OsLock() return
1a7a0 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  s .** SQLITE_BUS
1a7b0 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f  Y when trying to
1a7c0 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f   upgrade from no
1a7d0 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52 45  -lock to a SHARE
1a7e0 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68  D lock,.** or wh
1a7f0 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67  en trying to upg
1a800 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45  rade from a RESE
1a810 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20  RVED lock to an 
1a820 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f  EXCLUSIVE .** lo
1a830 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74  ck. It does *not
1a840 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
1a850 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20 75  y handler when u
1a860 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a  pgrading from.**
1a870 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52   SHARED to RESER
1a880 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70 67  VED, or when upg
1a890 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41 52  rading from SHAR
1a8a0 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 0a  ED to EXCLUSIVE.
1a8b0 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72 73  ** (which occurs
1a8c0 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72   during hot-jour
1a8d0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53  nal rollback). S
1a8e0 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20  ummary:.**.**   
1a8f0 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20 20  Transition      
1a900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a910 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75 73    | Invokes xBus
1a920 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d  yHandler.**   --
1a930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a960 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c  ------.**   NO_L
1a970 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48 41  OCK       -> SHA
1a980 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20  RED_LOCK      | 
1a990 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f  Yes.**   SHARED_
1a9a0 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52 56  LOCK   -> RESERV
1a9b0 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a  ED_LOCK    | No.
1a9c0 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b  **   SHARED_LOCK
1a9d0 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f     -> EXCLUSIVE_
1a9e0 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20  LOCK   | No.**  
1a9f0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d   RESERVED_LOCK -
1aa00 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  > EXCLUSIVE_LOCK
1aa10 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49     | Yes.**.** I
1aa20 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  f the busy-handl
1aa30 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75  er callback retu
1aa40 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
1aa50 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65  e lock is .** re
1aa60 74 72 69 65 64 2e 20 49 66 20 69 74 20 72 65 74  tried. If it ret
1aa70 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  urns zero, then 
1aa80 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20  the SQLITE_BUSY 
1aa90 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75  error is.** retu
1aaa0 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
1aab0 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  er of the pager 
1aac0 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  API function..*/
1aad0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
1aae0 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
1aaf0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
1ab00 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
1ab10 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
1ab20 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
1ab30 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72  t (*xBusyHandler
1ab40 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20 20  )(void *),      
1ab50 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
1ab60 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75   busy-handler fu
1ab70 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  nction */.  void
1ab80 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72   *pBusyHandlerAr
1ab90 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
1aba0 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20   /* Argument to 
1abb0 70 61 73 73 20 74 6f 20 78 42 75 73 79 48 61 6e  pass to xBusyHan
1abc0 64 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a 20 20 70  dler */.){  .  p
1abd0 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
1abe0 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c  ler = xBusyHandl
1abf0 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  er;.  pPager->pB
1ac00 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20  usyHandlerArg = 
1ac10 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b  pBusyHandlerArg;
1ac20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
1ac30 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 75   the page size u
1ac40 73 65 64 20 62 79 20 74 68 65 20 50 61 67 65 72  sed by the Pager
1ac50 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77   object. The new
1ac60 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69   page size .** i
1ac70 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61  s passed in *pPa
1ac80 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  geSize..**.** If
1ac90 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
1aca0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
1acb0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
1acc0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
1acd0 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  t.** is a no-op.
1ace0 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
1acf0 6e 65 64 20 69 73 20 74 68 65 20 65 72 72 6f 72  ned is the error
1ad00 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64   state error cod
1ad10 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20  e (i.e. .** one 
1ad20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  of SQLITE_IOERR,
1ad30 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
1ad40 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e  or SQLITE_FULL).
1ad50 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1ad60 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  , if all of the 
1ad70 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
1ad80 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  ue:.**.**   * th
1ad90 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  e new page size 
1ada0 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65  (value of *pPage
1adb0 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28  Size) is valid (
1adc0 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20  a power .**     
1add0 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35  of two between 5
1ade0 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41  12 and SQLITE_MA
1adf0 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63  X_PAGE_SIZE, inc
1ae00 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a  lusive), and.**.
1ae10 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72 65  **   * there are
1ae20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
1ae30 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c  page references,
1ae40 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   and.**.**   * t
1ae50 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
1ae60 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d  ither not an in-
1ae70 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
1ae80 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20  or it is.**     
1ae90 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
1aea0 61 62 61 73 65 20 74 68 61 74 20 63 75 72 72 65  abase that curre
1aeb0 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66  ntly consists of
1aec0 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a   zero pages..**.
1aed0 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  ** then the page
1aee0 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69  r object page si
1aef0 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50  ze is set to *pP
1af00 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ageSize..**.** I
1af10 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
1af20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e  is changed, then
1af30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75   this function u
1af40 73 65 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ses sqlite3Pager
1af50 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20  Malloc() .** to 
1af60 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67  obtain a new Pag
1af70 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66  er.pTmpSpace buf
1af80 66 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c  fer. If this all
1af90 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
1afa0 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
1afb0 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
1afc0 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65  ned and the page
1afd0 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e   size remains un
1afe0 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20  changed. .** In 
1aff0 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c  all other cases,
1b000 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1b010 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
1b020 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
1b030 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65  s not changed, e
1b040 69 74 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e  ither because on
1b050 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61  e of the enumera
1b060 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e  ted.** condition
1b070 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74  s above is not t
1b080 72 75 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  rue, the pager w
1b090 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  as in error stat
1b0a0 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66  e when this.** f
1b0b0 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
1b0c0 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74  ed, or because t
1b0d0 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
1b0e0 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69  tion attempt fai
1b0f0 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70  led, .** then *p
1b100 50 61 67 65 53 69 7a 65 20 69 73 20 73 65 74 20  PageSize is set 
1b110 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61  to the old, reta
1b120 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20 62  ined page size b
1b130 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
1b140 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1b150 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
1b160 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75  Pager *pPager, u
1b170 31 36 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69  16 *pPageSize, i
1b180 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20  nt nReserve){.  
1b190 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d  int rc = pPager-
1b1a0 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28  >errCode;..  if(
1b1b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b1c0 7b 0a 20 20 20 20 75 31 36 20 70 61 67 65 53 69  {.    u16 pageSi
1b1d0 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b  ze = *pPageSize;
1b1e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67  .    assert( pag
1b1f0 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67  eSize==0 || (pag
1b200 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
1b210 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
1b220 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b  AX_PAGE_SIZE) );
1b230 0a 20 20 20 20 69 66 28 20 28 70 50 61 67 65 72  .    if( (pPager
1b240 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50  ->memDb==0 || pP
1b250 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29  ager->dbSize==0)
1b260 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
1b270 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
1b280 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
1b290 3d 30 20 0a 20 20 20 20 20 26 26 20 70 61 67 65  =0 .     && page
1b2a0 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65  Size && pageSize
1b2b0 21 3d 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  !=pPager->pageSi
1b2c0 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ze .    ){.     
1b2d0 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 28 63   char *pNew = (c
1b2e0 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67  har *)sqlite3Pag
1b2f0 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65  eMalloc(pageSize
1b300 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e  );.      if( !pN
1b310 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ew ){.        rc
1b320 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1b330 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1b340 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
1b350 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
1b360 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
1b370 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
1b380 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1b390 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  ageFree(pPager->
1b3a0 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
1b3b0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
1b3c0 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20  Space = pNew;.  
1b3d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
1b3e0 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  cheSetPageSize(p
1b3f0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
1b400 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
1b410 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 50   }.    }.    *pP
1b420 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70  ageSize = (u16)p
1b430 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
1b440 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65 72 76  .    if( nReserv
1b450 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d  e<0 ) nReserve =
1b460 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
1b470 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  e;.    assert( n
1b480 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52  Reserve>=0 && nR
1b490 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20  eserve<1000 );. 
1b4a0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
1b4b0 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65  rve = (i16)nRese
1b4c0 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65  rve;.    pagerRe
1b4d0 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29  portSize(pPager)
1b4e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1b4f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
1b500 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1b510 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70  the "temporary p
1b520 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64  age" buffer held
1b530 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62   internally.** b
1b540 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  y the pager.  Th
1b550 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74  is is a buffer t
1b560 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67  hat is big enoug
1b570 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a  h to hold the.**
1b580 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20   entire content 
1b590 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61  of a database pa
1b5a0 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72  ge.  This buffer
1b5b0 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61   is used interna
1b5c0 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f  lly.** during ro
1b5d0 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20  llback and will 
1b5e0 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  be overwritten w
1b5f0 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61  henever a rollba
1b600 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42  ck.** occurs.  B
1b610 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73  ut other modules
1b620 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65   are free to use
1b630 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67   it too, as long
1b640 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61   as.** no rollba
1b650 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e  cks are happenin
1b660 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  g..*/.void *sqli
1b670 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
1b680 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
1b690 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
1b6a0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a  r->pTmpSpace;.}.
1b6b0 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
1b6c0 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75  o set the maximu
1b6d0 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  m database page 
1b6e0 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20  count if mxPage 
1b6f0 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a  is positive. .**
1b700 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
1b710 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65   if mxPage is ze
1b720 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20  ro or negative. 
1b730 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63   And never reduc
1b740 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d  e the.** maximum
1b750 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f   page count belo
1b760 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  w the current si
1b770 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1b780 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64  se..**.** Regard
1b790 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20  less of mxPage, 
1b7a0 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  return the curre
1b7b0 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  nt maximum page 
1b7c0 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
1b7d0 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
1b7e0 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  eCount(Pager *pP
1b7f0 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
1b800 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a  ){.  int nPage;.
1b810 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29    if( mxPage>0 )
1b820 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
1b830 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20  Pgno = mxPage;. 
1b840 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
1b850 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
1b860 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  LOCK ){.    sqli
1b870 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1b880 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
1b890 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
1b8a0 69 6e 74 29 70 50 61 67 65 72 2d 3e 6d 78 50 67  int)pPager->mxPg
1b8b0 6e 6f 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 7d  no>=nPage );.  }
1b8c0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
1b8d0 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  ->mxPgno;.}../*.
1b8e0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1b8f0 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73   set of routines
1b900 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73   are used to dis
1b910 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74  able the simulat
1b920 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20  ed.** I/O error 
1b930 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73  mechanism.  Thes
1b940 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  e routines are u
1b950 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d  sed to avoid sim
1b960 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73  ulated.** errors
1b970 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65   in places where
1b980 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
1b990 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a  about errors..**
1b9a0 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c  .** Unless -DSQL
1b9b0 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73  ITE_TEST=1 is us
1b9c0 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e  ed, these routin
1b9d0 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70  es are all no-op
1b9e0 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  s.** and generat
1b9f0 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69  e no code..*/.#i
1ba00 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
1ba10 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
1ba20 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
1ba30 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74  ding;.extern int
1ba40 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
1ba50 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e  r_hit;.static in
1ba60 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69  t saved_cnt;.voi
1ba70 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  d disable_simula
1ba80 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
1ba90 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74  id){.  saved_cnt
1baa0 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72   = sqlite3_io_er
1bab0 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73  ror_pending;.  s
1bac0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
1bad0 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a  pending = -1;.}.
1bae0 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75  void enable_simu
1baf0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
1bb00 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
1bb10 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
1bb20 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d  g = saved_cnt;.}
1bb30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1bb40 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
1bb50 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20  d_io_errors().# 
1bb60 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69  define enable_si
1bb70 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
1bb80 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  s().#endif../*.*
1bb90 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
1bba0 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68   N bytes from th
1bbb0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
1bbc0 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d  he file into mem
1bbd0 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73  ory.** that pDes
1bbe0 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a  t points to. .**
1bbf0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
1bc00 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
1bc10 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20   transient file 
1bc20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c  (zFilename==""),
1bc30 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e   or.** opened on
1bc40 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61   a file less tha
1bc50 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  n N bytes in siz
1bc60 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  e, the output bu
1bc70 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65  ffer is.** zeroe
1bc80 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
1bc90 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61  returned. The ra
1bca0 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73  tionale for this
1bcb0 20 69 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a   is that this .*
1bcc0 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  * function is us
1bcd0 65 64 20 74 6f 20 72 65 61 64 20 64 61 74 61 62  ed to read datab
1bce0 61 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64  ase headers, and
1bcf0 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74   a new transient
1bd00 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65   or.** zero size
1bd10 64 20 64 61 74 61 62 61 73 65 20 68 61 73 20 61  d database has a
1bd20 20 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e   header than con
1bd30 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f  sists entirely o
1bd40 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20  f zeroes..**.** 
1bd50 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20  If any IO error 
1bd60 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54  apart from SQLIT
1bd70 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1bd80 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  AD is encountere
1bd90 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20  d,.** the error 
1bda0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1bdb0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61   to the caller a
1bdc0 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nd the contents 
1bdd0 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74  of the.** output
1bde0 20 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65   buffer undefine
1bdf0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1be00 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
1be10 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ader(Pager *pPag
1be20 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67  er, int N, unsig
1be30 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29  ned char *pDest)
1be40 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1be50 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74  ITE_OK;.  memset
1be60 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20  (pDest, 0, N);. 
1be70 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1be80 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
1be90 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1bea0 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  );..  /* This ro
1beb0 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
1bec0 6c 6c 65 64 20 62 79 20 62 74 72 65 65 20 69 6d  lled by btree im
1bed0 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
1bee0 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68  creating.  ** th
1bef0 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  e Pager object. 
1bf00 20 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62   There has not b
1bf10 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69  een an opportuni
1bf20 74 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e  ty to transition
1bf30 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64  .  ** to WAL mod
1bf40 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  e yet..  */.  as
1bf50 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
1bf60 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
1bf70 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
1bf80 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49  er->fd) ){.    I
1bf90 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25  OTRACE(("DBHDR %
1bfa0 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  p 0 %d\n", pPage
1bfb0 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20  r, N)).    rc = 
1bfc0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
1bfd0 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c  ager->fd, pDest,
1bfe0 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   N, 0);.    if( 
1bff0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
1c000 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
1c010 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c020 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
1c030 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1c040 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1c050 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
1c060 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
1c070 61 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63  abase file assoc
1c080 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20 70  iated .** with p
1c090 50 61 67 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c  Pager. Normally,
1c0a0 20 74 68 69 73 20 69 73 20 63 61 6c 63 75 6c 61   this is calcula
1c0b0 74 65 64 20 61 73 20 28 3c 64 62 20 66 69 6c 65  ted as (<db file
1c0c0 20 73 69 7a 65 3e 2f 3c 70 61 67 65 2d 73 69 7a   size>/<page-siz
1c0d0 65 3e 29 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c  e>)..** However,
1c0e0 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
1c0f0 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70  between 1 and <p
1c100 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20  age-size> bytes 
1c110 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a  in size, then .*
1c120 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64  * this is consid
1c130 65 72 65 64 20 61 20 31 20 70 61 67 65 20 66 69  ered a 1 page fi
1c140 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
1c150 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 72 72   pager is in err
1c160 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  or state when th
1c170 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1c180 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a  alled, then the.
1c190 2a 2a 20 65 72 72 6f 72 20 73 74 61 74 65 20 65  ** error state e
1c1a0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1c1b0 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67  urned and *pnPag
1c1c0 65 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  e left unchanged
1c1d0 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20  . Or,.** if the 
1c1e0 66 69 6c 65 20 73 79 73 74 65 6d 20 68 61 73 20  file system has 
1c1f0 74 6f 20 62 65 20 71 75 65 72 69 65 64 20 66 6f  to be queried fo
1c200 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  r the size of th
1c210 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68  e file and.** th
1c220 65 20 71 75 65 72 79 20 61 74 74 65 6d 70 74 20  e query attempt 
1c230 72 65 74 75 72 6e 73 20 61 6e 20 49 4f 20 65 72  returns an IO er
1c240 72 6f 72 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  ror, the IO erro
1c250 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1c260 65 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50 61 67  ed.** and *pnPag
1c270 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e  e is left unchan
1c280 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ged..**.** Other
1c290 77 69 73 65 2c 20 69 66 20 65 76 65 72 79 74 68  wise, if everyth
1c2a0 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
1c2b0 6c 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  l, then SQLITE_O
1c2c0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
1c2d0 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20   and *pnPage is 
1c2e0 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
1c2f0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
1c300 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69  e database..*/.i
1c310 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  nt sqlite3PagerP
1c320 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
1c330 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50  pPager, int *pnP
1c340 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61  age){.  Pgno nPa
1c350 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ge = 0;         
1c360 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
1c370 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65  turn via *pnPage
1c380 20 2a 2f 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d   */..  /* Determ
1c390 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ine the number o
1c3a0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66  f pages in the f
1c3b0 69 6c 65 2e 20 53 74 6f 72 65 20 74 68 69 73 20  ile. Store this 
1c3c0 69 6e 20 6e 50 61 67 65 2e 20 2a 2f 0a 20 20 69  in nPage. */.  i
1c3d0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
1c3e0 65 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 6e 50  eValid ){.    nP
1c3f0 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  age = pPager->db
1c400 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Size;.  }else{. 
1c410 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20     int rc;      
1c420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
1c430 72 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ror returned by 
1c440 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a  OsFileSize() */.
1c450 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20      i64 n = 0;  
1c460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1c470 69 6c 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  ile size in byte
1c480 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  s returned by Os
1c490 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 0a 20  FileSize() */.. 
1c4a0 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57     if( pagerUseW
1c4b0 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50  al(pPager) && pP
1c4c0 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
1c4d0 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  ER_UNLOCK ){.   
1c4e0 20 20 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73     sqlite3WalDbs
1c4f0 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ize(pPager->pWal
1c500 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d  , &nPage);.    }
1c510 0a 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d  ..    if( nPage=
1c520 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
1c530 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1c540 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
1c550 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
1c560 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
1c570 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
1c580 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
1c590 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
1c5a0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
1c5b0 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 20 29 7b  ger->fd, &n)) ){
1c5c0 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72  .          pager
1c5d0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
1c5e0 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  c);.          re
1c5f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1c600 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1c610 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50   if( n>0 && n<pP
1c620 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
1c630 7b 0a 20 20 20 20 20 20 20 20 6e 50 61 67 65 20  {.        nPage 
1c640 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
1c650 7b 0a 20 20 20 20 20 20 20 20 6e 50 61 67 65 20  {.        nPage 
1c660 3d 20 28 50 67 6e 6f 29 28 6e 20 2f 20 70 50 61  = (Pgno)(n / pPa
1c670 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1c680 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1c690 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1c6a0 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
1c6b0 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
1c6c0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
1c6d0 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e;.      pPager-
1c6e0 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50  >dbFileSize = nP
1c6f0 61 67 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65  age;.      pPage
1c700 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
1c710 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
1c720 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65   /* If the curre
1c730 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  nt number of pag
1c740 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69  es in the file i
1c750 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
1c760 68 65 20 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75  he .  ** configu
1c770 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  red maximum page
1c780 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61  r number, increa
1c790 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c  se the allowed l
1c7a0 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61  imit so.  ** tha
1c7b0 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62  t the file can b
1c7c0 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69  e read..  */.  i
1c7d0 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d  f( nPage>pPager-
1c7e0 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70  >mxPgno ){.    p
1c7f0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
1c800 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d  (Pgno)nPage;.  }
1c810 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f  ..  /* Set the o
1c820 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 61  utput variable a
1c830 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
1c840 5f 4f 4b 20 2a 2f 0a 20 20 2a 70 6e 50 61 67 65  _OK */.  *pnPage
1c850 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75   = nPage;.  retu
1c860 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1c870 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f  ../*.** Try to o
1c880 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20  btain a lock of 
1c890 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e  type locktype on
1c8a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1c8b0 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69  le. If.** a simi
1c8c0 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72 20 6c  lar or greater l
1c8d0 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
1c8e0 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  eld, this functi
1c8f0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a  on is a no-op.**
1c900 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49   (returning SQLI
1c910 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c  TE_OK immediatel
1c920 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  y)..**.** Otherw
1c930 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20  ise, attempt to 
1c940 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20  obtain the lock 
1c950 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c  using sqlite3OsL
1c960 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a  ock(). Invoke .*
1c970 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  * the busy callb
1c980 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ack if the lock 
1c990 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74  is currently not
1c9a0 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70 65   available. Repe
1c9b0 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65  at .** until the
1c9c0 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72   busy callback r
1c9d0 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72 20  eturns false or 
1c9e0 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d 70  until the attemp
1c9f0 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20  t to .** obtain 
1ca00 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64  the lock succeed
1ca10 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
1ca20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
1ca30 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f  cess and an erro
1ca40 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e  r code if we can
1ca50 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68  not obtain.** th
1ca60 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c  e lock. If the l
1ca70 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
1ca80 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73 65  successfully, se
1ca90 74 20 74 68 65 20 50 61 67 65 72 2e 73 74 61 74  t the Pager.stat
1caa0 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74  e .** variable t
1cab0 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f 72  o locktype befor
1cac0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
1cad0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1cae0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61  _wait_on_lock(Pa
1caf0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
1cb00 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
1cb10 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1cb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb30 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1cb40 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 4f  e */..  /* The O
1cb50 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75  S lock values mu
1cb60 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  st be the same a
1cb70 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63 6b  s the Pager lock
1cb80 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73   values */.  ass
1cb90 65 72 74 28 20 50 41 47 45 52 5f 53 48 41 52 45  ert( PAGER_SHARE
1cba0 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  D==SHARED_LOCK )
1cbb0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
1cbc0 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45  R_RESERVED==RESE
1cbd0 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RVED_LOCK );.  a
1cbe0 73 73 65 72 74 28 20 50 41 47 45 52 5f 45 58 43  ssert( PAGER_EXC
1cbf0 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56  LUSIVE==EXCLUSIV
1cc00 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  E_LOCK );..  /* 
1cc10 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  If the file is c
1cc20 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65  urrently unlocke
1cc30 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20  d then the size 
1cc40 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 2e  must be unknown.
1cc50 20 49 74 0a 20 20 2a 2a 20 6d 75 73 74 20 6e 6f   It.  ** must no
1cc60 74 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  t have been modi
1cc70 66 69 65 64 20 61 74 20 74 68 69 73 20 70 6f 69  fied at this poi
1cc80 6e 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  nt..  */.  asser
1cc90 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1cca0 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c  >=PAGER_SHARED |
1ccb0 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
1ccc0 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 61 73  Valid==0 );.  as
1ccd0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1cce0 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
1ccf0 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 4d  D || pPager->dbM
1cd00 6f 64 69 66 69 65 64 3d 3d 30 20 29 3b 0a 0a 20  odified==0 );.. 
1cd10 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
1cd20 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20  his is either a 
1cd30 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74  no-op (because t
1cd40 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
1cd50 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61  k is .  ** alrea
1cd60 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65 20  dy held, or one 
1cd70 6f 66 20 74 68 65 20 74 72 61 6e 73 69 73 74 69  of the transisti
1cd80 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73  ons that the bus
1cd90 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d  y-handler.  ** m
1cda0 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75  ay be invoked du
1cdb0 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20  ring, according 
1cdc0 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  to the comment a
1cdd0 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65  bove.  ** sqlite
1cde0 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
1cdf0 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61  dler()..  */.  a
1ce00 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
1ce10 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 29  state>=locktype)
1ce20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  .       || (pPag
1ce30 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
1ce40 5f 55 4e 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74  _UNLOCK && lockt
1ce50 79 70 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ype==PAGER_SHARE
1ce60 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50  D).       || (pP
1ce70 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
1ce80 45 52 5f 52 45 53 45 52 56 45 44 20 26 26 20 6c  ER_RESERVED && l
1ce90 6f 63 6b 74 79 70 65 3d 3d 50 41 47 45 52 5f 45  ocktype==PAGER_E
1cea0 58 43 4c 55 53 49 56 45 29 0a 20 20 29 3b 0a 0a  XCLUSIVE).  );..
1ceb0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1cec0 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ate>=locktype ){
1ced0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1cee0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
1cef0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20    do {.      rc 
1cf00 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
1cf10 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b  pPager->fd, lock
1cf20 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c  type);.    }whil
1cf30 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
1cf40 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42  SY && pPager->xB
1cf50 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65  usyHandler(pPage
1cf60 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
1cf70 72 67 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72  rg) );.    if( r
1cf80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1cf90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
1cfa0 61 74 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79  ate = (u8)lockty
1cfb0 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  pe;.      IOTRAC
1cfc0 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e  E(("LOCK %p %d\n
1cfd0 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74  ", pPager, lockt
1cfe0 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a  ype)).    }.  }.
1cff0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d000 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61  /*.** Function a
1d010 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
1d020 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 20  straint(pPager) 
1d030 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65 20  checks that one 
1d040 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f  of the .** follo
1d050 77 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f 72  wing is true for
1d060 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
1d070 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
1d080 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a  e page-cache:.**
1d090 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61 67  .**   a) The pag
1d0a0 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  e number is less
1d0b0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1d0c0 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
1d0d0 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72 65  e .**      curre
1d0e0 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  nt database imag
1d0f0 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a  e, in pages, OR.
1d100 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74 68  **.**   b) if th
1d110 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77  e page content w
1d120 65 72 65 20 77 72 69 74 74 65 6e 20 61 74 20 74  ere written at t
1d130 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f 75  his time, it wou
1d140 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62  ld not.**      b
1d150 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77  e necessary to w
1d160 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
1d170 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20   content out to 
1d180 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
1d190 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65 74 65  **      (as dete
1d1a0 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74 69  rmined by functi
1d1b0 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  on subjRequiresP
1d1c0 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  age())..**.** If
1d1d0 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61   the condition a
1d1e0 73 73 65 72 74 65 64 20 62 79 20 74 68 69 73 20  sserted by this 
1d1f0 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f  function were no
1d200 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65 0a  t true, and the.
1d210 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 77 65  ** dirty page we
1d220 72 65 20 74 6f 20 62 65 20 64 69 73 63 61 72 64  re to be discard
1d230 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68  ed from the cach
1d240 65 20 76 69 61 20 74 68 65 20 70 61 67 65 72 53  e via the pagerS
1d250 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69  tress().** routi
1d260 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73 73 28  ne, pagerStress(
1d270 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74  ) would not writ
1d280 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
1d290 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a  ge content to.**
1d2a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d2b0 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f 69  le. If a savepoi
1d2c0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
1d2d0 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ere rolled back 
1d2e0 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68 61  after.** this ha
1d2f0 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72 72  ppened, the corr
1d300 65 63 74 20 62 65 68 61 76 69 6f 75 72 20 77 6f  ect behaviour wo
1d310 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72  uld be to restor
1d320 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  e the current.**
1d330 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
1d340 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73  page. However, s
1d350 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e  ince this conten
1d360 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  t is not present
1d370 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68   in either.** th
1d380 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1d390 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f  or the portion o
1d3a0 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  f the rollback j
1d3b0 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73  ournal and .** s
1d3c0 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65  ub-journal rolle
1d3d0 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65  d back the conte
1d3e0 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  nt could not be 
1d3f0 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65  restored and the
1d400 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61  .** database ima
1d410 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20  ge would become 
1d420 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20 74  corrupt. It is t
1d430 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61  herefore fortuna
1d440 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73  te that .** this
1d450 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61   circumstance ca
1d460 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23  nnot arise..*/.#
1d470 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1d480 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63 20  E_DEBUG).static 
1d490 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63  void assertTrunc
1d4a0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28  ateConstraintCb(
1d4b0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61  PgHdr *pPg){.  a
1d4c0 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67  ssert( pPg->flag
1d4d0 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b  s&PGHDR_DIRTY );
1d4e0 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62 6a  .  assert( !subj
1d4f0 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
1d500 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d  ) || pPg->pgno<=
1d510 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53  pPg->pPager->dbS
1d520 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20  ize );.}.static 
1d530 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63  void assertTrunc
1d540 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61  ateConstraint(Pa
1d550 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1d560 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65  sqlite3PcacheIte
1d570 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72  rateDirty(pPager
1d580 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65 72  ->pPCache, asser
1d590 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
1d5a0 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a  intCb);.}.#else.
1d5b0 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 54  # define assertT
1d5c0 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
1d5d0 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66  t(pPager).#endif
1d5e0 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
1d5f0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   the in-memory d
1d600 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61  atabase file ima
1d610 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65  ge to nPage page
1d620 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  s. This .** func
1d630 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63  tion does not ac
1d640 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68  tually modify th
1d650 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1d660 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20  on disk. It .** 
1d670 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e  just sets the in
1d680 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20  ternal state of 
1d690 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
1d6a0 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a   so that the .**
1d6b0 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c   truncation will
1d6c0 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68   be done when th
1d6d0 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
1d6e0 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
1d6f0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
1d700 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
1d710 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  Image(Pager *pPa
1d720 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
1d730 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
1d740 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
1d750 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1d760 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61  ger->dbSize>=nPa
1d770 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
1d780 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1d790 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
1d7a0 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
1d7b0 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 61 73 73  e = nPage;.  ass
1d7c0 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
1d7d0 72 61 69 6e 74 28 70 50 61 67 65 72 29 3b 0a 7d  raint(pPager);.}
1d7e0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
1d7f0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1d800 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
1d810 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
1d820 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a   rollback. It.**
1d830 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e   syncs the journ
1d840 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c  al file to disk,
1d850 20 74 68 65 6e 20 73 65 74 73 20 70 50 61 67 65   then sets pPage
1d860 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f  r->journalHdr to
1d870 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20   the.** size of 
1d880 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1d890 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67   so that the pag
1d8a0 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f  er_playback() ro
1d8b0 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74  utine knows.** t
1d8c0 68 61 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a  hat the entire j
1d8d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
1d8e0 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  been synced..**.
1d8f0 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74  ** Syncing a hot
1d900 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b  -journal to disk
1d910 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
1d920 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  ng to roll it ba
1d930 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74  ck ensures .** t
1d940 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66  hat if a power-f
1d950 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75  ailure occurs du
1d960 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
1d970 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  k, the process t
1d980 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  hat.** attempts 
1d990 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69  rollback followi
1d9a0 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65  ng system recove
1d9b0 72 79 20 73 65 65 73 20 74 68 65 20 73 61 6d 65  ry sees the same
1d9c0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74   journal.** cont
1d9d0 65 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f 63  ent as this proc
1d9e0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76  ess..**.** If ev
1d9f0 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73  erything goes as
1da00 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45   planned, SQLITE
1da10 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1da20 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20   Otherwise, .** 
1da30 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1da40 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
1da50 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74  int pagerSyncHot
1da60 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
1da70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1da80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1da90 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
1daa0 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
1dab0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
1dac0 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54  ager->jfd, SQLIT
1dad0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a  E_SYNC_NORMAL);.
1dae0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1daf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1db00 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
1db10 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
1db20 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  d, &pPager->jour
1db30 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72  nalHdr);.  }.  r
1db40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1db50 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
1db60 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65  page cache.  Fre
1db70 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64  e all memory and
1db80 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73   close all files
1db90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61  ..**.** If a tra
1dba0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20  nsaction was in 
1dbb0 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68  progress when th
1dbc0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1dbd0 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72  lled, that.** tr
1dbe0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
1dbf0 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f  led back.  All o
1dc00 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
1dc10 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
1dc20 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65  .** and their me
1dc30 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20  mory is freed.  
1dc40 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
1dc50 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69  se a page associ
1dc60 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69  ated.** with thi
1dc70 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74  s page cache aft
1dc80 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
1dc90 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69   returns will li
1dca0 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69  kely.** result i
1dcb0 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a  n a coredump..**
1dcc0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1dcd0 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64  n always succeed
1dce0 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  s. If a transact
1dcf0 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
1dd00 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d   attempt.** is m
1dd10 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ade to roll it b
1dd20 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ack. If an error
1dd30 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
1dd40 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20  he rollback .** 
1dd50 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61  a hot journal ma
1dd60 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65  y be left in the
1dd70 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20   filesystem but 
1dd80 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  no error is retu
1dd90 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63  rned.** to the c
1dda0 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  aller..*/.int sq
1ddb0 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
1ddc0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1ddd0 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28 75 38    u8 *pTmp = (u8
1dde0 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   *)pPager->pTmpS
1ddf0 70 61 63 65 3b 0a 0a 20 20 64 69 73 61 62 6c 65  pace;..  disable
1de00 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
1de10 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65  rors();.  sqlite
1de20 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
1de30 6f 63 28 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  oc();.  pPager->
1de40 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70  errCode = 0;.  p
1de50 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
1de60 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Mode = 0;.#ifnde
1de70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1de80 4c 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c  L.  sqlite3WalCl
1de90 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ose(pPager->pWal
1dea0 2c 0a 20 20 20 20 28 70 50 61 67 65 72 2d 3e 6e  ,.    (pPager->n
1deb0 6f 53 79 6e 63 20 3f 20 30 20 3a 20 70 50 61 67  oSync ? 0 : pPag
1dec0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 2c  er->sync_flags),
1ded0 20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61   .    pPager->pa
1dee0 67 65 53 69 7a 65 2c 20 70 54 6d 70 0a 20 20 29  geSize, pTmp.  )
1def0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  ;.  pPager->pWal
1df00 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70   = 0;.#endif.  p
1df10 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
1df20 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  r);.  if( MEMDB 
1df30 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  ){.    pager_unl
1df40 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ock(pPager);.  }
1df50 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 74  else{.    /* Set
1df60 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 48 64   Pager.journalHd
1df70 72 20 74 6f 20 2d 31 20 66 6f 72 20 74 68 65 20  r to -1 for the 
1df80 62 65 6e 65 66 69 74 20 6f 66 20 74 68 65 20 70  benefit of the p
1df90 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
1dfa0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 68 69  .    ** call whi
1dfb0 63 68 20 6d 61 79 20 62 65 20 6d 61 64 65 20 66  ch may be made f
1dfc0 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
1dfd0 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
1dfe0 6b 28 29 2e 20 49 66 20 69 74 0a 20 20 20 20 2a  k(). If it.    *
1dff0 2a 20 69 73 20 6e 6f 74 20 2d 31 2c 20 74 68 65  * is not -1, the
1e000 6e 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 70  n the unsynced p
1e010 6f 72 74 69 6f 6e 20 6f 66 20 61 6e 20 6f 70 65  ortion of an ope
1e020 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  n journal file m
1e030 61 79 0a 20 20 20 20 2a 2a 20 62 65 20 70 6c 61  ay.    ** be pla
1e040 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  yed back into th
1e050 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61  e database. If a
1e060 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
1e070 63 63 75 72 73 20 77 68 69 6c 65 0a 20 20 20 20  ccurs while.    
1e080 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65  ** this is happe
1e090 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61  ning, the databa
1e0a0 73 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f  se may become co
1e0b0 72 72 75 70 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  rrupt..    */.  
1e0c0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
1e0d0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
1e0e0 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
1e0f0 64 65 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f  de = pagerSyncHo
1e100 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  tJournal(pPager)
1e110 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
1e120 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
1e130 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
1e140 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
1e150 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e  gnMalloc();.  en
1e160 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
1e170 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41  o_errors();.  PA
1e180 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45  GERTRACE(("CLOSE
1e190 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1e1a0 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54  pPager)));.  IOT
1e1b0 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c  RACE(("CLOSE %p\
1e1c0 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73  n", pPager)).  s
1e1d0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
1e1e0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71  ager->jfd);.  sq
1e1f0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
1e200 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69  ger->fd);.  sqli
1e210 74 65 33 50 61 67 65 46 72 65 65 28 70 54 6d 70  te3PageFree(pTmp
1e220 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
1e230 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  heClose(pPager->
1e240 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65  pPCache);..#ifde
1e250 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
1e260 45 43 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  EC.  if( pPager-
1e270 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50  >xCodecFree ) pP
1e280 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
1e290 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29  (pPager->pCodec)
1e2a0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
1e2b0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61  rt( !pPager->aSa
1e2c0 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67  vepoint && !pPag
1e2d0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->pInJournal )
1e2e0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f  ;.  assert( !isO
1e2f0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
1e300 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67   && !isOpen(pPag
1e310 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20  er->sjfd) );..  
1e320 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
1e330 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
1e340 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
1e350 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
1e360 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1e370 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
1e380 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
1e390 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20  number for page 
1e3a0 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c  pPg..*/.Pgno sql
1e3b0 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
1e3c0 62 65 72 28 44 62 50 61 67 65 20 2a 70 50 67 29  ber(DbPage *pPg)
1e3d0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  {.  return pPg->
1e3e0 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  pgno;.}.#endif..
1e3f0 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
1e400 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
1e410 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67  unt for page pPg
1e420 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1e430 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65  3PagerRef(DbPage
1e440 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65   *pPg){.  sqlite
1e450 33 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b  3PcacheRef(pPg);
1e460 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
1e470 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f  he journal. In o
1e480 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65  ther words, make
1e490 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61   sure all the pa
1e4a0 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  ges that have.**
1e4b0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
1e4c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76   the journal hav
1e4d0 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68  e actually reach
1e4e0 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f  ed the surface o
1e4f0 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  f the.** disk an
1e500 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  d can be restore
1e510 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  d in the event o
1e520 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  f a hot-journal 
1e530 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
1e540 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65  If the Pager.nee
1e550 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 6f  dSync flag is no
1e560 74 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73  t set, then this
1e570 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 0a 2a   function is a.*
1e580 2a 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  * no-op. Otherwi
1e590 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20  se, the actions 
1e5a0 72 65 71 75 69 72 65 64 20 64 65 70 65 6e 64 20  required depend 
1e5b0 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  on the journal-m
1e5c0 6f 64 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ode.** and the d
1e5d0 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
1e5e0 73 74 69 63 73 20 6f 66 20 74 68 65 20 74 68 65  stics of the the
1e5f0 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73   file-system, as
1e600 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
1e610 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e    * If the journ
1e620 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e  al file is an in
1e630 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
1e640 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20  file, no action 
1e650 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74  need.**     be t
1e660 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  aken..**.**   * 
1e670 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
1e680 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f  e device does no
1e690 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 41  t support the SA
1e6a0 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
1e6b0 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20  ty,.**     then 
1e6c0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f  the nRec field o
1e6d0 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
1e6e0 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72  tly written jour
1e6f0 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  nal header.**   
1e700 20 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20    is updated to 
1e710 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62  contain the numb
1e720 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65  er of journal re
1e730 63 6f 72 64 73 20 74 68 61 74 20 68 61 76 65 0a  cords that have.
1e740 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69 74  **     been writ
1e750 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74  ten following it
1e760 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
1e770 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66  s operating in f
1e780 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20  ull-sync.**     
1e790 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a  mode, then the j
1e7a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73  ournal file is s
1e7b0 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68 69  ynced before thi
1e7c0 73 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  s field is updat
1e7d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ed..**.**   * If
1e7e0 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73   the device does
1e7f0 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65   not support the
1e800 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70   SEQUENTIAL prop
1e810 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20  erty, then .**  
1e820 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
1e830 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  is synced..**.**
1e840 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63   Or, in pseudo-c
1e850 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28  ode:.**.**   if(
1e860 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20   NOT <in-memory 
1e870 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20  journal> ){.**  
1e880 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f     if( NOT SAFE_
1e890 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20  APPEND ){.**    
1e8a0 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e     if( <full-syn
1e8b0 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28  c mode> ) xSync(
1e8c0 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b  <journal file>);
1e8d0 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74  .**       <updat
1e8e0 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a  e nRec field>.**
1e8f0 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69       } .**     i
1e900 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41  f( NOT SEQUENTIA
1e910 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e  L ) xSync(<journ
1e920 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20  al file>);.**   
1e930 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65  }.**.** The Page
1e940 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
1e950 69 73 20 6e 65 76 65 72 20 62 65 20 73 65 74 20  is never be set 
1e960 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
1e970 6c 65 73 2c 20 6f 72 20 61 6e 79 0a 2a 2a 20 66  les, or any.** f
1e980 69 6c 65 20 6f 70 65 72 61 74 69 6e 67 20 69 6e  ile operating in
1e990 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 28 50   no-sync mode (P
1e9a0 61 67 65 72 2e 6e 6f 53 79 6e 63 20 73 65 74 20  ager.noSync set 
1e9b0 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 29 2e 0a 2a 2a  to non-zero)..**
1e9c0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
1e9d0 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
1e9e0 63 6c 65 61 72 73 20 74 68 65 20 50 47 48 44 52  clears the PGHDR
1e9f0 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
1ea00 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67  of every .** pag
1ea10 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64  e currently held
1ea20 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72   in memory befor
1ea30 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49  e returning SQLI
1ea40 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a  TE_OK. If an IO.
1ea50 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  ** error is enco
1ea60 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74 68  untered, then th
1ea70 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
1ea80 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
1ea90 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74  he caller..*/.st
1eaa0 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
1eab0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
1eac0 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
1ead0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  r->needSync ){. 
1eae0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
1eaf0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1eb00 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1eb10 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
1eb20 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
1eb30 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 69  EMORY ){.      i
1eb40 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb60 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1eb70 64 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73  de */.      cons
1eb80 74 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69  t int iDc = sqli
1eb90 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
1eba0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
1ebb0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73  r->fd);.      as
1ebc0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1ebd0 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  ger->jfd) );..  
1ebe0 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26      if( 0==(iDc&
1ebf0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
1ec00 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
1ec10 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f       /* This blo
1ec20 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e  ck deals with an
1ec30 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d   obscure problem
1ec40 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f  . If the last co
1ec50 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20  nnection.       
1ec60 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74   ** that wrote t
1ec70 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
1ec80 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e  was operating in
1ec90 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72   persistent-jour
1eca0 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  nal.        ** m
1ecb0 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ode, then the jo
1ecc0 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61  urnal file may a
1ecd0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74  t this point act
1ece0 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a  ually be larger.
1ecf0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20          ** than 
1ed00 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
1ed10 20 62 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e   bytes. If the n
1ed20 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65  ext thing in the
1ed30 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20   journal.       
1ed40 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73   ** file happens
1ed50 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c   to be a journal
1ed60 2d 68 65 61 64 65 72 20 28 77 72 69 74 74 65 6e  -header (written
1ed70 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   as part of the.
1ed80 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69          ** previ
1ed90 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73  ous connection's
1eda0 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61   transaction), a
1edb0 6e 64 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f  nd a crash or po
1edc0 77 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20  wer-failure .   
1edd0 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61       ** occurs a
1ede0 66 74 65 72 20 6e 52 65 63 20 69 73 20 75 70 64  fter nRec is upd
1edf0 61 74 65 64 20 62 75 74 20 62 65 66 6f 72 65 20  ated but before 
1ee00 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
1ee10 77 72 69 74 65 73 20 0a 20 20 20 20 20 20 20 20  writes .        
1ee20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  ** anything else
1ee30 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
1ee40 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73  file (or commits
1ee50 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20  /rolls back its 
1ee60 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  .        ** tran
1ee70 73 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53  saction), then S
1ee80 51 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65  QLite may become
1ee90 20 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64   confused when d
1eea0 6f 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20  oing the .      
1eeb0 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c    ** hot-journal
1eec0 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77   rollback follow
1eed0 69 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74  ing recovery. It
1eee0 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61   may roll back a
1eef0 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ll.        ** of
1ef00 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
1ef10 73 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f  s data, then pro
1ef20 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20  ceed to rolling 
1ef30 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20  back the old,.  
1ef40 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d        ** out-of-
1ef50 64 61 74 65 20 64 61 74 61 20 74 68 61 74 20 66  date data that f
1ef60 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62  ollows it. Datab
1ef70 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
1ef80 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1ef90 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72     ** To work ar
1efa0 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68  ound this, if th
1efb0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
1efc0 6f 65 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f  oes appear to co
1efd0 6e 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ntain.        **
1efe0 20 61 20 76 61 6c 69 64 20 68 65 61 64 65 72 20   a valid header 
1eff0 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e  following Pager.
1f000 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e  journalOff, then
1f010 20 77 72 69 74 65 20 61 20 30 78 30 30 0a 20 20   write a 0x00.  
1f020 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f        ** byte to
1f030 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74   the start of it
1f040 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66   to prevent it f
1f050 72 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e  rom being recogn
1f060 69 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ized..        **
1f070 0a 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69  .        ** Vari
1f080 61 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66  able iNextHdrOff
1f090 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  set is set to th
1f0a0 65 20 6f 66 66 73 65 74 20 61 74 20 77 68 69 63  e offset at whic
1f0b0 68 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a  h this.        *
1f0c0 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65  * problematic he
1f0d0 61 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c  ader will occur,
1f0e0 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 61   if it exists. a
1f0f0 4d 61 67 69 63 20 69 73 20 75 73 65 64 20 0a 20  Magic is used . 
1f100 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74         ** as a t
1f110 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20  emporary buffer 
1f120 74 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20 66  to inspect the f
1f130 69 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62  irst couple of b
1f140 79 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20  ytes of.        
1f150 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c  ** the potential
1f160 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
1f170 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1f180 20 20 20 20 69 36 34 20 69 4e 65 78 74 48 64 72      i64 iNextHdr
1f190 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  Offset;.        
1f1a0 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20  u8 aMagic[8];.  
1f1b0 20 20 20 20 20 20 75 38 20 7a 48 65 61 64 65 72        u8 zHeader
1f1c0 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
1f1d0 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20  Magic)+4];..    
1f1e0 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64      memcpy(zHead
1f1f0 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  er, aJournalMagi
1f200 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  c, sizeof(aJourn
1f210 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20  alMagic));.     
1f220 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48     put32bits(&zH
1f230 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
1f240 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50  urnalMagic)], pP
1f250 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20  ager->nRec);..  
1f260 20 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66        iNextHdrOf
1f270 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  fset = journalHd
1f280 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
1f290 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1f2a0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
1f2b0 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
1f2c0 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73   8, iNextHdrOffs
1f2d0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  et);.        if(
1f2e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1f2f0 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67  & 0==memcmp(aMag
1f300 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
1f310 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20  c, 8) ){.       
1f320 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1f330 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b  u8 zerobyte = 0;
1f340 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1f350 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1f360 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72  Pager->jfd, &zer
1f370 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48  obyte, 1, iNextH
1f380 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  drOffset);.     
1f390 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1f3a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
1f3b0 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
1f3c0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
1f3d0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1f3e0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
1f3f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  .        /* Writ
1f400 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
1f410 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
1f420 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49  l file header. I
1f430 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f in.        ** 
1f440 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73  full-synchronous
1f450 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
1f460 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54  journal first. T
1f470 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
1f480 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20  .        ** all 
1f490 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20  data has really 
1f4a0 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66  hit the disk bef
1f4b0 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61  ore nRec is upda
1f4c0 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20  ted to mark.    
1f4d0 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63      ** it as a c
1f4e0 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c  andidate for rol
1f4f0 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a  lback..        *
1f500 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
1f510 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
1f520 64 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74  d if the persist
1f530 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72  ent media suppor
1f540 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ts the.        *
1f550 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72  * SAFE_APPEND pr
1f560 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20  operty. Because 
1f570 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  in this case it 
1f580 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
1f590 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  .        ** for 
1f5a0 67 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20  garbage data to 
1f5b0 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  be appended to t
1f5c0 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65  he file, the nRe
1f5d0 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20  c field.        
1f5e0 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  ** is populated 
1f5f0 77 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20  with 0xFFFFFFFF 
1f600 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
1f610 20 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74   header is writt
1f620 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  en.        ** an
1f630 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f  d never needs to
1f640 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20   be updated..   
1f650 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1f660 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
1f670 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26  Sync && 0==(iDc&
1f680 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
1f690 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20  UENTIAL) ){.    
1f6a0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1f6b0 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  (("SYNC journal 
1f6c0 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
1f6d0 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
1f6e0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
1f6f0 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
1f700 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20  ager)).         
1f710 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
1f720 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
1f730 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
1f740 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ags);.          
1f750 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f760 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1f770 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f780 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
1f790 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67  %p %lld\n", pPag
1f7a0 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er, pPager->jour
1f7b0 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20 20 20  nalHdr));.      
1f7c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1f7d0 57 72 69 74 65 28 0a 20 20 20 20 20 20 20 20 20  Write(.         
1f7e0 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20     pPager->jfd, 
1f7f0 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28  zHeader, sizeof(
1f800 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67 65 72  zHeader), pPager
1f810 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20  ->journalHdr.   
1f820 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
1f830 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f840 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1f850 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1f860 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
1f870 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
1f880 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47  ) ){.        PAG
1f890 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a  ERTRACE(("SYNC j
1f8a0 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
1f8b0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1f8c0 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52  ));.        IOTR
1f8d0 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
1f8e0 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
1f8f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f900 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
1f910 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
1f920 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20  _flags| .       
1f930 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63     (pPager->sync
1f940 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53  _flags==SQLITE_S
1f950 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f  YNC_FULL?SQLITE_
1f960 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29  SYNC_DATAONLY:0)
1f970 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
1f980 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f990 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1f9a0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1f9b0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75  ..    /* The jou
1f9c0 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75  rnal file was ju
1f9d0 73 74 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  st successfully 
1f9e0 73 79 6e 63 65 64 2e 20 53 65 74 20 50 61 67 65  synced. Set Page
1f9f0 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20  r.needSync .    
1fa00 2a 2a 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 63  ** to zero and c
1fa10 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e  lear the PGHDR_N
1fa20 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e  EED_SYNC flag on
1fa30 20 61 6c 6c 20 70 61 67 65 73 73 2e 0a 20 20 20   all pagess..   
1fa40 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
1fa50 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
1fa60 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1fa70 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20  lStarted = 1;.  
1fa80 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1fa90 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lHdr = pPager->j
1faa0 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 73  ournalOff;.    s
1fab0 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
1fac0 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65  rSyncFlags(pPage
1fad0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d  r->pPCache);.  }
1fae0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1faf0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
1fb00 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
1fb10 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69  he first in a li
1fb20 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72  nked list of dir
1fb30 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74  ty pages connect
1fb40 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48  ed.** by the PgH
1fb50 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65  dr.pDirty pointe
1fb60 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
1fb70 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65   writes each one
1fb80 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65   of the.** in-me
1fb90 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74 68  mory pages in th
1fba0 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61  e list to the da
1fbb0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
1fbc0 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a   argument may.**
1fbd0 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73   be NULL, repres
1fbe0 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20  enting an empty 
1fbf0 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61  list. In this ca
1fc00 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  se this function
1fc10 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a   is.** a no-op..
1fc20 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
1fc30 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61  must hold at lea
1fc40 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  st a RESERVED lo
1fc50 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ck when this fun
1fc60 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c  ction.** is call
1fc70 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69  ed. Before writi
1fc80 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74  ng anything to t
1fc90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1fca0 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69  , this lock.** i
1fcb0 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e  s upgraded to an
1fcc0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
1fcd0 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e   If the lock can
1fce0 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  not be obtained,
1fcf0 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
1fd00 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1fd10 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74 74  no data is writt
1fd20 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
1fd30 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
1fd40 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
1fd50 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65  a temp-file page
1fd60 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c  r and the actual
1fd70 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c   file-system fil
1fd80 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20  e.** is not yet 
1fd90 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61  open, it is crea
1fda0 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62  ted and opened b
1fdb0 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
1fdc0 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75  s .** written ou
1fdd0 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68  t..**.** Once th
1fde0 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  e lock has been 
1fdf0 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66  upgraded and, if
1fe00 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65 20   necessary, the 
1fe10 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20  file opened,.** 
1fe20 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77 72  the pages are wr
1fe30 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65  itten out to the
1fe40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1fe50 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72  n list order. Wr
1fe60 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20  iting.** a page 
1fe70 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69 74  is skipped if it
1fe80 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f 66   meets either of
1fe90 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
1fea0 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20  riteria:.**.**  
1feb0 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62   * The page numb
1fec0 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
1fed0 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
1fee0 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50   or.**   * The P
1fef0 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
1ff00 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
1ff10 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  he page..**.** I
1ff20 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20  f writing out a 
1ff30 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65 20  page causes the 
1ff40 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
1ff50 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46   grow, Pager.dbF
1ff60 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70  ileSize.** is up
1ff70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  dated accordingl
1ff80 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73 20  y. If page 1 is 
1ff90 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65  written out, the
1ffa0 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63 68  n the value cach
1ffb0 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64  ed.** in Pager.d
1ffc0 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75  bFileVers[] is u
1ffd0 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20  pdated to match 
1ffe0 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74  the new value st
1fff0 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64  ored in.** the d
20000 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
20010 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
20020 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
20030 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
20040 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
20050 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
20060 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  s, an IO error c
20070 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
20080 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c   Or, if the EXCL
20090 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f  USIVE lock canno
200a0 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64  t.** be obtained
200b0 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  , SQLITE_BUSY is
200c0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
200d0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
200e0 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61  rite_pagelist(Pa
200f0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
20100 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  dr *pList){.  in
20110 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
20120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20130 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
20140 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 74 20 74 68  e */..  /* At th
20150 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d  is point there m
20160 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20 52  ay be either a R
20170 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
20180 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
20190 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
201a0 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
201b0 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c   already an EXCL
201c0 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20  USIVE lock, the 
201d0 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63  following.  ** c
201e0 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
201f0 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67    **.  ** Moving
20200 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52   the lock from R
20210 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55  ESERVED to EXCLU
20220 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e  SIVE actually in
20230 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a  volves going.  *
20240 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74  * through an int
20250 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20  ermediate state 
20260 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e  PENDING.   A PEN
20270 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e  DING lock preven
20280 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64  ts new.  ** read
20290 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69  ers from attachi
202a0 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
202b0 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66  se but is unsuff
202c0 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f  icient for us to
202d0 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68  .  ** write.  Th
202e0 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44  e idea of a PEND
202f0 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70  ING lock is to p
20300 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65  revent new reade
20310 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d  rs from.  ** com
20320 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20  ing in while we 
20330 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e  wait for existin
20340 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65  g readers to cle
20350 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  ar..  **.  ** Wh
20360 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73  ile the pager is
20370 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44   in the RESERVED
20380 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67   state, the orig
20390 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
203a0 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61  le.  ** is uncha
203b0 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20  nged and we can 
203c0 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74  rollback without
203d0 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62   having to playb
203e0 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75  ack the.  ** jou
203f0 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72  rnal into the or
20400 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
20410 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74  file.  Once we t
20420 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a  ransition to.  *
20430 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20  * EXCLUSIVE, it 
20440 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
20450 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  se file has been
20460 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79   changed and any
20470 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77   rollback.  ** w
20480 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f  ill require a jo
20490 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a  urnal playback..
204a0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21    */.  assert( !
204b0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
204c0 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
204d0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
204e0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
204f0 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77  ;.  rc = pager_w
20500 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
20510 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
20520 43 4b 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  CK);..  /* If th
20530 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70  e file is a temp
20540 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65  -file has not ye
20550 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
20560 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20  pen it now. It. 
20570 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   ** is not possi
20580 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65  ble for rc to be
20590 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
205a0 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72  TE_OK if this br
205b0 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b  anch.  ** is tak
205c0 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69  en, as pager_wai
205d0 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61  t_on_lock() is a
205e0 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d   no-op for temp-
205f0 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  files..  */.  if
20600 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
20610 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  ->fd) ){.    ass
20620 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d  ert( pPager->tem
20630 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c  pFile && rc==SQL
20640 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63  ITE_OK );.    rc
20650 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70   = pagerOpentemp
20660 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
20670 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73  >fd, pPager->vfs
20680 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Flags);.  }..  /
20690 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66 69 72  * Before the fir
206a0 73 74 20 77 72 69 74 65 2c 20 67 69 76 65 20 74  st write, give t
206b0 68 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66  he VFS a hint of
206c0 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a   what the final.
206d0 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77    ** file size w
206e0 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61  ill be..  */.  a
206f0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
20700 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
20710 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
20720 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20730 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53  K && pPager->dbS
20740 69 7a 65 3e 28 70 50 61 67 65 72 2d 3e 64 62 4f  ize>(pPager->dbO
20750 72 69 67 53 69 7a 65 2b 31 29 20 29 7b 0a 20 20  rigSize+1) ){.  
20760 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
20770 73 7a 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d  szFile = pPager-
20780 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c  >pageSize * (sql
20790 69 74 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65  ite3_int64)pPage
207a0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73  r->dbSize;.    s
207b0 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
207c0 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  rol(pPager->fd, 
207d0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
207e0 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29  E_HINT, &szFile)
207f0 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
20800 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
20810 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67   pList ){.    Pg
20820 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d  no pgno = pList-
20830 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49  >pgno;..    /* I
20840 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74  f there are dirt
20850 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  y pages in the p
20860 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70  age cache with p
20870 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61  age numbers grea
20880 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ter.    ** than 
20890 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68  Pager.dbSize, th
208a0 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33  is means sqlite3
208b0 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
208c0 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20  ge() was called 
208d0 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74  to.    ** make t
208e0 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20  he file smaller 
208f0 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61  (presumably by a
20900 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29  uto-vacuum code)
20910 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20  . Do not write. 
20920 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70     ** any such p
20930 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65  ages to the file
20940 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
20950 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69  Also, do not wri
20960 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20  te out any page 
20970 74 68 61 74 20 68 61 73 20 74 68 65 20 50 47 48  that has the PGH
20980 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c  DR_DONT_WRITE fl
20990 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73  ag.    ** set (s
209a0 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  et by sqlite3Pag
209b0 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a  erDontWrite())..
209c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
209d0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53  gno<=pPager->dbS
209e0 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74  ize && 0==(pList
209f0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f  ->flags&PGHDR_DO
20a00 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20  NT_WRITE) ){.   
20a10 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
20a20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
20a30 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
20a40 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77    /* Offset to w
20a50 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68  rite */.      ch
20a60 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20  ar *pData;      
20a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20a90 44 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f  Data to write */
20aa0 20 20 20 20 0a 0a 20 20 20 20 20 20 2f 2a 20 45      ..      /* E
20ab0 6e 63 6f 64 65 20 74 68 65 20 64 61 74 61 62 61  ncode the databa
20ac0 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45  se */.      CODE
20ad0 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74  C2(pPager, pList
20ae0 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36  ->pData, pgno, 6
20af0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
20b00 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a  NOMEM, pData);..
20b10 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f        /* Write o
20b20 75 74 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ut the page data
20b30 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
20b40 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
20b50 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61  Pager->fd, pData
20b60 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
20b70 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20  ze, offset);..  
20b80 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31      /* If page 1
20b90 20 77 61 73 20 6a 75 73 74 20 77 72 69 74 74 65   was just writte
20ba0 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65 72 2e  n, update Pager.
20bb0 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61  dbFileVers to ma
20bc0 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  tch.      ** the
20bd0 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65   value now store
20be0 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
20bf0 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69  e file. If writi
20c00 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a  ng this .      *
20c10 2a 20 70 61 67 65 20 63 61 75 73 65 64 20 74 68  * page caused th
20c20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
20c30 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20  to grow, update 
20c40 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20  dbFileSize. .   
20c50 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
20c60 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
20c70 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
20c80 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
20c90 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f  pData[24], sizeo
20ca0 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
20cb0 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
20cc0 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
20cd0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
20ce0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  e ){.        pPa
20cf0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
20d00 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  = pgno;.      }.
20d10 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  .      /* Update
20d20 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65   any backup obje
20d30 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20  cts copying the 
20d40 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73  contents of this
20d50 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20   pager. */.     
20d60 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
20d70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
20d80 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a  ckup, pgno, (u8*
20d90 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a  )pList->pData);.
20da0 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
20db0 45 28 28 22 53 54 4f 52 45 20 25 64 20 70 61 67  E(("STORE %d pag
20dc0 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
20dd0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
20de0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
20df0 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
20e00 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69  ger_pagehash(pLi
20e10 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  st)));.      IOT
20e20 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20  RACE(("PGOUT %p 
20e30 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
20e40 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47  gno));.      PAG
20e50 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
20e60 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
20e70 75 6e 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45  unt);.      PAGE
20e80 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
20e90 57 72 69 74 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Write);.    }els
20ea0 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
20eb0 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64  ACE(("NOSTORE %d
20ec0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
20ed0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
20ee0 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  no));.    }.#ifd
20ef0 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
20f00 50 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d  PAGES.    pList-
20f10 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
20f20 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
20f30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c  );.#endif.    pL
20f40 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ist = pList->pDi
20f50 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  rty;.  }..  retu
20f60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
20f70 45 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  Ensure that the 
20f80 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
20f90 20 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74 20   is open. If it 
20fa0 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  is already open,
20fb0 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
20fc0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
20fd0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
20fe0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 65 76  s returned if ev
20ff0 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63  erything goes ac
21000 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e  cording to plan.
21010 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49   An .** SQLITE_I
21020 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63  OERR_XXX error c
21030 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
21040 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  if a call to sql
21050 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a  ite3OsOpen() .**
21060 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
21070 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75  c int openSubJou
21080 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
21090 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
210a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
210b0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
210c0 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66  >sjfd) ){.    if
210d0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
210e0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
210f0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
21100 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  || pPager->subjI
21110 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20  nMemory ){.     
21120 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
21130 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  alOpen(pPager->s
21140 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  jfd);.    }else{
21150 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
21160 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72  rOpentemp(pPager
21170 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  , pPager->sjfd, 
21180 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
21190 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20  OURNAL);.    }. 
211a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
211b0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
211c0 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20  a record of the 
211d0 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
211e0 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65   page pPg to the
211f0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a   sub-journal. .*
21200 2a 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c  * It is the call
21210 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  ers responsibili
21220 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52 65  ty to use subjRe
21230 71 75 69 72 65 73 50 61 67 65 28 29 20 74 6f 20  quiresPage() to 
21240 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69  check .** that i
21250 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71 75  t is really requ
21260 69 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c  ired before call
21270 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
21280 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  n..**.** If succ
21290 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20  essful, set the 
212a0 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
212b0 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69  g to pPg->pgno i
212c0 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a  n the bitvecs.**
212d0 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61   for all open sa
212e0 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20  vepoints before 
212f0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
21300 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
21310 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
21320 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
21330 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e  s successful, an
21340 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   IO.** error cod
21350 65 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74  e if the attempt
21360 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
21370 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69   sub-journal fai
21380 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54  ls, or .** SQLIT
21390 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
213a0 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20  loc fails while 
213b0 73 65 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e  setting a bit in
213c0 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20   a savepoint.** 
213d0 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69  bitvec..*/.stati
213e0 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  c int subjournal
213f0 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
21400 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
21410 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
21420 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
21430 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 61  Pager;.  if( pPa
21440 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
21450 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
21460 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20  ODE_OFF ){..    
21470 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d  /* Open the sub-
21480 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 68  journal, if it h
21490 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62  as not already b
214a0 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  een opened */.  
214b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
214c0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
214d0 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
214e0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
214f0 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  || pagerUseWal(p
21500 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 61 73  Pager) );.    as
21510 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
21520 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50  ger->sjfd) || pP
21530 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30  ager->nSubRec==0
21540 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
21550 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
21560 65 72 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  er) .         ||
21570 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70   pageInJournal(p
21580 50 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  Pg) .         ||
21590 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
215a0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20  r->dbOrigSize . 
215b0 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f     );.    rc = o
215c0 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50  penSubJournal(pP
215d0 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ager);..    /* I
215e0 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  f the sub-journa
215f0 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75 63  l was opened suc
21600 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77 61  cessfully (or wa
21610 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c  s already open),
21620 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74 68  .    ** write th
21630 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
21640 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
21650 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
21660 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21670 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d     void *pData =
21680 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20   pPg->pData;.   
21690 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
216a0 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a  pPager->nSubRec*
216b0 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
216c0 69 7a 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72  ize);.      char
216d0 20 2a 70 44 61 74 61 32 3b 0a 20 20 0a 20 20 20   *pData2;.  .   
216e0 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
216f0 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
21700 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51  no, 7, return SQ
21710 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
21720 61 32 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  a2);.      PAGER
21730 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55  TRACE(("STMT-JOU
21740 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
21750 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
21760 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  er), pPg->pgno))
21770 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
21780 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
21790 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70  >sjfd, offset, p
217a0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
217b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
217c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
217d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
217e0 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  e(pPager->sjfd, 
217f0 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
21800 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
21810 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +4);.      }.   
21820 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
21830 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21840 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
21850 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  c++;.    assert(
21860 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
21870 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20  int>0 );.    rc 
21880 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  = addToSavepoint
21890 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
218a0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  pPg->pgno);.  }.
218b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
218c0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
218d0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
218e0 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65   the pcache laye
218f0 72 20 77 68 65 6e 20 69 74 20 68 61 73 20 72 65  r when it has re
21900 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f  ached some.** so
21910 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e  ft memory limit.
21920 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
21930 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
21940 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a 65   to a Pager obje
21950 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20 61  ct.** (cast as a
21960 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61 67   void*). The pag
21970 65 72 20 69 73 20 61 6c 77 61 79 73 20 27 70 75  er is always 'pu
21980 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e  rgeable' (not an
21990 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61   in-memory.** da
219a0 74 61 62 61 73 65 29 2e 20 54 68 65 20 73 65 63  tabase). The sec
219b0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
219c0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
219d0 20 70 61 67 65 20 74 68 61 74 20 69 73 20 0a 2a   page that is .*
219e0 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74  * currently dirt
219f0 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75 74  y but has no out
21a00 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
21a10 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a  ces. The page.**
21a20 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f 63   is always assoc
21a30 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 50  iated with the P
21a40 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73  ager object pass
21a50 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
21a60 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  .** argument..**
21a70 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  .** The job of t
21a80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
21a90 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65 61  to make pPg clea
21aa0 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69 74 73  n by writing its
21ab0 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74   contents.** out
21ac0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
21ad0 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69 62   file, if possib
21ae0 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76  le. This may inv
21af0 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68 65  olve syncing the
21b00 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
21b10 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  . .**.** If succ
21b20 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33 50  essful, sqlite3P
21b30 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29  cacheMakeClean()
21b40 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
21b50 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51  e page and.** SQ
21b60 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
21b70 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
21b80 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
21b90 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68 65  ying to make the
21ba0 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c 20  .** page clean, 
21bb0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
21bc0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  e is returned. I
21bd0 66 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e 6f  f the page canno
21be0 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65  t be.** made cle
21bf0 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  an for some othe
21c00 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f  r reason, but no
21c10 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
21c20 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  hen SQLITE_OK.**
21c30 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20   is returned by 
21c40 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
21c50 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74 20  eClean() is not 
21c60 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
21c70 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65 73  c int pagerStres
21c80 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72  s(void *p, PgHdr
21c90 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
21ca0 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72  *pPager = (Pager
21cb0 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d   *)p;.  int rc =
21cc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
21cd0 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
21ce0 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
21cf0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
21d00 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
21d10 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f  ;..  /* The doNo
21d20 74 53 79 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20  tSyncSpill flag 
21d30 69 73 20 73 65 74 20 64 75 72 69 6e 67 20 74 69  is set during ti
21d40 6d 65 73 20 77 68 65 6e 20 64 6f 69 6e 67 20 61  mes when doing a
21d50 20 73 79 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f   sync of.  ** jo
21d60 75 72 6e 61 6c 20 28 61 6e 64 20 61 64 64 69 6e  urnal (and addin
21d70 67 20 61 20 6e 65 77 20 68 65 61 64 65 72 29 20  g a new header) 
21d80 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20  is not allowed. 
21d90 20 54 68 69 73 20 6f 63 63 75 72 73 0a 20 20 2a   This occurs.  *
21da0 2a 20 64 75 72 69 6e 67 20 63 61 6c 6c 73 20 74  * during calls t
21db0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
21dc0 69 74 65 28 29 20 77 68 69 6c 65 20 74 72 79 69  ite() while tryi
21dd0 6e 67 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75  ng to journal mu
21de0 6c 74 69 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65  ltiple.  ** page
21df0 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  s belonging to t
21e00 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a  he same sector..
21e10 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f    **.  ** The do
21e20 4e 6f 74 53 70 69 6c 6c 20 66 6c 61 67 20 69 6e  NotSpill flag in
21e30 68 69 62 69 74 73 20 61 6c 6c 20 63 61 63 68 65  hibits all cache
21e40 20 73 70 69 6c 6c 69 6e 67 20 72 65 67 61 72 64   spilling regard
21e50 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 0a  less of whether.
21e60 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 61 20 73 79    ** or not a sy
21e70 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  nc is required. 
21e80 20 54 68 69 73 20 69 73 20 73 65 74 20 64 75 72   This is set dur
21e90 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
21ea0 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69    **.  ** Spilli
21eb0 6e 67 20 69 73 20 61 6c 73 6f 20 69 6e 68 69 62  ng is also inhib
21ec0 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e 20  ited when in an 
21ed0 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 20 20 2a  error state..  *
21ee0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
21ef0 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e  errCode ) return
21f00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
21f10 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
21f20 70 69 6c 6c 20 29 20 72 65 74 75 72 6e 20 53 51  pill ) return SQ
21f30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
21f40 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
21f50 53 70 69 6c 6c 20 26 26 20 28 70 50 67 2d 3e 66  Spill && (pPg->f
21f60 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45  lags & PGHDR_NEE
21f70 44 5f 53 59 4e 43 29 21 3d 30 20 29 7b 0a 20 20  D_SYNC)!=0 ){.  
21f80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21f90 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e  OK;.  }..  pPg->
21fa0 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66  pDirty = 0;.  if
21fb0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
21fc0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ager) ){.    /* 
21fd0 57 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66  Write a single f
21fe0 72 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61  rame for this pa
21ff0 67 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a  ge to the log. *
22000 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52 65  /.    if( subjRe
22010 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
22020 29 7b 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ){ .      rc = s
22030 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
22040 67 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 69  g); .    }.    i
22050 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22060 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
22070 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50  agerWalFrames(pP
22080 61 67 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 2c  ager, pPg, 0, 0,
22090 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
220a0 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 53 79  se{.  .    /* Sy
220b0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
220c0 69 6c 65 20 69 66 20 72 65 71 75 69 72 65 64 2e  ile if required.
220d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 2d   */.    if( pPg-
220e0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
220f0 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20  D_SYNC ){.      
22100 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
22110 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 20  >noSync );.     
22120 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
22130 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
22140 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22150 4f 4b 20 26 26 20 0a 20 20 20 20 20 20 20 20 21  OK && .        !
22160 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
22170 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
22180 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 20  NALMODE_MEMORY) 
22190 26 26 0a 20 20 20 20 20 20 20 20 21 28 73 71 6c  &&.        !(sql
221a0 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
221b0 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
221c0 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
221d0 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
221e0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
221f0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
22200 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
22210 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
22220 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  r(pPager);.     
22230 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
22240 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e  /* If the page n
22250 75 6d 62 65 72 20 6f 66 20 74 68 69 73 20 70 61  umber of this pa
22260 67 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ge is larger tha
22270 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  n the current si
22280 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  ze of.    ** the
22290 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c   database image,
222a0 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20   it may need to 
222b0 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
222c0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  e sub-journal.. 
222d0 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65     ** This is be
222e0 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74  cause the call t
222f0 6f 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  o pager_write_pa
22300 67 65 6c 69 73 74 28 29 20 62 65 6c 6f 77 20 77  gelist() below w
22310 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61  ill not.    ** a
22320 63 74 75 61 6c 6c 79 20 77 72 69 74 65 20 64 61  ctually write da
22330 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 20 69  ta to the file i
22340 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
22350 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e 73 69   **.    ** Consi
22360 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
22370 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76  g sequence of ev
22380 65 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ents:.    **.   
22390 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 20   **   BEGIN;.   
223a0 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c   **     <journal
223b0 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20   page X>.    ** 
223c0 20 20 20 20 3c 6d 6f 64 69 66 79 20 70 61 67 65      <modify page
223d0 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 53   X>.    **     S
223e0 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20  AVEPOINT sp;.   
223f0 20 2a 2a 20 20 20 20 20 20 20 3c 73 68 72 69 6e   **       <shrin
22400 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  k database file 
22410 74 6f 20 59 20 70 61 67 65 73 3e 0a 20 20 20 20  to Y pages>.    
22420 2a 2a 20 20 20 20 20 20 20 70 61 67 65 72 53 74  **       pagerSt
22430 72 65 73 73 28 70 61 67 65 20 58 29 0a 20 20 20  ress(page X).   
22440 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b   **     ROLLBACK
22450 20 54 4f 20 73 70 3b 0a 20 20 20 20 2a 2a 0a 20   TO sp;.    **. 
22460 20 20 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20     ** If (X>Y), 
22470 74 68 65 6e 20 77 68 65 6e 20 70 61 67 65 72 53  then when pagerS
22480 74 72 65 73 73 20 69 73 20 63 61 6c 6c 65 64 20  tress is called 
22490 70 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20  page X will not 
224a0 62 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a  be written.    *
224b0 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  * out to the dat
224c0 61 62 61 73 65 20 66 69 6c 65 2c 20 62 75 74 20  abase file, but 
224d0 77 69 6c 6c 20 62 65 20 64 72 6f 70 70 65 64 20  will be dropped 
224e0 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 2e 20  from the cache. 
224f0 54 68 65 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c  Then,.    ** fol
22500 6c 6f 77 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c  lowing the "ROLL
22510 42 41 43 4b 20 54 4f 20 73 70 22 20 73 74 61 74  BACK TO sp" stat
22520 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67 20 70  ement, reading p
22530 61 67 65 20 58 20 77 69 6c 6c 20 72 65 61 64 0a  age X will read.
22540 20 20 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d      ** data from
22550 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22560 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65  le. This will be
22570 20 74 68 65 20 63 6f 70 79 20 6f 66 20 70 61 67   the copy of pag
22580 65 20 58 20 61 73 20 69 74 0a 20 20 20 20 2a 2a  e X as it.    **
22590 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 74 72   was when the tr
225a0 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65  ansaction starte
225b0 64 2c 20 6e 6f 74 20 61 73 20 69 74 20 77 61 73  d, not as it was
225c0 20 77 68 65 6e 20 22 53 41 56 45 50 4f 49 4e 54   when "SAVEPOINT
225d0 20 73 70 22 0a 20 20 20 20 2a 2a 20 77 61 73 20   sp".    ** was 
225e0 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2a  executed..    **
225f0 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75  .    ** The solu
22600 74 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65  tion is to write
22610 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74   the current dat
22620 61 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74  a for page X int
22630 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75  o the .    ** su
22640 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  b-journal file n
22650 6f 77 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  ow (if it is not
22660 20 61 6c 72 65 61 64 79 20 74 68 65 72 65 29 2c   already there),
22670 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c   so that it will
22680 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 73 74 6f  .    ** be resto
22690 72 65 64 20 74 6f 20 69 74 73 20 63 75 72 72 65  red to its curre
226a0 6e 74 20 76 61 6c 75 65 20 77 68 65 6e 20 74 68  nt value when th
226b0 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73  e "ROLLBACK TO s
226c0 70 22 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 78  p" is .    ** ex
226d0 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  ecuted..    */. 
226e0 20 20 20 69 66 28 20 4e 45 56 45 52 28 0a 20 20     if( NEVER(.  
226f0 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
22700 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f  _OK && pPg->pgno
22710 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  >pPager->dbSize 
22720 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  && subjRequiresP
22730 61 67 65 28 70 50 67 29 0a 20 20 20 20 29 20 29  age(pPg).    ) )
22740 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62  {.      rc = sub
22750 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
22760 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
22770 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74  * Write the cont
22780 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
22790 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
227a0 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
227b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
227c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
227d0 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
227e0 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c 20 70  gelist(pPager, p
227f0 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
22800 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
22810 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a  ge as clean. */.
22820 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22830 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52  _OK ){.    PAGER
22840 54 52 41 43 45 28 28 22 53 54 52 45 53 53 20 25  TRACE(("STRESS %
22850 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
22860 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
22870 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
22880 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
22890 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d  eClean(pPg);.  }
228a0 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  ..  return pager
228b0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
228c0 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c  c);.}.../*.** Al
228d0 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
228e0 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65  alize a new Page
228f0 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74  r object and put
22900 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
22910 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e  .** in *ppPager.
22920 20 54 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c   The pager shoul
22930 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20  d eventually be 
22940 66 72 65 65 64 20 62 79 20 70 61 73 73 69 6e 67  freed by passing
22950 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65   it.** to sqlite
22960 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a  3PagerClose()..*
22970 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61  *.** The zFilena
22980 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  me argument is t
22990 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 64  he path to the d
229a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
229b0 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c  open..** If zFil
229c0 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68  ename is NULL th
229d0 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61  en a randomly-na
229e0 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69  med temporary fi
229f0 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  le is created.**
22a00 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65   and used as the
22a10 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
22a20 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69  ed. Temporary fi
22a30 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c 65 74  les are be delet
22a40 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  ed.** automatica
22a50 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61 72  lly when they ar
22a60 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69  e closed. If zFi
22a70 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
22a80 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c  ry:" then .** al
22a90 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  l information is
22aa0 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20   held in cache. 
22ab0 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  It is never writ
22ac0 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a  ten to disk. .**
22ad0 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
22ae0 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  d to implement a
22af0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
22b00 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  base..**.** The 
22b10 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74 65 72  nExtra parameter
22b20 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6e   specifies the n
22b30 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
22b40 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  f space allocate
22b50 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20  d.** along with 
22b60 65 61 63 68 20 70 61 67 65 20 72 65 66 65 72 65  each page refere
22b70 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63 65 20  nce. This space 
22b80 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  is available to 
22b90 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20  the user.** via 
22ba0 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  the sqlite3Pager
22bb0 47 65 74 45 78 74 72 61 28 29 20 41 50 49 2e 0a  GetExtra() API..
22bc0 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
22bd0 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64  argument is used
22be0 20 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70   to specify prop
22bf0 65 72 74 69 65 73 20 74 68 61 74 20 61 66 66 65  erties that affe
22c00 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74  ct the.** operat
22c10 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72  ion of the pager
22c20 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70  . It should be p
22c30 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69  assed some bitwi
22c40 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a  se combination.*
22c50 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4f  * of the PAGER_O
22c60 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20  MIT_JOURNAL and 
22c70 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43  PAGER_NO_READLOC
22c80 4b 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54  K flags..**.** T
22c90 68 65 20 76 66 73 46 6c 61 67 73 20 70 61 72 61  he vfsFlags para
22ca0 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61  meter is a bitma
22cb0 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68  sk to pass to th
22cc0 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
22cd0 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65  r.** of the xOpe
22ce0 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  n() method of th
22cf0 65 20 73 75 70 70 6c 69 65 64 20 56 46 53 20 77  e supplied VFS w
22d00 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65  hen opening file
22d10 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  s. .**.** If the
22d20 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73   pager object is
22d30 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
22d40 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
22d50 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63  e opened .** suc
22d60 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54  cessfully, SQLIT
22d70 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
22d80 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65   and *ppPager se
22d90 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a  t to point to.**
22da0 20 74 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f   the new pager o
22db0 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72  bject. If an err
22dc0 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61  or occurs, *ppPa
22dd0 67 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55  ger is set to NU
22de0 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  LL.** and error 
22df0 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54  code returned. T
22e00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
22e10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
22e20 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33  OMEM.** (sqlite3
22e30 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64  Malloc() is used
22e40 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
22e50 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e  ory), SQLITE_CAN
22e60 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72  TOPEN or .** var
22e70 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58  ious SQLITE_IO_X
22e80 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e  XX errors..*/.in
22e90 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
22ea0 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
22eb0 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f  s *pVfs,       /
22ec0 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69  * The virtual fi
22ed0 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65  le system to use
22ee0 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70   */.  Pager **pp
22ef0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f  Pager,         /
22f00 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68  * OUT: Return th
22f10 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
22f20 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
22f30 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
22f40 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e,   /* Name of 
22f50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22f60 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
22f70 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20  nt nExtra,      
22f80 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
22f90 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f   bytes append to
22fa0 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
22fb0 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  page */.  int fl
22fc0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
22fd0 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74     /* flags cont
22fe0 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c  rolling this fil
22ff0 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
23000 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
23010 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  /* flags passed 
23020 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74  through to sqlit
23030 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
23040 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  /.  void (*xRein
23050 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20  it)(DbPage*) /* 
23060 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e  Function to rein
23070 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a  itialize pages *
23080 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b  /.){.  u8 *pPtr;
23090 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
230a0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50   = 0;       /* P
230b0 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61  ager object to a
230c0 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75  llocate and retu
230d0 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  rn */.  int rc =
230e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
230f0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
23100 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c  */.  int tempFil
23110 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  e = 0;        /*
23120 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66   True for temp f
23130 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d  iles (incl. in-m
23140 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a  emory files) */.
23150 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b    int memDb = 0;
23160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
23170 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  ue if this is an
23180 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20   in-memory file 
23190 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c  */.  int readOnl
231a0 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  y = 0;        /*
231b0 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
231c0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c   a read-only fil
231d0 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e  e */.  int journ
231e0 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20  alFileSize;     
231f0 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f  /* Bytes to allo
23200 63 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f  cate for each jo
23210 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68  urnal fd */.  ch
23220 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20  ar *zPathname = 
23230 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70  0;     /* Full p
23240 61 74 68 20 74 6f 20 64 61 74 61 62 61 73 65 20  ath to database 
23250 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
23260 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20  athname = 0;    
23270 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
23280 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61  bytes in zPathna
23290 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a  me */.  int useJ
232a0 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20  ournal = (flags 
232b0 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55  & PAGER_OMIT_JOU
232c0 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c  RNAL)==0; /* Fal
232d0 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e  se to omit journ
232e0 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52 65  al */.  int noRe
232f0 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20  adlock = (flags 
23300 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c  & PAGER_NO_READL
23310 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a 20 54 72 75  OCK)!=0;  /* Tru
23320 65 20 74 6f 20 6f 6d 69 74 20 72 65 61 64 2d 6c  e to omit read-l
23330 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61  ock */.  int pca
23340 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  cheSize = sqlite
23350 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20  3PcacheSize();  
23360 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f       /* Bytes to
23370 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43   allocate for PC
23380 61 63 68 65 20 2a 2f 0a 20 20 75 31 36 20 73 7a  ache */.  u16 sz
23390 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54  PageDflt = SQLIT
233a0 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
233b0 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74  IZE;  /* Default
233c0 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20   page size */.. 
233d0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
233e0 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73  ow much space is
233f0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61   required for ea
23400 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d  ch journal file-
23410 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65  handle.  ** (the
23420 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68  re are two of th
23430 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  em, the main jou
23440 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62  rnal and the sub
23450 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a  -journal). This.
23460 20 20 2a 2a 20 69 73 20 74 68 65 20 6d 61 78 69    ** is the maxi
23470 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75 69 72  mum space requir
23480 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ed for an in-mem
23490 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
234a0 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e   handle .  ** an
234b0 64 20 61 20 72 65 67 75 6c 61 72 20 6a 6f 75 72  d a regular jour
234c0 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e  nal file-handle.
234d0 20 4e 6f 74 65 20 74 68 61 74 20 61 20 22 72 65   Note that a "re
234e0 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61  gular journal-ha
234f0 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62  ndle".  ** may b
23500 65 20 61 20 77 72 61 70 70 65 72 20 63 61 70 61  e a wrapper capa
23510 62 6c 65 20 6f 66 20 63 61 63 68 69 6e 67 20 74  ble of caching t
23520 68 65 20 66 69 72 73 74 20 70 6f 72 74 69 6f 6e  he first portion
23530 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
23540 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d    ** file in mem
23550 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ory to implement
23560 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
23570 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28  e optimization (
23580 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65  see .  ** source
23590 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29   file journal.c)
235a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
235b0 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  ite3JournalSize(
235c0 70 56 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d  pVfs)>sqlite3Mem
235d0 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b  JournalSize() ){
235e0 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
235f0 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71  Size = ROUND8(sq
23600 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65  lite3JournalSize
23610 28 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65  (pVfs));.  }else
23620 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  {.    journalFil
23630 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73  eSize = ROUND8(s
23640 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
23650 53 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20  Size());.  }..  
23660 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75  /* Set the outpu
23670 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55  t variable to NU
23680 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72  LL in case an er
23690 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20  ror occurs. */. 
236a0 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a   *ppPager = 0;..
236b0 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64    /* Compute and
236c0 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20   store the full 
236d0 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61  pathname in an a
236e0 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20  llocated buffer 
236f0 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20  pointed.  ** to 
23700 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65  by zPathname, le
23710 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20  ngth nPathname. 
23720 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61  Or, if this is a
23730 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c   temporary file,
23740 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68  .  ** leave both
23750 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a   nPathname and z
23760 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20  Pathname set to 
23770 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  0..  */.  if( zF
23780 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
23790 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e  name[0] ){.    n
237a0 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d  Pathname = pVfs-
237b0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20  >mxPathname+1;. 
237c0 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73     zPathname = s
237d0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61  qlite3Malloc(nPa
237e0 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69  thname*2);.    i
237f0 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20  f( zPathname==0 
23800 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
23810 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
23820 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
23830 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
23840 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
23850 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f  zFilename,":memo
23860 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ry:")==0 ){.    
23870 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20    memDb = 1;.   
23880 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20     zPathname[0] 
23890 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  = 0;.    }else.#
238a0 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20  endif.    {.    
238b0 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
238c0 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65   0; /* Make sure
238d0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65   initialized eve
238e0 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d  n if FullPathnam
238f0 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  e() fails */.   
23900 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
23910 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
23920 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  fs, zFilename, n
23930 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e  Pathname, zPathn
23940 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ame);.    }..   
23950 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   nPathname = sql
23960 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
23970 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  thname);.    if(
23980 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
23990 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56  & nPathname+8>pV
239a0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29  fs->mxPathname )
239b0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
239c0 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
239d0 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
239e0 20 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62   path required b
239f0 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  y.      ** the d
23a00 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70  atabase being op
23a10 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72  ened will be mor
23a20 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50  e than pVfs->mxP
23a30 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a  athname.      **
23a40 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68   bytes in length
23a50 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65  . This means the
23a60 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74   database cannot
23a70 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20   be opened,.    
23a80 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20    ** as it will 
23a90 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  not be possible 
23aa0 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  to open the jour
23ab0 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e  nal file or even
23ac0 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20  .      ** check 
23ad0 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
23ae0 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67  l before reading
23af0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
23b00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
23b10 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
23b20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
23b30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23b40 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
23b50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
23b60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
23b70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
23b80 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  ate memory for t
23b90 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
23ba0 72 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63  re, PCache objec
23bb0 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65  t, the.  ** thre
23bc0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
23bd0 72 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  rs, the database
23be0 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74   file name and t
23bf0 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  he journal .  **
23c00 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20   file name. The 
23c10 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79  layout in memory
23c20 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
23c30 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61    **.  **     Pa
23c40 67 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20  ger object      
23c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
23c60 69 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79 74  izeof(Pager) byt
23c70 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61  es).  **     PCa
23c80 63 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20  che object      
23c90 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
23ca0 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28  lite3PcacheSize(
23cb0 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
23cc0 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20    Database file 
23cd0 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20  handle          
23ce0 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c    (pVfs->szOsFil
23cf0 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
23d00 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69    Sub-journal fi
23d10 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
23d20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69    (journalFileSi
23d30 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  ze bytes).  **  
23d40 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20     Main journal 
23d50 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
23d60 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53     (journalFileS
23d70 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  ize bytes).  ** 
23d80 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c      Database fil
23d90 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
23da0 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31      (nPathname+1
23db0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
23dc0 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   Journal file na
23dd0 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
23de0 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20   (nPathname+8+1 
23df0 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50  bytes).  */.  pP
23e00 74 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  tr = (u8 *)sqlit
23e10 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20  e3MallocZero(.  
23e20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28    ROUND8(sizeof(
23e30 2a 70 50 61 67 65 72 29 29 20 2b 20 20 20 20 20  *pPager)) +     
23e40 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74   /* Pager struct
23e50 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44  ure */.    ROUND
23e60 38 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20  8(pcacheSize) + 
23e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61            /* PCa
23e80 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  che object */.  
23e90 20 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73    ROUND8(pVfs->s
23ea0 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20  zOsFile) +      
23eb0 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20   /* The main db 
23ec0 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72  file */.    jour
23ed0 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20  nalFileSize * 2 
23ee0 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  +          /* Th
23ef0 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69  e two journal fi
23f00 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74  les */ .    nPat
23f10 68 6e 61 6d 65 20 2b 20 31 20 2b 20 20 20 20 20  hname + 1 +     
23f20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
23f30 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e  ilename */.    n
23f40 50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 31  Pathname + 8 + 1
23f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23f60 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66   zJournal */.#if
23f70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23f80 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68  _WAL.    + nPath
23f90 6e 61 6d 65 20 2b 20 34 20 2b 20 31 20 20 20 20  name + 4 + 1    
23fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 57 61            /* zWa
23fb0 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b  l */.#endif.  );
23fc0 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
23fd0 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
23fe0 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
23ff0 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  R(journalFileSiz
24000 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50  e)) );.  if( !pP
24010 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  tr ){.    sqlite
24020 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65  3_free(zPathname
24030 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
24040 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
24050 20 20 70 50 61 67 65 72 20 3d 20 20 20 20 20 20    pPager =      
24060 20 20 20 20 20 20 20 20 28 50 61 67 65 72 2a 29          (Pager*)
24070 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72  (pPtr);.  pPager
24080 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20 28  ->pPCache =    (
24090 50 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d  PCache*)(pPtr +=
240a0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a   ROUND8(sizeof(*
240b0 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61  pPager)));.  pPa
240c0 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c  ger->fd =   (sql
240d0 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
240e0 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68   += ROUND8(pcach
240f0 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65  eSize));.  pPage
24100 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74  r->sjfd = (sqlit
24110 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
24120 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73  = ROUND8(pVfs->s
24130 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61  zOsFile));.  pPa
24140 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c  ger->jfd =  (sql
24150 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
24160 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53   += journalFileS
24170 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ize);.  pPager->
24180 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28  zFilename =    (
24190 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a  char*)(pPtr += j
241a0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b  ournalFileSize);
241b0 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
241c0 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
241d0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
241e0 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
241f0 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d  e Pager.zFilenam
24200 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75  e and Pager.zJou
24210 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66  rnal buffers, if
24220 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
24230 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b  if( zPathname ){
24240 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  .    pPager->zJo
24250 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a  urnal =   (char*
24260 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e  )(pPtr += nPathn
24270 61 6d 65 20 2b 20 31 29 3b 0a 20 20 20 20 6d 65  ame + 1);.    me
24280 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69  mcpy(pPager->zFi
24290 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  lename, zPathnam
242a0 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, nPathname);. 
242b0 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
242c0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74  ->zJournal, zPat
242d0 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
242e0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
242f0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
24300 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f  nPathname], "-jo
24310 75 72 6e 61 6c 22 2c 20 38 29 3b 0a 20 20 20 20  urnal", 8);.    
24320 69 66 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  if( pPager->zFil
24330 65 6e 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 0a 20  ename[0]==0 ){. 
24340 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f       pPager->zJo
24350 75 72 6e 61 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20  urnal[0] = 0;.  
24360 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
24370 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
24380 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67  else{.      pPag
24390 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67  er->zWal = &pPag
243a0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
243b0 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20  thname+8+1];.   
243c0 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
243d0 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d  ->zWal, zPathnam
243e0 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, nPathname);. 
243f0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
24400 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e  ger->zWal[nPathn
24410 61 6d 65 5d 2c 20 22 2d 77 61 6c 22 2c 20 34 29  ame], "-wal", 4)
24420 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
24430 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
24440 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zPathname);.  }.
24450 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d    pPager->pVfs =
24460 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d   pVfs;.  pPager-
24470 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46  >vfsFlags = vfsF
24480 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  lags;..  /* Open
24490 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
244a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
244b0 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
244c0 6d 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20  me[0] && !memDb 
244d0 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20  ){.    int fout 
244e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
244f0 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66          /* VFS f
24500 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79  lags returned by
24510 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20   xOpen() */.    
24520 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
24530 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
24540 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
24550 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73  er->fd, vfsFlags
24560 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 72 65  , &fout);.    re
24570 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53  adOnly = (fout&S
24580 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
24590 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  NLY);..    /* If
245a0 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75   the file was su
245b0 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
245c0 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  d for read/write
245d0 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20   access,.    ** 
245e0 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74  choose a default
245f0 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61   page size in ca
24600 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72  se we have to cr
24610 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  eate the.    ** 
24620 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
24630 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
24640 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69  size is the maxi
24650 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  mum of:.    **. 
24660 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54     **    + SQLIT
24670 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
24680 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b  IZE,.    **    +
24690 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
246a0 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
246b0 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
246c0 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72   **    + The lar
246d0 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74  gest page size t
246e0 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74  hat can be writt
246f0 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  en atomically.. 
24700 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
24710 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
24720 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
24730 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
24740 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
24750 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46  ssert(SQLITE_DEF
24760 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
24770 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
24780 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  LT_PAGE_SIZE);. 
24790 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44       if( szPageD
247a0 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74  flt<pPager->sect
247b0 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  orSize ){.      
247c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
247d0 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f  ctorSize>SQLITE_
247e0 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
247f0 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
24800 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
24810 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
24820 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  LT_PAGE_SIZE;.  
24830 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
24840 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
24850 74 20 3d 20 28 75 31 36 29 70 50 61 67 65 72 2d  t = (u16)pPager-
24860 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
24870 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
24880 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
24890 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
248a0 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
248b0 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
248c0 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
248d0 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
248e0 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69  ->fd);.        i
248f0 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61  nt ii;.        a
24900 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
24910 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
24920 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  12>>8));.       
24930 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
24940 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
24950 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
24960 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
24970 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
24980 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29  AGE_SIZE<=65536)
24990 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69  ;.        for(ii
249a0 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c  =szPageDflt; ii<
249b0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  =SQLITE_MAX_DEFA
249c0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69  ULT_PAGE_SIZE; i
249d0 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20  i=ii*2){.       
249e0 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49     if( iDc&(SQLI
249f0 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c  TE_IOCAP_ATOMIC|
24a00 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20  (ii>>8)) ){.    
24a10 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
24a20 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20  lt = ii;.       
24a30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
24a40 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
24a50 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
24a60 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61   /* If a tempora
24a70 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65  ry file is reque
24a80 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20  sted, it is not 
24a90 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  opened immediate
24aa0 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  ly..    ** In th
24ab0 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70  is case we accep
24ac0 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  t the default pa
24ad0 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61  ge size and dela
24ae0 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a  y actually.    *
24af0 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69  * opening the fi
24b00 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  le until the fir
24b10 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69  st call to OsWri
24b20 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  te()..    **.   
24b30 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   ** This branch 
24b40 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20  is also run for 
24b50 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
24b60 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d  abase. An in-mem
24b70 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  ory.    ** datab
24b80 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ase is the same 
24b90 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74  as a temp-file t
24ba0 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69  hat is never wri
24bb0 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20  tten out to.    
24bc0 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73  ** disk and uses
24bd0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f   an in-memory ro
24be0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
24bf0 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70      */ .    temp
24c00 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  File = 1;.    pP
24c10 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
24c20 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
24c30 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76     readOnly = (v
24c40 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
24c50 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20  PEN_READONLY);. 
24c60 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
24c70 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50  lowing call to P
24c80 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
24c90 29 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20  ) serves to set 
24ca0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20  the value of .  
24cb0 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  ** Pager.pageSiz
24cc0 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74  e and to allocat
24cd0 65 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70  e the Pager.pTmp
24ce0 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20  Space buffer..  
24cf0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
24d00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
24d10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65  sert( pPager->me
24d20 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  mDb==0 );.    rc
24d30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
24d40 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
24d50 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20  r, &szPageDflt, 
24d60 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  -1);.    testcas
24d70 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
24d80 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   );.  }..  /* If
24d90 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
24da0 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20  ed in either of 
24db0 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65  the blocks above
24dc0 2c 20 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a  , free the .  **
24dd0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
24de0 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66   and close the f
24df0 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
24e00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
24e10 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
24e20 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
24e30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
24e40 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
24e50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
24e60 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ree(pPager);.   
24e70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
24e80 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
24e90 20 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65   the PCache obje
24ea0 63 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ct. */.  assert(
24eb0 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a   nExtra<1000 );.
24ec0 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44    nExtra = ROUND
24ed0 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c  8(nExtra);.  sql
24ee0 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73  ite3PcacheOpen(s
24ef0 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72  zPageDflt, nExtr
24f00 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20  a, !memDb,.     
24f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
24f20 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73  memDb?pagerStres
24f30 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61  s:0, (void *)pPa
24f40 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43  ger, pPager->pPC
24f50 61 63 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54  ache);..  PAGERT
24f60 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25  RACE(("OPEN %d %
24f70 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45  s\n", FILEHANDLE
24f80 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20  ID(pPager->fd), 
24f90 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
24fa0 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  e));.  IOTRACE((
24fb0 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20  "OPEN %p %s\n", 
24fc0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
24fd0 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70  zFilename))..  p
24fe0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
24ff0 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e  l = (u8)useJourn
25000 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  al;.  pPager->no
25010 52 65 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65  Readlock = (noRe
25020 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e  adlock && readOn
25030 6c 79 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70  ly) ?1:0;.  /* p
25040 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
25050 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
25060 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
25070 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
25080 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f  er->nRef = 0; */
25090 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
250a0 65 56 61 6c 69 64 20 3d 20 28 75 38 29 6d 65 6d  eValid = (u8)mem
250b0 44 62 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  Db;.  /* pPager-
250c0 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a  >stmtSize = 0; *
250d0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
250e0 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  tmtJSize = 0; */
250f0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50  .  /* pPager->nP
25100 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  age = 0; */.  pP
25110 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53  ager->mxPgno = S
25120 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43  QLITE_MAX_PAGE_C
25130 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65  OUNT;.  /* pPage
25140 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
25150 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73  _UNLOCK; */.  as
25160 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
25170 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65  ate == (tempFile
25180 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   ? PAGER_EXCLUSI
25190 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43  VE : PAGER_UNLOC
251a0 4b 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65  K) );.  /* pPage
251b0 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20  r->errMask = 0; 
251c0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d  */.  pPager->tem
251d0 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70  pFile = (u8)temp
251e0 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20  File;.  assert( 
251f0 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
25200 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
25210 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  AL .          ||
25220 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
25230 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
25240 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
25250 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
25260 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d  GMODE_EXCLUSIVE=
25270 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =1 );.  pPager->
25280 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
25290 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20  (u8)tempFile; . 
252a0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
252b0 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
252c0 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
252d0 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28  Pager->memDb = (
252e0 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67  u8)memDb;.  pPag
252f0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28  er->readOnly = (
25300 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f  u8)readOnly;.  /
25310 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  * pPager->needSy
25320 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 61 73 73  nc = 0; */.  ass
25330 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20  ert( useJournal 
25340 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
25350 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ile );.  pPager-
25360 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72  >noSync = pPager
25370 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
25380 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
25390 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
253a0 3f 30 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ?0:1;.  pPager->
253b0 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c  sync_flags = SQL
253c0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
253d0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
253e0 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  irst = 0; */.  /
253f0 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
25400 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20  Synced = 0; */. 
25410 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73   /* pPager->pLas
25420 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  t = 0; */.  pPag
25430 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31  er->nExtra = (u1
25440 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67  6)nExtra;.  pPag
25450 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
25460 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45  imit = SQLITE_DE
25470 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49  FAULT_JOURNAL_SI
25480 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65  ZE_LIMIT;.  asse
25490 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
254a0 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69  r->fd) || tempFi
254b0 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f  le );.  setSecto
254c0 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
254d0 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c   if( !useJournal
254e0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
254f0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
25500 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
25510 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  OFF;.  }else if(
25520 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50   memDb ){.    pP
25530 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
25540 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
25550 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20  LMODE_MEMORY;.  
25560 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78  }.  /* pPager->x
25570 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b  BusyHandler = 0;
25580 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
25590 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
255a0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
255b0 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78  r->xReiniter = x
255c0 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d  Reinit;.  /* mem
255d0 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73  set(pPager->aHas
255e0 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  h, 0, sizeof(pPa
255f0 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f  ger->aHash)); */
25600 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70  ..  *ppPager = p
25610 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  Pager;.  return 
25620 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a  SQLITE_OK;.}....
25630 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
25640 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ion is called af
25650 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e  ter transitionin
25660 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c  g from PAGER_UNL
25670 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f  OCK to.** PAGER_
25680 53 48 41 52 45 44 20 73 74 61 74 65 2e 20 49 74  SHARED state. It
25690 20 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20   tests if there 
256a0 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  is a hot journal
256b0 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74   present in.** t
256c0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  he file-system f
256d0 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
256e0 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61  er. A hot journa
256f0 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a  l is one that .*
25700 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  * needs to be pl
25710 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72  ayed back. Accor
25720 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e  ding to this fun
25730 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75  ction, a hot-jou
25740 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69  rnal.** file exi
25750 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  sts if the follo
25760 77 69 6e 67 20 63 72 69 74 65 72 69 61 20 61 72  wing criteria ar
25770 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  e met:.**.**   *
25780 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
25790 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  e exists in the 
257a0 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64  file system, and
257b0 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65  .**   * No proce
257c0 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52  ss holds a RESER
257d0 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  VED or greater l
257e0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
257f0 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a  ase file, and.**
25800 20 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73     * The databas
25810 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73  e file itself is
25820 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20   greater than 0 
25830 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61  bytes in size, a
25840 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69  nd.**   * The fi
25850 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
25860 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
25870 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30  sts and is not 0
25880 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  x00..**.** If th
25890 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
258a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
258b0 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a  ile is 0 but a j
258c0 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65  ournal file.** e
258d0 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70  xists, that is p
258e0 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a  robably an old j
258f0 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72  ournal left over
25900 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a   from a prior.**
25910 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
25920 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e  he same name. In
25930 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
25940 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a  ournal file is.*
25950 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75  * just deleted u
25960 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a  sing OsDelete, *
25970 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74  pExists is set t
25980 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  o 0 and SQLITE_O
25990 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
259a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
259b0 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68  tine does not ch
259c0 65 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20  eck if there is 
259d0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
259e0 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20   filename.** at 
259f0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
25a00 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
25a10 2c 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65  , and that maste
25a20 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  r journal file.*
25a30 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  * does not exist
25a40 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
25a50 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72  al file is not r
25a60 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68  eally hot. In th
25a70 69 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20  is.** case this 
25a80 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
25a90 75 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69  urn a false-posi
25aa0 74 69 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f  tive. The pager_
25ab0 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f  playback().** ro
25ac0 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f  utine will disco
25ad0 76 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ver that the jou
25ae0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
25af0 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20   really hot and 
25b00 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c  .** will not rol
25b10 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a  l it back. .**.*
25b20 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  * If a hot-journ
25b30 61 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64  al file is found
25b40 20 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69   to exist, *pExi
25b50 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 31 20  sts is set to 1 
25b60 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  and .** SQLITE_O
25b70 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e  K returned. If n
25b80 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  o hot-journal fi
25b90 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a  le is present, *
25ba0 70 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65  pExists is.** se
25bb0 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
25bc0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
25bd0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
25be0 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
25bf0 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e  g.** to determin
25c00 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
25c10 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
25c20 69 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65 20  ile exists, the 
25c30 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  IO error.** code
25c40 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
25c50 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70   the value of *p
25c60 45 78 69 73 74 73 20 69 73 20 75 6e 64 65 66 69  Exists is undefi
25c70 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
25c80 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c  nt hasHotJournal
25c90 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
25ca0 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20  int *pExists){. 
25cb0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
25cc0 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
25cd0 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
25ce0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
25cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
25d00 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
25d10 74 20 65 78 69 73 74 73 20 3d 20 31 3b 20 20 20  t exists = 1;   
25d20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25d30 72 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c  rue if a journal
25d40 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74   file is present
25d50 20 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70   */.  int jrnlOp
25d60 65 6e 20 3d 20 21 21 69 73 4f 70 65 6e 28 70 50  en = !!isOpen(pP
25d70 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61  ager->jfd);..  a
25d80 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
25d90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
25da0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
25db0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
25dc0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
25dd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
25de0 61 67 65 72 2d 3e 73 74 61 74 65 20 3c 3d 20 50  ager->state <= P
25df0 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
25e00 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65   assert( jrnlOpe
25e10 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65  n==0 || ( sqlite
25e20 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
25e30 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
25e40 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49  >jfd) &.    SQLI
25e50 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54  TE_IOCAP_UNDELET
25e60 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20  ABLE_WHEN_OPEN. 
25e70 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73   ));..  *pExists
25e80 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e   = 0;.  if( !jrn
25e90 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  lOpen ){.    rc 
25ea0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
25eb0 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  s(pVfs, pPager->
25ec0 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
25ed0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
25ee0 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20  &exists);.  }.  
25ef0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25f00 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20  K && exists ){. 
25f10 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 3b 20 20     int locked;  
25f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25f30 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70  * True if some p
25f40 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52  rocess holds a R
25f50 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a  ESERVED lock */.
25f60 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e  .    /* Race con
25f70 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e  dition here:  An
25f80 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69  other process mi
25f90 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f  ght have been ho
25fa0 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  lding the.    **
25fb0 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
25fc0 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f  ck and have a jo
25fd0 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68  urnal open at th
25fe0 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  e sqlite3OsAcces
25ff0 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  s() .    ** call
26000 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e   above, but then
26010 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
26020 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65  nal and drop the
26030 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20   lock before.   
26040 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68   ** we get to th
26050 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69  e following sqli
26060 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
26070 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20  edLock() call.  
26080 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69  If that.    ** i
26090 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 69 73  s the case, this
260a0 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74   routine might t
260b0 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20  hink there is a 
260c0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  hot journal when
260d0 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20  .    ** in fact 
260e0 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20  there is none.  
260f0 54 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20  This results in 
26100 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
26110 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20   which will.    
26120 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68  ** be dealt with
26130 20 62 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b   by the playback
26140 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65   routine.  Ticke
26150 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a  t #3883..    */.
26160 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26170 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
26180 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
26190 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66  &locked);.    if
261a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
261b0 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20  && !locked ){.  
261c0 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a      int nPage;..
261d0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
261e0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
261f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
26200 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20   it consists of 
26210 30 20 70 61 67 65 73 2c 0a 20 20 20 20 20 20 2a  0 pages,.      *
26220 2a 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68  * then delete th
26230 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
26240 53 65 65 20 74 68 65 20 68 65 61 64 65 72 20 63  See the header c
26250 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 66 6f 72  omment above for
26260 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72   .      ** the r
26270 65 61 73 6f 6e 69 6e 67 20 68 65 72 65 2e 20 20  easoning here.  
26280 44 65 6c 65 74 65 20 74 68 65 20 6f 62 73 6f 6c  Delete the obsol
26290 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
262a0 20 75 6e 64 65 72 0a 20 20 20 20 20 20 2a 2a 20   under.      ** 
262b0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
262c0 74 6f 20 61 76 6f 69 64 20 72 61 63 65 20 63 6f  to avoid race co
262d0 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20 74 6f 20  nditions and to 
262e0 61 76 6f 69 64 20 76 69 6f 6c 61 74 69 6e 67 0a  avoid violating.
262f0 20 20 20 20 20 20 2a 2a 20 5b 48 33 33 30 32 30        ** [H33020
26300 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ]..      */.    
26310 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
26320 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
26330 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
26340 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
26350 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
26360 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
26370 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
26380 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
26390 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20  loc();.         
263a0 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 4c 6f   if( sqlite3OsLo
263b0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52  ck(pPager->fd, R
263c0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53  ESERVED_LOCK)==S
263d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
263e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
263f0 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50  sDelete(pVfs, pP
26400 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
26410 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
26420 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
26430 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52  pPager->fd, SHAR
26440 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
26450 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26460 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
26470 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
26480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26490 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61     /* The journa
264a0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
264b0 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  d no other conne
264c0 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65  ction has a rese
264d0 72 76 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  rved.          *
264e0 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  * or greater loc
264f0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
26500 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63  e file. Now chec
26510 6b 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  k that there is.
26520 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20            ** at 
26530 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65  least one non-ze
26540 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65 20  ro bytes at the 
26550 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
26560 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
26570 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65       ** If there
26580 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e   is, then we con
26590 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e  sider this journ
265a0 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66  al to be hot. If
265b0 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20   not, .         
265c0 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67   ** it can be ig
265d0 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20  nored..         
265e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
265f0 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
26600 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66             int f
26610 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
26620 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
26630 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
26640 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
26650 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
26660 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
26670 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
26680 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20  >jfd, f, &f);.  
26690 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
266a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
266b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
266c0 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20       u8 first = 
266d0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
266e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
266f0 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28  d(pPager->jfd, (
26700 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31  void *)&first, 1
26710 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
26720 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
26730 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
26740 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  D ){.           
26750 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
26760 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  K;.            }
26770 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
26780 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
26790 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
267a0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
267b0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
267c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
267d0 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66     *pExists = (f
267e0 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20  irst!=0);.      
267f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
26800 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  ==SQLITE_CANTOPE
26810 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
26820 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74   /* If we cannot
26830 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   open the rollba
26840 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ck journal file 
26850 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20  in order to see 
26860 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  if.            *
26870 2a 20 69 74 73 20 68 61 73 20 61 20 7a 65 72 6f  * its has a zero
26880 20 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69   header, that mi
26890 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e  ght be due to an
268a0 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20   I/O error, or. 
268b0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
268c0 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
268d0 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74   the race condit
268e0 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62  ion described ab
268f0 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20  ove and in.     
26900 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74         ** ticket
26910 20 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20   #3883.  Either 
26920 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74  way, assume that
26930 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
26940 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  hot..           
26950 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62   ** This might b
26960 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69  e a false positi
26970 76 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69  ve.  But if it i
26980 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  s, then the.    
26990 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d          ** autom
269a0 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  atic journal pla
269b0 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65  yback and recove
269c0 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c  ry mechanism wil
269d0 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20  l deal.         
269e0 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e     ** with it un
269f0 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45  der an EXCLUSIVE
26a00 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64   lock where we d
26a10 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20  o not need to.  
26a20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72            ** wor
26a30 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20  ry so much with 
26a40 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e  race conditions.
26a50 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
26a60 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78              *pEx
26a70 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  ists = 1;.      
26a80 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26a90 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
26aa0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
26ab0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
26ac0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
26ad0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
26ae0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
26af0 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
26b00 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
26b10 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74  base file..** It
26b20 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63   is illegal to c
26b30 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
26b40 41 63 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20  Acquire() until 
26b50 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
26b60 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
26b70 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c  successfully cal
26b80 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64  led. If a shared
26b90 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79  -lock is already
26ba0 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68   held when.** th
26bb0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
26bc0 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
26bd0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
26be0 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74  following operat
26bf0 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65  ions are also pe
26c00 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20  rformed by this 
26c10 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
26c20 20 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65    1) If the page
26c30 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69  r is currently i
26c40 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73  n PAGER_UNLOCK s
26c50 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65  tate (no lock he
26c60 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68  ld.**      on th
26c70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  e database file)
26c80 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70  , then an attemp
26c90 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74  t is made to obt
26ca0 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48  ain a.**      SH
26cb0 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ARED lock on the
26cc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
26cd0 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  Immediately afte
26ce0 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20  r obtaining.**  
26cf0 20 20 20 20 74 68 65 20 53 48 41 52 45 44 20 6c      the SHARED l
26d00 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79  ock, the file-sy
26d10 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20  stem is checked 
26d20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
26d30 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68  l,.**      which
26d40 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20   is played back 
26d50 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c  if present. Foll
26d60 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f  owing any hot-jo
26d70 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72  urnal .**      r
26d80 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e  ollback, the con
26d90 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63  tents of the cac
26da0 68 65 20 61 72 65 20 76 61 6c 69 64 61 74 65 64  he are validated
26db0 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20   by checking.** 
26dc0 20 20 20 20 20 74 68 65 20 27 63 68 61 6e 67 65       the 'change
26dd0 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20  -counter' field 
26de0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
26df0 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a  file header and.
26e00 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72 64 65  **      discarde
26e10 64 20 69 66 20 74 68 65 79 20 61 72 65 20 66 6f  d if they are fo
26e20 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69  und to be invali
26e30 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66  d..**.**   2) If
26e40 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
26e50 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
26e60 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65  ve-mode, and the
26e70 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  re are currently
26e80 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73  .**      no outs
26e90 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
26ea0 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c  es to any pages,
26eb0 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65   and is in the e
26ec0 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20  rror state,.**  
26ed0 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65      then an atte
26ee0 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
26ef0 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73  lear the error s
26f00 74 61 74 65 20 62 79 20 64 69 73 63 61 72 64 69  tate by discardi
26f10 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63  ng.**      the c
26f20 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
26f30 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f  age cache and ro
26f40 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f  lling back any o
26f50 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  pen journal.**  
26f60 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
26f70 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  If the operation
26f80 20 64 65 73 63 72 69 62 65 64 20 62 79 20 28 32   described by (2
26f90 29 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 61  ) above is not a
26fa0 74 74 65 6d 70 74 65 64 2c 20 61 6e 64 20 69 66  ttempted, and if
26fb0 20 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 69 73   the.** pager is
26fc0 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
26fd0 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  te other than SQ
26fe0 4c 49 54 45 5f 46 55 4c 4c 20 77 68 65 6e 20 74  LITE_FULL when t
26ff0 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a  his is called,.*
27000 2a 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  * the error stat
27010 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
27020 72 65 74 75 72 6e 65 64 2e 20 49 74 20 69 73 20  returned. It is 
27030 70 65 72 6d 69 74 74 65 64 20 74 6f 20 72 65 61  permitted to rea
27040 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  d the.** databas
27050 65 20 77 68 65 6e 20 69 6e 20 53 51 4c 49 54 45  e when in SQLITE
27060 5f 46 55 4c 4c 20 65 72 72 6f 72 20 73 74 61 74  _FULL error stat
27070 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  e..**.** Otherwi
27080 73 65 2c 20 69 66 20 65 76 65 72 79 74 68 69 6e  se, if everythin
27090 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
270a0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
270b0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a  turned. If an.**
270c0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
270d0 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74   while locking t
270e0 68 65 20 64 61 74 61 62 61 73 65 2c 20 63 68 65  he database, che
270f0 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d  cking for a hot-
27100 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
27110 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  or rolling back 
27120 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  a journal file, 
27130 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
27140 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
27150 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
27160 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67  erSharedLock(Pag
27170 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
27180 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
27190 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
271a0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
271b0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 72 72 6f   */.  int isErro
271c0 72 52 65 73 65 74 20 3d 20 30 3b 20 20 20 20 20  rReset = 0;     
271d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
271e0 20 69 66 20 72 65 63 6f 76 65 72 69 6e 67 20 66   if recovering f
271f0 72 6f 6d 20 65 72 72 6f 72 20 73 74 61 74 65 20  rom error state 
27200 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  */..  /* This ro
27210 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
27220 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65  lled from b-tree
27230 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74   and only when t
27240 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a  here are no.  **
27250 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
27260 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
27270 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
27280 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
27290 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 69  Cache)==0 );.  i
272a0 66 28 20 4e 45 56 45 52 28 4d 45 4d 44 42 20 26  f( NEVER(MEMDB &
272b0 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
272c0 65 29 20 29 7b 20 72 65 74 75 72 6e 20 70 50 61  e) ){ return pPa
272d0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a  ger->errCode; }.
272e0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
272f0 74 61 62 61 73 65 20 69 73 20 69 6e 20 61 6e 20  tabase is in an 
27300 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77  error-state, now
27310 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 6f 20   is a chance to 
27320 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65  clear.  ** the e
27330 72 72 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68  rror. Discard th
27340 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
27350 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e  e pager-cache an
27360 64 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  d rollback.  ** 
27370 61 6e 79 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  any hot journal 
27380 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
27390 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  em..  */.  if( p
273a0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
273b0 7b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  {.    if( isOpen
273c0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c  (pPager->jfd) ||
273d0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
273e0 6c 20 29 7b 0a 20 20 20 20 20 20 69 73 45 72 72  l ){.      isErr
273f0 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a 20 20 20  orReset = 1;.   
27400 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65   }.    pPager->e
27410 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  rrCode = SQLITE_
27420 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65  OK;.    pager_re
27430 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  set(pPager);.  }
27440 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
27450 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
27460 20 20 20 72 63 20 3d 20 70 61 67 65 72 42 65 67     rc = pagerBeg
27470 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
27480 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c  n(pPager);.  }el
27490 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  se if( pPager->s
274a0 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
274b0 43 4b 20 7c 7c 20 69 73 45 72 72 6f 72 52 65 73  CK || isErrorRes
274c0 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  et ){.    sqlite
274d0 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
274e0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
274f0 73 3b 0a 20 20 20 20 69 6e 74 20 69 73 48 6f 74  s;.    int isHot
27500 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
27510 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
27520 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
27530 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
27540 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
27550 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ache)==0 );.    
27560 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65  if( pPager->noRe
27570 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  adlock ){.      
27580 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27590 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 20 20  readOnly );.    
275a0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
275b0 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
275c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
275d0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
275e0 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
275f0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
27600 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
27610 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27620 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
27630 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
27640 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  NLOCK );.       
27650 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
27660 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
27670 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27680 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
27690 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44  r->state>=SHARED
276a0 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  _LOCK );..    /*
276b0 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
276c0 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74  le exists, and t
276d0 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52  here is no RESER
276e0 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  VED lock on the.
276f0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
27700 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
27710 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
27720 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
27730 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
27740 20 20 20 20 69 66 28 20 21 69 73 45 72 72 6f 72      if( !isError
27750 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 61  Reset ){.      a
27760 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
27770 74 61 74 65 20 3c 3d 20 50 41 47 45 52 5f 53 48  tate <= PAGER_SH
27780 41 52 45 44 20 29 3b 0a 20 20 20 20 20 20 72 63  ARED );.      rc
27790 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c   = hasHotJournal
277a0 28 70 50 61 67 65 72 2c 20 26 69 73 48 6f 74 4a  (pPager, &isHotJ
277b0 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69  ournal);.      i
277c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
277d0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
277e0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
277f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
27800 73 45 72 72 6f 72 52 65 73 65 74 20 7c 7c 20 69  sErrorReset || i
27810 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sHotJournal ){. 
27820 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45       /* Get an E
27830 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
27840 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
27850 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  le. At this poin
27860 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a  t it is.      **
27870 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
27880 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
27890 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  is not obtained 
278a0 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68  on the way to th
278b0 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55  e.      ** EXCLU
278c0 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74  SIVE lock. If it
278d0 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70   were, another p
278e0 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65  rocess might ope
278f0 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  n the.      ** d
27900 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65  atabase file, de
27910 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45  tect the RESERVE
27920 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63  D lock, and conc
27930 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20  lude that the.  
27940 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
27950 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20  is safe to read 
27960 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65  while this proce
27970 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c  ss is still roll
27980 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a  ing the .      *
27990 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61  * hot-journal ba
279a0 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  ck..      ** .  
279b0 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74      ** Because t
279c0 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
279d0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
279e0 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20   not requested, 
279f0 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  any.      ** oth
27a00 65 72 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d  er process attem
27a10 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20  pting to access 
27a20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
27a30 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20  e will get to . 
27a40 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69       ** this poi
27a50 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61  nt in the code a
27a60 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69  nd fail to obtai
27a70 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53  n its own EXCLUS
27a80 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20  IVE lock .      
27a90 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
27aa0 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a  se file..      *
27ab0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  /.      if( pPag
27ac0 65 72 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55 53  er->state<EXCLUS
27ad0 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
27ae0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27af0 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
27b00 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  d, EXCLUSIVE_LOC
27b10 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  K);.        if( 
27b20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
27b30 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
27b40 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
27b50 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
27b60 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
27b70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27b80 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
27b90 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
27ba0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20  E;.      }. .   
27bb0 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a     /* Open the j
27bc0 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f  ournal for read/
27bd0 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 68  write access. Th
27be0 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e  is is because in
27bf0 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75   .      ** exclu
27c00 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
27c10 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
27c20 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70  ptor will be kep
27c30 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20  t open and.     
27c40 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65   ** possibly use
27c50 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
27c60 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e  ion later on. On
27c70 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74   some systems, t
27c80 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 73 54 72  he.      ** OsTr
27c90 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73  uncate() call us
27ca0 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ed in exclusive-
27cb0 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f  access mode also
27cc0 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
27cd0 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65 20  ** a read/write 
27ce0 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20  file handle..   
27cf0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
27d00 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
27d10 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  jfd) ){.        
27d20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20  int res;.       
27d30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
27d40 63 63 65 73 73 28 70 56 66 73 2c 70 50 61 67 65  ccess(pVfs,pPage
27d50 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49  r->zJournal,SQLI
27d60 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
27d70 2c 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20  ,&res);.        
27d80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27d90 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  K ){.          i
27da0 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
27db0 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d        int fout =
27dc0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
27dd0 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f  int f = SQLITE_O
27de0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
27df0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
27e00 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20  OURNAL;.        
27e10 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
27e20 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
27e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
27e40 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
27e50 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
27e60 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
27e70 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a  jfd, f, &fout);.
27e80 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
27e90 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
27ea0 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
27eb0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
27ec0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
27ed0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75  SQLITE_OK && fou
27ee0 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  t&SQLITE_OPEN_RE
27ef0 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  ADONLY ){.      
27f00 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
27f10 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
27f20 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T;.             
27f30 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
27f40 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
27f50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27f60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27f70 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
27f80 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  he journal does 
27f90 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20 75 73  not exist, it us
27fa0 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61 74  ually means that
27fb0 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 20 20 20   some .         
27fc0 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e     ** other conn
27fd0 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74  ection managed t
27fe0 6f 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c  o get in and rol
27ff0 6c 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65  l it back before
28000 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
28010 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
28020 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65 78   obtained the ex
28030 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f  clusive lock abo
28040 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20  ve. Or, it .    
28050 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d          ** may m
28060 65 61 6e 20 74 68 61 74 20 74 68 65 20 70 61 67  ean that the pag
28070 65 72 20 77 61 73 20 69 6e 20 74 68 65 20 65 72  er was in the er
28080 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74  ror-state when t
28090 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  his.            
280a0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  ** function was 
280b0 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65 20 6a  called and the j
280c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
280d0 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 2a 2f 0a   not exist.  */.
280e0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
280f0 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
28100 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30  action(pPager, 0
28110 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
28120 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
28130 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
28140 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28150 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
28160 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
28170 2f 2a 20 52 65 73 65 74 20 74 68 65 20 6a 6f 75  /* Reset the jou
28180 72 6e 61 6c 20 73 74 61 74 75 73 20 66 69 65 6c  rnal status fiel
28190 64 73 20 74 6f 20 69 6e 64 69 63 61 74 65 73 20  ds to indicates 
281a0 74 68 61 74 20 77 65 20 68 61 76 65 20 6e 6f 0a  that we have no.
281b0 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63        ** rollbac
281c0 6b 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 69  k journal at thi
281d0 73 20 74 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 20  s time. */.     
281e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
281f0 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
28200 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
28210 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
28220 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
28230 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  er = 0;.      pP
28240 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
28250 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20 2f 2a   = 0;. .      /*
28260 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6a   Make sure the j
28270 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
28280 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64  been synced to d
28290 69 73 6b 2e 20 2a 2f 0a 20 0a 20 20 20 20 20 20  isk. */. .      
282a0 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20  /* Playback and 
282b0 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
282c0 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61  al.  Drop the da
282d0 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20  tabase write.   
282e0 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72     ** lock and r
282f0 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61  eacquire the rea
28300 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68  d lock. Purge th
28310 65 20 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20  e cache before. 
28320 20 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20       ** playing 
28330 62 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75  back the hot-jou
28340 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20  rnal so that we 
28350 64 6f 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74  don't end up wit
28360 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e  h.      ** an in
28370 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65  consistent cache
28380 2e 20 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20  .  Sync the hot 
28390 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70  journal before p
283a0 6c 61 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  laying.      ** 
283b0 69 74 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68  it back since th
283c0 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
283d0 72 61 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20  rashed and left 
283e0 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a  the hot journal.
283f0 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c        ** probabl
28400 79 20 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69  y did not sync i
28410 74 20 61 6e 64 20 77 65 20 61 72 65 20 72 65 71  t and we are req
28420 75 69 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20  uired to always 
28430 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68  sync.      ** th
28440 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  e journal before
28450 20 70 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b   playing it back
28460 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
28470 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
28480 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
28490 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 53 79      rc = pagerSy
284a0 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  ncHotJournal(pPa
284b0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ger);.        if
284c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
284d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
284e0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
284f0 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
28500 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
28510 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28520 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
28530 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70   = pager_error(p
28540 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
28550 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
28560 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
28570 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
28580 74 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74  t( (pPager->stat
28590 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 29  e==PAGER_SHARED)
285a0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  .           || (
285b0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
285c0 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
285d0 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41  >state>PAGER_SHA
285e0 52 45 44 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  RED).      );.  
285f0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 50 61    }..    if( pPa
28600 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 7c 7c 20  ger->pBackup || 
28610 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
28620 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  ecount(pPager->p
28630 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20  PCache)>0 ){.   
28640 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64     /* The shared
28650 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62  -lock has just b
28660 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20  een acquired on 
28670 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28680 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74  e.      ** and t
28690 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79  here are already
286a0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
286b0 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76  che (from a prev
286c0 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65  ious.      ** re
286d0 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
286e0 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b  saction).  Check
286f0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64   to see if the d
28700 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
28710 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
28720 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61  ed.  If the data
28730 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64  base has changed
28740 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20  , flush the.    
28750 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20    ** cache..    
28760 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61    **.      ** Da
28770 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69  tabase changes i
28780 73 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f  s detected by lo
28790 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65  oking at 15 byte
287a0 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20  s beginning.    
287b0 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32    ** at offset 2
287c0 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  4 into the file.
287d0 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66    The first 4 of
287e0 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20   these 16 bytes 
287f0 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33  are.      ** a 3
28800 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68  2-bit counter th
28810 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  at is incremente
28820 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e  d with each chan
28830 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a  ge.  The.      *
28840 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68  * other bytes ch
28850 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69  ange randomly wi
28860 74 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61  th each file cha
28870 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a  nge when.      *
28880 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20  * a codec is in 
28890 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20  use..      ** . 
288a0 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73       ** There is
288b0 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73   a vanishingly s
288c0 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74  mall chance that
288d0 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e   a change will n
288e0 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20  ot be .      ** 
288f0 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63  detected.  The c
28900 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65  hance of an unde
28910 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73  tected change is
28920 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20   so small that. 
28930 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
28940 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20  e neglected..   
28950 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
28960 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
28970 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
28980 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  [sizeof(pPager->
28990 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20  dbFileVers)];.  
289a0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
289b0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
289c0 2c 20 26 6e 50 61 67 65 29 3b 0a 0a 20 20 20 20  , &nPage);..    
289d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
289e0 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  rCode ){.       
289f0 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
28a00 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 67  rCode;.        g
28a10 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
28a20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6e    }..      if( n
28a30 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Page>0 ){.      
28a40 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45    IOTRACE(("CKVE
28a50 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RS %p %d\n", pPa
28a60 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ger, sizeof(dbFi
28a70 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20  leVers)));.     
28a80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
28a90 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
28aa0 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73  , &dbFileVers, s
28ab0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
28ac0 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20  ), 24);.        
28ad0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28ae0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
28af0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
28b00 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
28b10 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
28b20 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c  t(dbFileVers, 0,
28b30 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
28b40 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  rs));.      }.. 
28b50 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28       if( memcmp(
28b60 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
28b70 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
28b80 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
28b90 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  s))!=0 ){.      
28ba0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
28bb0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
28bc0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
28bd0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
28be0 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
28bf0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
28c00 48 41 52 45 44 20 29 3b 0a 0a 20 20 20 20 2f 2a  HARED );..    /*
28c10 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 57   If there is a W
28c20 41 4c 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66  AL file in the f
28c30 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e  ile-system, open
28c40 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
28c50 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64  n WAL.    ** mod
28c60 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  e. Otherwise, th
28c70 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
28c80 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e  tion call is a n
28c90 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o-op..    */.   
28ca0 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57   rc = pagerOpenW
28cb0 61 6c 49 66 50 72 65 73 65 6e 74 28 70 50 61 67  alIfPresent(pPag
28cc0 65 72 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65  er);.  }.. faile
28cd0 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  d:.  if( rc!=SQL
28ce0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
28cf0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
28d00 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 65  is a no-op for e
28d10 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e  xclusive mode an
28d20 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  d in-memory data
28d30 62 61 73 65 73 2e 20 2a 2f 0a 20 20 20 20 70 61  bases. */.    pa
28d40 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
28d50 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
28d60 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
28d70 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
28d80 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68 65 64  ount has reached
28d90 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20   zero, rollback 
28da0 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 74 72  any active.** tr
28db0 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e  ansaction and un
28dc0 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a  lock the pager..
28dd0 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e  **.** Except, in
28de0 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58   locking_mode=EX
28df0 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74 68 65  CLUSIVE when the
28e00 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f  re is nothing to
28e10 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62   in.** the rollb
28e20 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  ack journal, the
28e30 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70   unlock is not p
28e40 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74 68 65  erformed and the
28e50 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67  re is.** nothing
28e60 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f   to rollback, so
28e70 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
28e80 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74   a no-op..*/ .st
28e90 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
28ea0 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61  nlockIfUnused(Pa
28eb0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
28ec0 69 66 28 20 28 73 71 6c 69 74 65 33 50 63 61 63  if( (sqlite3Pcac
28ed0 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
28ee0 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 0a  r->pPCache)==0).
28ef0 20 20 20 26 26 20 28 21 70 50 61 67 65 72 2d 3e     && (!pPager->
28f00 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
28f10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
28f20 4f 66 66 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20  Off>0) .  ){.   
28f30 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
28f40 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
28f50 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  .  }.}../*.** Ac
28f60 71 75 69 72 65 20 61 20 72 65 66 65 72 65 6e 63  quire a referenc
28f70 65 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  e to page number
28f80 20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72 20 70   pgno in pager p
28f90 50 61 67 65 72 20 28 61 20 70 61 67 65 0a 2a 2a  Pager (a page.**
28fa0 20 72 65 66 65 72 65 6e 63 65 20 68 61 73 20 74   reference has t
28fb0 79 70 65 20 44 62 50 61 67 65 2a 29 2e 20 49 66  ype DbPage*). If
28fc0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72   the requested r
28fd0 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20  eference is .** 
28fe0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74  successfully obt
28ff0 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70  ained, it is cop
29000 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61  ied to *ppPage a
29010 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
29020 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
29030 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
29040 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ge is already in
29050 20 74 68 65 20 63 61 63 68 65 2c 20 69 74 20 69   the cache, it i
29060 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20  s returned. .** 
29070 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77  Otherwise, a new
29080 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20   page object is 
29090 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f  allocated and po
290a0 70 75 6c 61 74 65 64 20 77 69 74 68 20 64 61 74  pulated with dat
290b0 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74  a.** read from t
290c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
290d0 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c  . In some cases,
290e0 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75   the pcache modu
290f0 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65  le may.** choose
29100 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65   not to allocate
29110 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65   a new page obje
29120 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65  ct and may reuse
29130 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20   an existing.** 
29140 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f  object with no o
29150 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
29160 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ences..**.** The
29170 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65   extra data appe
29180 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69  nded to a page i
29190 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c  s always initial
291a0 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68  ized to zeros th
291b0 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65  e .** first time
291c0 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65   a page is loade
291d0 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49  d into memory. I
291e0 66 20 74 68 65 20 70 61 67 65 20 72 65 71 75 65  f the page reque
291f0 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65  sted is .** alre
29200 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  ady in the cache
29210 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
29220 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ion is called, t
29230 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a  hen the extra.**
29240 20 64 61 74 61 20 69 73 20 6c 65 66 74 20 61 73   data is left as
29250 20 69 74 20 77 61 73 20 77 68 65 6e 20 74 68 65   it was when the
29260 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73   page object was
29270 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a   last used..**.*
29280 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
29290 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c  e image is small
292a0 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75  er than the requ
292b0 65 73 74 65 64 20 70 61 67 65 20 6f 72 20 69 66  ested page or if
292c0 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20   a .** non-zero 
292d0 76 61 6c 75 65 20 69 73 20 70 61 73 73 65 64 20  value is passed 
292e0 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74  as the noContent
292f0 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64 20 74   parameter and t
29300 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64  he .** requested
29310 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
29320 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74  eady stored in t
29330 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e  he cache, then n
29340 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73  o .** actual dis
29350 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49  k read occurs. I
29360 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
29370 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20  memory image of 
29380 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20  the .** page is 
29390 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
293a0 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a  ll zeros. .**.**
293b0 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73   If noContent is
293c0 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20   true, it means 
293d0 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63  that we do not c
293e0 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f  are about the co
293f0 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65  ntents.** of the
29400 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75   page. This occu
29410 72 73 20 69 6e 20 74 77 6f 20 73 65 70 65 72 61  rs in two sepera
29420 74 65 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a  te scenarios:.**
29430 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20 72 65  .**   a) When re
29440 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c 69 73  ading a free-lis
29450 74 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d  t leaf page from
29460 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 61   the database, a
29470 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68  nd.**.**   b) Wh
29480 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69  en a savepoint i
29490 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
294a0 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65 64 20  ack and we need 
294b0 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20  to load.**      
294c0 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20  a new page into 
294d0 74 68 65 20 63 61 63 68 65 20 74 6f 20 62 65 20  the cache to be 
294e0 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  filled with the 
294f0 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20  data read.**    
29500 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70    from the savep
29510 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  oint journal..**
29520 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
29530 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
29540 68 65 20 64 61 74 61 20 72 65 74 75 72 6e 65 64  he data returned
29550 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65   is zeroed inste
29560 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72  ad of.** being r
29570 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
29580 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61  abase. Additiona
29590 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f  lly, the bits co
295a0 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
295b0 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e  o pgno in Pager.
295c0 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76  pInJournal (bitv
295d0 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65  ec of pages alre
295e0 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ady written to t
295f0 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
29600 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61 67 65  le) and the Page
29610 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
29620 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20  vepoint bitvecs 
29630 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73  of any open.** s
29640 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65  avepoints are se
29650 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66  t. This means if
29660 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 64   the page is mad
29670 65 20 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e  e writable at an
29680 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68  y.** point in th
29690 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20  e future, using 
296a0 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
296b0 33 50 61 67 65 72 57 72 69 74 65 28 29 2c 20 69  3PagerWrite(), i
296c0 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77  ts contents.** w
296d0 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e  ill not be journ
296e0 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65 73  aled. This saves
296f0 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61   IO..**.** The a
29700 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74  cquisition might
29710 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61   fail for severa
29720 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61  l reasons.  In a
29730 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20  ll cases,.** an 
29740 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
29750 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
29760 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69  ed and *ppPage i
29770 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
29780 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
29790 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
297a0 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72  ().  Both this r
297b0 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75  outine and Looku
297c0 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  p() attempt.** t
297d0 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
297e0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
297f0 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20  ache first.  If 
29800 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
29810 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65  already.** in me
29820 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69  mory, this routi
29830 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20  ne goes to disk 
29840 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68  to read it in wh
29850 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a  ereas Lookup().*
29860 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30  * just returns 0
29870 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
29880 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d  acquires a read-
29890 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  lock the first t
298a0 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f  ime it.** has to
298b0 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64   go to disk, and
298c0 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79   could also play
298d0 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  back an old jour
298e0 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
298f0 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75  ..** Since Looku
29900 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74  p() never goes t
29910 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72  o disk, it never
29920 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74   has to deal wit
29930 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f  h locks.** or jo
29940 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a  urnal files..*/.
29950 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
29960 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65 72  Acquire(.  Pager
29970 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f   *pPager,      /
29980 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e  * The pager open
29990 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
299a0 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
299b0 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  pgno,          /
299c0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
299d0 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61   fetch */.  DbPa
299e0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
299f0 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  /* Write a point
29a00 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  er to the page h
29a10 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ere */.  int noC
29a20 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20  ontent       /* 
29a30 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65  Do not bother re
29a40 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72  ading content fr
29a50 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65 20  om disk if true 
29a60 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
29a70 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
29a80 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
29a90 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
29aa0 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
29ab0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 50   pPager->state>P
29ac0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a  AGER_UNLOCK );..
29ad0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b    if( pgno==0 ){
29ae0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
29af0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
29b00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
29b10 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
29b20 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72  e error state, r
29b30 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69  eturn an error i
29b40 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a  mmediately. .  *
29b50 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71  * Otherwise, req
29b60 75 65 73 74 20 74 68 65 20 70 61 67 65 20 66 72  uest the page fr
29b70 6f 6d 20 74 68 65 20 50 43 61 63 68 65 20 6c 61  om the PCache la
29b80 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  yer. */.  if( pP
29b90 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
29ba0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
29bb0 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
29bc0 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_FULL ){.    
29bd0 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
29be0 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Code;.  }else{. 
29bf0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
29c00 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
29c10 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
29c20 2c 20 31 2c 20 70 70 50 61 67 65 29 3b 0a 20 20  , 1, ppPage);.  
29c30 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
29c40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
29c50 20 45 69 74 68 65 72 20 74 68 65 20 63 61 6c 6c   Either the call
29c60 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68   to sqlite3Pcach
29c70 65 46 65 74 63 68 28 29 20 72 65 74 75 72 6e 65  eFetch() returne
29c80 64 20 61 6e 20 65 72 72 6f 72 20 6f 72 20 74 68  d an error or th
29c90 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 77  e.    ** pager w
29ca0 61 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  as already in th
29cb0 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68  e error-state wh
29cc0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
29cd0 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20   was called..   
29ce0 20 2a 2a 20 53 65 74 20 70 50 67 20 74 6f 20 30   ** Set pPg to 0
29cf0 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68 65   and jump to the
29d00 20 65 78 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c   exception handl
29d10 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67 20  er.  */.    pPg 
29d20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61  = 0;.    goto pa
29d30 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
29d40 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
29d50 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d  *ppPage)->pgno==
29d60 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  pgno );.  assert
29d70 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61  ( (*ppPage)->pPa
29d80 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 28  ger==pPager || (
29d90 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72  *ppPage)->pPager
29da0 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 2a  ==0 );..  if( (*
29db0 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 20  ppPage)->pPager 
29dc0 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b  && !noContent ){
29dd0 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
29de0 63 61 73 65 20 74 68 65 20 70 63 61 63 68 65 20  case the pcache 
29df0 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73  already contains
29e00 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   an initialized 
29e10 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74  copy of.    ** t
29e20 68 65 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20  he page. Return 
29e30 77 69 74 68 6f 75 74 20 66 75 72 74 68 65 72 20  without further 
29e40 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ado.  */.    ass
29e50 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52  ert( pgno<=PAGER
29e60 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e  _MAX_PGNO && pgn
29e70 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o!=PAGER_MJ_PGNO
29e80 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
29e90 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
29ea0 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20 20 72 65  r->nHit);.    re
29eb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29ec0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
29ed0 20 54 68 65 20 70 61 67 65 72 20 63 61 63 68 65   The pager cache
29ee0 20 68 61 73 20 63 72 65 61 74 65 64 20 61 20 6e   has created a n
29ef0 65 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e  ew page. Its con
29f00 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20  tent needs to . 
29f10 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c     ** be initial
29f20 69 7a 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 6e  ized.  */.    in
29f30 74 20 6e 4d 61 78 3b 0a 0a 20 20 20 20 50 41 47  t nMax;..    PAG
29f40 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
29f50 6e 4d 69 73 73 29 3b 0a 20 20 20 20 70 50 67 20  nMiss);.    pPg 
29f60 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20 20 20 70  = *ppPage;.    p
29f70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  Pg->pPager = pPa
29f80 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ger;..    /* The
29f90 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75   maximum page nu
29fa0 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65  mber is 2^31. Re
29fb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
29fc0 55 50 54 20 69 66 20 61 20 70 61 67 65 0a 20 20  UPT if a page.  
29fd0 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61    ** number grea
29fe0 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f  ter than this, o
29ff0 72 20 74 68 65 20 75 6e 75 73 65 64 20 6c 6f 63  r the unused loc
2a000 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73 20 72 65  king-page, is re
2a010 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20  quested. */.    
2a020 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d  if( pgno>PAGER_M
2a030 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d  AX_PGNO || pgno=
2a040 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
2a050 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
2a060 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2a070 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
2a080 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
2a090 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20  re_err;.    }.. 
2a0a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2a0b0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
2a0c0 61 67 65 72 2c 20 26 6e 4d 61 78 29 3b 0a 20 20  ager, &nMax);.  
2a0d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a0e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
2a0f0 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
2a100 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
2a110 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 6e 4d 61  if( MEMDB || nMa
2a120 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 6e  x<(int)pgno || n
2a130 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73 4f  oContent || !isO
2a140 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2a150 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  ){.      if( pgn
2a160 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  o>pPager->mxPgno
2a170 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2a180 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
2a190 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
2a1a0 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
2a1b0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2a1c0 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
2a1d0 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20       /* Failure 
2a1e0 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20  to set the bits 
2a1f0 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c  in the InJournal
2a200 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20   bit-vectors is 
2a210 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20  benign..        
2a220 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61  ** It merely mea
2a230 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 68 74  ns that we might
2a240 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77   do some extra w
2a250 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61  ork to journal a
2a260 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67   .        ** pag
2a270 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
2a280 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e  need to be journ
2a290 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c  aled.  Neverthel
2a2a0 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20  ess, be sure .  
2a2b0 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74        ** to test
2a2c0 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20   the case where 
2a2d0 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  a malloc error o
2a2e0 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
2a2f0 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20  ng to set .     
2a300 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61     ** a bit in a
2a310 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20   bit vector..   
2a320 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2a330 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
2a340 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
2a350 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50      if( pgno<=pP
2a360 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
2a370 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45   ){.          TE
2a380 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73  STONLY( rc = ) s
2a390 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
2a3a0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
2a3b0 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  al, pgno);.     
2a3c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
2a3d0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
2a3e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2a3f0 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
2a400 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70  c = ) addToSavep
2a410 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
2a420 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  er, pgno);.     
2a430 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
2a440 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
2a450 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2a460 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
2a470 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2a480 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61   memset(pPg->pDa
2a490 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  ta, 0, pPager->p
2a4a0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
2a4b0 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25  IOTRACE(("ZERO %
2a4c0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
2a4d0 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c   pgno));.    }el
2a4e0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
2a4f0 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
2a500 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20 72  Pager );.      r
2a510 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
2a520 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
2a530 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2a540 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
2a550 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
2a560 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
2a570 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
2a580 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
2a590 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
2a5a0 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
2a5b0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72  .#endif.  }..  r
2a5c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2a5d0 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  ..pager_acquire_
2a5e0 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72  err:.  assert( r
2a5f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
2a600 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
2a610 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
2a620 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  op(pPg);.  }.  p
2a630 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
2a640 65 64 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a  ed(pPager);..  *
2a650 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65  ppPage = 0;.  re
2a660 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2a670 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
2a680 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
2a690 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  y in the in-memo
2a6a0 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a  ry cache.  Do.**
2a6b0 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61   not read the pa
2a6c0 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52  ge from disk.  R
2a6d0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
2a6e0 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20  to the page,.** 
2a6f0 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65  or 0 if the page
2a700 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
2a710 2e 20 41 6c 73 6f 2c 20 72 65 74 75 72 6e 20 30  . Also, return 0
2a720 20 69 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   if the .** page
2a730 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f 55 4e  r is in PAGER_UN
2a740 4c 4f 43 4b 20 73 74 61 74 65 20 77 68 65 6e 20  LOCK state when 
2a750 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2a760 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 6f 72 20 69   called,.** or i
2a770 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
2a780 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
2a790 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
2a7a0 54 45 5f 46 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53  TE_FULL..**.** S
2a7b0 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50  ee also sqlite3P
2a7c0 61 67 65 72 47 65 74 28 29 2e 20 20 54 68 65 20  agerGet().  The 
2a7d0 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
2a7e0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
2a7f0 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61  ** and sqlite3Pa
2a800 67 65 72 47 65 74 28 29 20 69 73 20 74 68 61 74  gerGet() is that
2a810 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20   _get() will go 
2a820 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20  to the disk and 
2a830 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  read.** in the p
2a840 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20  age if the page 
2a850 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69  is not already i
2a860 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  n cache.  This r
2a870 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
2a880 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61  s NULL if the pa
2a890 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
2a8a0 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20  he or if a disk 
2a8b0 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61  I/O error .** ha
2a8c0 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e  s ever happened.
2a8d0 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69  .*/.DbPage *sqli
2a8e0 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50  te3PagerLookup(P
2a8f0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
2a900 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
2a910 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 61 73  r *pPg = 0;.  as
2a920 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
2a930 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
2a940 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  o!=0 );.  assert
2a950 28 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  ( pPager->pPCach
2a960 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
2a970 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  ( pPager->state 
2a980 3e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  > PAGER_UNLOCK )
2a990 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
2a9a0 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
2a9b0 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c  PCache, pgno, 0,
2a9c0 20 26 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e   &pPg);.  return
2a9d0 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   pPg;.}../*.** R
2a9e0 65 6c 65 61 73 65 20 61 20 70 61 67 65 20 72 65  elease a page re
2a9f0 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49  ference..**.** I
2aa00 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
2aa10 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
2aa20 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a  e page drop to z
2aa30 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ero, then the.**
2aa40 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74   page is added t
2aa50 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20  o the LRU list. 
2aa60 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65   When all refere
2aa70 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65  nces to all page
2aa80 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65  s.** are release
2aa90 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  d, a rollback oc
2aaa0 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  curs and the loc
2aab0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2aac0 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e  e is.** removed.
2aad0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2aae0 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67  PagerUnref(DbPag
2aaf0 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  e *pPg){.  if( p
2ab00 50 67 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20  Pg ){.    Pager 
2ab10 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
2ab20 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74  Pager;.    sqlit
2ab30 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28  e3PcacheRelease(
2ab40 70 50 67 29 3b 0a 20 20 20 20 70 61 67 65 72 55  pPg);.    pagerU
2ab50 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
2ab60 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ager);.  }.}../*
2ab70 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2ab80 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74  n is called at t
2ab90 68 65 20 73 74 61 72 74 20 6f 66 20 65 76 65 72  he start of ever
2aba0 79 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  y write transact
2abb0 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ion..** There mu
2abc0 73 74 20 61 6c 72 65 61 64 79 20 62 65 20 61 20  st already be a 
2abd0 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
2abe0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
2abf0 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66  e database .** f
2ac00 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ile when this ro
2ac10 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
2ac20 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  .**.** Open the 
2ac30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
2ac40 20 70 61 67 65 72 20 70 50 61 67 65 72 20 61 6e   pager pPager an
2ac50 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61  d write a journa
2ac60 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74  l header.** to t
2ac70 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20  he start of it. 
2ac80 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74  If there are act
2ac90 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20  ive savepoints, 
2aca0 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75  open the sub-jou
2acb0 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e  rnal.** as well.
2acc0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2acd0 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e  s only used when
2ace0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2acf0 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f  e is being .** o
2ad00 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61  pened to write a
2ad10 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f   rollback log fo
2ad20 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  r a transaction.
2ad30 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20   It is not used 
2ad40 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  .** when opening
2ad50 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66   a hot journal f
2ad60 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ile to roll it b
2ad70 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
2ad80 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2ad90 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28  s already open (
2ada0 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20  as it may be in 
2adb0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c  exclusive mode),
2adc0 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75  .** then this fu
2add0 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74  nction just writ
2ade0 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61  es a journal hea
2adf0 64 65 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  der to the start
2ae00 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61   of the.** alrea
2ae10 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a  dy open file. .*
2ae20 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
2ae30 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
2ae40 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62  file is opened b
2ae50 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  y this function,
2ae60 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49   the.** Pager.pI
2ae70 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20  nJournal bitvec 
2ae80 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
2ae90 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  ocated..**.** Re
2aea0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
2aeb0 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
2aec0 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65  successful. Othe
2aed0 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a  rwise, return .*
2aee0 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
2aef0 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  f the attempt to
2af00 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e   allocate Pager.
2af10 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73  pInJournal fails
2af20 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65  , or .** an IO e
2af30 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65  rror code if ope
2af40 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ning or writing 
2af50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2af60 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2af70 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e  c int pager_open
2af80 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  _journal(Pager *
2af90 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
2afa0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2afb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afc0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2afd0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  code */.  int nP
2afe0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2aff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b000 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
2b010 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2b020 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2b030 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
2b040 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a  ager->pVfs;   /*
2b050 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
2b060 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a  vfs pointer */..
2b070 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2b080 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
2b090 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73  ESERVED );.  ass
2b0a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
2b0b0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
2b0c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
2b0d0 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
2b0e0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
2b0f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2b100 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
2b110 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66  =0 );.  .  /* If
2b120 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
2b130 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69  error state, thi
2b140 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
2b150 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20  no-op.  But on. 
2b160 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61   ** the other ha
2b170 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nd, this routine
2b180 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
2b190 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   if we are alrea
2b1a0 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72  dy in.  ** an er
2b1b0 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  ror state. */.  
2b1c0 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
2b1d0 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74  ->errCode) ) ret
2b1e0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
2b1f0 6f 64 65 3b 0a 0a 20 20 74 65 73 74 63 61 73 65  ode;..  testcase
2b200 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
2b210 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 72 63  Valid==0 );.  rc
2b220 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
2b230 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
2b240 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20   &nPage);.  if( 
2b250 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2b260 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
2b270 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  rnal = sqlite3Bi
2b280 74 76 65 63 43 72 65 61 74 65 28 6e 50 61 67 65  tvecCreate(nPage
2b290 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
2b2a0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
2b2b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2b2c0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
2b2d0 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
2b2e0 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74  urnal file if it
2b2f0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
2b300 6f 70 65 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 21  open. */.  if( !
2b310 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2b320 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70  fd) ){.    if( p
2b330 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2b340 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
2b350 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
2b360 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d        sqlite3Mem
2b370 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
2b380 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65  er->jfd);.    }e
2b390 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  lse{.      const
2b3a0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20 20   int flags =    
2b3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b3c0 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20 6f  * VFS flags to o
2b3d0 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  pen journal file
2b3e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
2b3f0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
2b400 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
2b410 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 28 70  EATE|.        (p
2b420 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2b430 3f 20 0a 20 20 20 20 20 20 20 20 20 20 28 53 51  ? .          (SQ
2b440 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
2b450 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f  ONCLOSE|SQLITE_O
2b460 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
2b470 29 3a 0a 20 20 20 20 20 20 20 20 20 20 28 53 51  ):.          (SQ
2b480 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
2b490 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20 20 20 20  OURNAL).        
2b4a0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
2b4b0 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
2b4c0 52 49 54 45 0a 20 20 20 20 20 20 72 63 20 3d 20  RITE.      rc = 
2b4d0 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70  sqlite3JournalOp
2b4e0 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 70 56  en(.          pV
2b4f0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
2b500 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
2b510 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75  d, flags, jrnlBu
2b520 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
2b530 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a  .      );.#else.
2b540 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2b550 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
2b560 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
2b570 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c   pPager->jfd, fl
2b580 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  ags, 0);.#endif.
2b590 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2b5a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2b5b0 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
2b5c0 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 7d 0a 0a 0a  ->jfd) );.  }...
2b5d0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
2b5e0 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
2b5f0 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  der to the journ
2b600 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e  al file and open
2b610 20 0a 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a   .  ** the sub-j
2b620 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
2b630 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ary..  */.  if( 
2b640 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2b650 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68  .    /* TODO: Ch
2b660 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  eck if all of th
2b670 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72  ese are really r
2b680 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
2b690 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
2b6a0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
2b6b0 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ize;.    pPager-
2b6c0 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
2b6d0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
2b6e0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
2b6f0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
2b700 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
2b710 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
2b720 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74  .    pPager->set
2b730 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
2b740 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
2b750 64 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  dr = 0;.    rc =
2b760 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
2b770 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
2b780 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2b790 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
2b7a0 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
2b7b0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
2b7c0 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  l);.    pPager->
2b7d0 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
2b7e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2b7f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
2b800 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
2b810 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69  ion on the speci
2b820 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63  fied pager objec
2b830 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74  t. If a .** writ
2b840 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e-transaction ha
2b850 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  s already been o
2b860 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63  pened, this func
2b870 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
2b880 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
2b890 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73  Flag argument is
2b8a0 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71   false, then acq
2b8b0 75 69 72 65 20 61 74 20 6c 65 61 73 74 20 61 20  uire at least a 
2b8c0 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b  RESERVED.** lock
2b8d0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2b8e0 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67   file. If exFlag
2b8f0 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61   is true, then a
2b900 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a  cquire at least.
2b910 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ** an EXCLUSIVE 
2b920 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20  lock. If such a 
2b930 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
2b940 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67  held, no locking
2b950 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e   .** functions n
2b960 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a  eed be called..*
2b970 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20  *.** If this is 
2b980 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20  not a temporary 
2b990 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  or in-memory fil
2b9a0 65 20 61 6e 64 2c 20 74 68 65 20 6a 6f 75 72 6e  e and, the journ
2b9b0 61 6c 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 6f  al file is .** o
2b9c0 70 65 6e 65 64 20 69 66 20 69 74 20 68 61 73 20  pened if it has 
2b9d0 6e 6f 74 20 62 65 65 6e 20 61 6c 72 65 61 64 79  not been already
2b9e0 2e 20 46 6f 72 20 61 20 74 65 6d 70 6f 72 61 72  . For a temporar
2b9f0 79 20 66 69 6c 65 2c 20 74 68 65 20 6f 70 65 6e  y file, the open
2ba00 69 6e 67 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6a  ing .** of the j
2ba10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64  ournal file is d
2ba20 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68  eferred until th
2ba30 65 72 65 20 69 73 20 61 6e 20 61 63 74 75 61 6c  ere is an actual
2ba40 20 6e 65 65 64 20 74 6f 20 0a 2a 2a 20 77 72 69   need to .** wri
2ba50 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
2ba60 6c 2e 20 54 4f 44 4f 3a 20 57 68 79 20 68 61 6e  l. TODO: Why han
2ba70 64 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  dle temporary fi
2ba80 6c 65 73 20 64 69 66 66 65 72 65 6e 74 6c 79 3f  les differently?
2ba90 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
2baa0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
2bab0 65 6e 65 64 20 28 6f 72 20 69 66 20 69 74 20 69  ened (or if it i
2bac0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c  s already open),
2bad0 20 74 68 65 6e 20 61 0a 2a 2a 20 6a 6f 75 72 6e   then a.** journ
2bae0 61 6c 2d 68 65 61 64 65 72 20 69 73 20 77 72 69  al-header is wri
2baf0 74 74 65 6e 20 74 6f 20 74 68 65 20 73 74 61 72  tten to the star
2bb00 74 20 6f 66 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49  t of it..**.** I
2bb10 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f  f the subjInMemo
2bb20 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ry argument is n
2bb30 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e  on-zero, then an
2bb40 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70  y sub-journal op
2bb50 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ened.** within t
2bb60 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  his transaction 
2bb70 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61  will be opened a
2bb80 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  s an in-memory f
2bb90 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73  ile. This.** has
2bba0 20 6e 6f 20 65 66 66 65 63 74 20 69 66 20 74 68   no effect if th
2bbb0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  e sub-journal is
2bbc0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
2bbd0 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 77 68  (as it may be wh
2bbe0 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e  en.** running in
2bbf0 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29   exclusive mode)
2bc00 20 6f 72 20 69 66 20 74 68 65 20 74 72 61 6e 73   or if the trans
2bc10 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  action does not 
2bc20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62  require a.** sub
2bc30 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65  -journal. If the
2bc40 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72   subjInMemory ar
2bc50 67 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20  gument is zero, 
2bc60 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65  then any require
2bc70 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d.** sub-journal
2bc80 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
2bc90 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61  in-memory if pPa
2bca0 67 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  ger is an in-mem
2bcb0 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a  ory database, .*
2bcc0 2a 20 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d  * or using a tem
2bcd0 70 6f 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65  porary file othe
2bce0 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rwise..*/.int sq
2bcf0 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
2bd00 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
2bd10 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73  nt exFlag, int s
2bd20 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20  ubjInMemory){.  
2bd30 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2bd40 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  OK;.  assert( pP
2bd50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
2bd60 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 70  ER_UNLOCK );.  p
2bd70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d  Pager->subjInMem
2bd80 6f 72 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e  ory = (u8)subjIn
2bd90 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20 70  Memory;..  if( p
2bda0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
2bdb0 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  GER_SHARED ){.  
2bdc0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2bdd0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
2bde0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
2bdf0 4d 45 4d 44 42 20 26 26 20 21 70 50 61 67 65 72  MEMDB && !pPager
2be00 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20  ->tempFile );.. 
2be10 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57     if( pagerUseW
2be20 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
2be30 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
2be40 67 65 72 20 69 73 20 63 6f 6e 66 69 67 75 72 65  ger is configure
2be50 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69 6e 67  d to use locking
2be60 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 2c  _mode=exclusive,
2be70 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 2a 2a   and an.      **
2be80 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
2be90 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2bea0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68  is not already h
2beb0 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74 20 6e  eld, obtain it n
2bec0 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ow..      */.   
2bed0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
2bee0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
2bef0 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73  sqlite3WalExclus
2bf00 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e  iveMode(pPager->
2bf10 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20  pWal, -1) ){.   
2bf20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2bf30 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
2bf40 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  fd, EXCLUSIVE_LO
2bf50 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  CK);.        pPa
2bf60 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
2bf70 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 20  ER_SHARED;.     
2bf80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2bf90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2bfa0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2bfb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
2bfc0 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69  qlite3WalExclusi
2bfd0 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70  veMode(pPager->p
2bfe0 57 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  Wal, 1);.      }
2bff0 0a 0a 20 20 20 20 20 20 2f 2a 20 47 72 61 62 20  ..      /* Grab 
2c000 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
2c010 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  n the log file. 
2c020 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 75  If successful, u
2c030 70 67 72 61 64 65 20 74 6f 0a 20 20 20 20 20 20  pgrade to.      
2c040 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
2c050 44 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69  D state. Otherwi
2c060 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  se, return an er
2c070 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
2c080 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a  caller..      **
2c090 20 54 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   The busy-handle
2c0a0 72 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64  r is not invoked
2c0b0 20 69 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e   if another conn
2c0c0 65 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20  ection already. 
2c0d0 20 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68       ** holds th
2c0e0 65 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66  e write-lock. If
2c0f0 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 75   possible, the u
2c100 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20  pper layer will 
2c110 63 61 6c 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a  call it..      *
2c120 2a 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d  *.      ** WAL m
2c130 6f 64 65 20 73 65 74 73 20 50 61 67 65 72 2e 73  ode sets Pager.s
2c140 74 61 74 65 20 74 6f 20 50 41 47 45 52 5f 52 45  tate to PAGER_RE
2c150 53 45 52 56 45 44 20 77 68 65 6e 20 69 74 20 68  SERVED when it h
2c160 61 73 20 61 6e 20 6f 70 65 6e 0a 20 20 20 20 20  as an open.     
2c170 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c   ** transaction,
2c180 20 62 75 74 20 6e 65 76 65 72 20 74 6f 20 50 41   but never to PA
2c190 47 45 52 5f 45 58 43 4c 55 53 49 56 45 2e 20 54  GER_EXCLUSIVE. T
2c1a0 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
2c1b0 6e 20 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45  n .      ** PAGE
2c1c0 52 5f 45 58 43 4c 55 53 49 56 45 20 73 74 61 74  R_EXCLUSIVE stat
2c1d0 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f  e the code to ro
2c1e0 6c 6c 20 62 61 63 6b 20 73 61 76 65 70 6f 69 6e  ll back savepoin
2c1f0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 0a 20  t transactions. 
2c200 20 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 70 79       ** may copy
2c210 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73   data from the s
2c220 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20  ub-journal into 
2c230 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2c240 65 20 61 73 20 77 65 6c 6c 0a 20 20 20 20 20 20  e as well.      
2c250 2a 2a 20 61 73 20 69 6e 74 6f 20 74 68 65 20 70  ** as into the p
2c260 61 67 65 20 63 61 63 68 65 2e 20 57 68 69 63 68  age cache. Which
2c270 20 77 6f 75 6c 64 20 62 65 20 69 6e 63 6f 72 72   would be incorr
2c280 65 63 74 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e  ect in WAL mode.
2c290 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2c2a0 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42  rc = sqlite3WalB
2c2b0 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63  eginWriteTransac
2c2c0 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
2c2d0 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  l);.      if( rc
2c2e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2c2f0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
2c300 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67  bOrigSize = pPag
2c310 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
2c320 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
2c330 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56  e = PAGER_RESERV
2c340 45 44 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  ED;.        pPag
2c350 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
2c360 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   0;.      }..   
2c370 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
2c380 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
2c390 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
2c3a0 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20  _RESERVED );.   
2c3b0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
2c3c0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
2c3d0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
2c3e0 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 7d  _SHARED );.    }
2c3f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  else{.      /* O
2c400 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44  btain a RESERVED
2c410 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
2c420 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
2c430 68 65 20 65 78 46 6c 61 67 20 70 61 72 61 6d 65  he exFlag parame
2c440 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ter.      ** is 
2c450 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64  true, then immed
2c460 69 61 74 65 6c 79 20 75 70 67 72 61 64 65 20 74  iately upgrade t
2c470 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  his to an EXCLUS
2c480 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20  IVE lock. The.  
2c490 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64      ** busy-hand
2c4a0 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e  ler callback can
2c4b0 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 75 70   be used when up
2c4c0 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45  grading to the E
2c4d0 58 43 4c 55 53 49 56 45 0a 20 20 20 20 20 20 2a  XCLUSIVE.      *
2c4e0 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20  * lock, but not 
2c4f0 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74  when obtaining t
2c500 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
2c510 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2c520 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
2c530 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
2c540 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a  RESERVED_LOCK);.
2c550 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2c560 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2c570 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
2c580 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45   = PAGER_RESERVE
2c590 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  D;.        if( e
2c5a0 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  xFlag ){.       
2c5b0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
2c5c0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
2c5d0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
2c5e0 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  K);.        }.  
2c5f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2c600 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6f   /* No need to o
2c610 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
2c620 66 69 6c 65 20 61 74 20 74 68 69 73 20 74 69 6d  file at this tim
2c630 65 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 0a 20  e.  It will be. 
2c640 20 20 20 2a 2a 20 6f 70 65 6e 65 64 20 62 65 66     ** opened bef
2c650 6f 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65  ore it is writte
2c660 6e 20 74 6f 2e 20 20 49 66 20 77 65 20 64 65 66  n to.  If we def
2c670 65 72 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a  er opening the j
2c680 6f 75 72 6e 61 6c 2c 0a 20 20 20 20 2a 2a 20 77  ournal,.    ** w
2c690 65 20 6d 69 67 68 74 20 73 61 76 65 20 74 68 65  e might save the
2c6a0 20 77 6f 72 6b 20 6f 66 20 63 72 65 61 74 69 6e   work of creatin
2c6b0 67 20 61 20 66 69 6c 65 20 69 66 20 74 68 65 20  g a file if the 
2c6c0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20  transaction.    
2c6d0 2a 2a 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67  ** ends up being
2c6e0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f   a no-op..    */
2c6f0 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ..    if( rc!=SQ
2c700 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2c710 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
2c720 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a  ->dbModified );.
2c730 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20        /* Ignore 
2c740 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 74 68 61  any IO error tha
2c750 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  t occurs within 
2c760 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
2c770 63 74 69 6f 6e 28 29 2e 20 54 68 65 0a 20 20 20  ction(). The.   
2c780 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 20 6f 66     ** purpose of
2c790 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f   this call is to
2c7a0 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65 72   reset the inter
2c7b0 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
2c7c0 20 70 61 67 65 72 0a 20 20 20 20 20 20 2a 2a 20   pager.      ** 
2c7d0 73 75 62 2d 73 79 73 74 65 6d 2e 20 49 74 20 64  sub-system. It d
2c7e0 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 69 66  oesn't matter if
2c7f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   the journal-fil
2c800 65 20 69 73 20 6e 6f 74 20 70 72 6f 70 65 72 6c  e is not properl
2c810 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e 61 6c  y.      ** final
2c820 69 7a 65 64 20 61 74 20 74 68 69 73 20 70 6f 69  ized at this poi
2c830 6e 74 20 28 73 69 6e 63 65 20 69 74 20 69 73 20  nt (since it is 
2c840 6e 6f 74 20 61 20 76 61 6c 69 64 20 6a 6f 75 72  not a valid jour
2c850 6e 61 6c 20 66 69 6c 65 20 61 6e 79 77 61 79 29  nal file anyway)
2c860 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2c870 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
2c880 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30  action(pPager, 0
2c890 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
2c8a0 50 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41  PAGERTRACE(("TRA
2c8b0 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20  NSACTION %d\n", 
2c8c0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
2c8d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2c8e0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
2c8f0 73 69 6e 67 6c 65 20 64 61 74 61 20 70 61 67 65  single data page
2c900 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54   as writeable. T
2c910 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
2c920 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20  en into the .** 
2c930 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  main journal or 
2c940 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72  sub-journal as r
2c950 65 71 75 69 72 65 64 2e 20 49 66 20 74 68 65 20  equired. If the 
2c960 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
2c970 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74  into.** one of t
2c980 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65  he journals, the
2c990 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
2c9a0 69 74 20 69 73 20 73 65 74 20 69 6e 20 74 68 65  it is set in the
2c9b0 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f   .** Pager.pInJo
2c9c0 75 72 6e 61 6c 20 62 69 74 76 65 63 20 61 6e 64  urnal bitvec and
2c9d0 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
2c9e0 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
2c9f0 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61   bitvecs.** of a
2ca00 6e 79 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ny open savepoin
2ca10 74 73 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  ts as appropriat
2ca20 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2ca30 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48   pager_write(PgH
2ca40 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64  dr *pPg){.  void
2ca50 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70   *pData = pPg->p
2ca60 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a 70  Data;.  Pager *p
2ca70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
2ca80 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
2ca90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
2caa0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2cab0 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65   not called unle
2cac0 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ss a transaction
2cad0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
2cae0 6e 0a 20 20 2a 2a 20 73 74 61 72 74 65 64 2e 0a  n.  ** started..
2caf0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
2cb00 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
2cb10 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
2cb20 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
2cb30 72 20 68 61 73 20 62 65 65 6e 20 70 72 65 76 69  r has been previ
2cb40 6f 75 73 6c 79 20 64 65 74 65 63 74 65 64 2c 20  ously detected, 
2cb50 72 65 70 6f 72 74 20 74 68 65 20 73 61 6d 65 20  report the same 
2cb60 65 72 72 6f 72 0a 20 20 2a 2a 20 61 67 61 69 6e  error.  ** again
2cb70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ..  */.  if( NEV
2cb80 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
2cb90 64 65 29 20 29 20 20 72 65 74 75 72 6e 20 70 50  de) )  return pP
2cba0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a  ager->errCode;..
2cbb0 20 20 2f 2a 20 48 69 67 68 65 72 2d 6c 65 76 65    /* Higher-leve
2cbc0 6c 20 72 6f 75 74 69 6e 65 73 20 6e 65 76 65 72  l routines never
2cbd0 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
2cbe0 69 6f 6e 20 69 66 20 64 61 74 61 62 61 73 65 20  ion if database 
2cbf0 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 77 72 69 74  is not.  ** writ
2cc00 61 62 6c 65 2e 20 20 42 75 74 20 63 68 65 63 6b  able.  But check
2cc10 20 61 6e 79 77 61 79 2c 20 6a 75 73 74 20 66 6f   anyway, just fo
2cc20 72 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f  r robustness. */
2cc30 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
2cc40 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29  ger->readOnly) )
2cc50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
2cc60 45 52 4d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ERM;..  assert( 
2cc70 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74  !pPager->setMast
2cc80 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50  er );..  CHECK_P
2cc90 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
2cca0 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
2ccb0 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20   dirty.  If the 
2ccc0 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79  page has already
2ccd0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20   been written.  
2cce0 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ** to the journa
2ccf0 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65  l then we can re
2cd00 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e  turn right away.
2cd10 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50  .  */.  sqlite3P
2cd20 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
2cd30 50 67 29 3b 0a 20 20 69 66 28 20 70 61 67 65 49  Pg);.  if( pageI
2cd40 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26  nJournal(pPg) &&
2cd50 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61   !subjRequiresPa
2cd60 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 61  ge(pPg) ){.    a
2cd70 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
2cd80 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
2cd90 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64     pPager->dbMod
2cda0 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c  ified = 1;.  }el
2cdb0 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77  se{..    /* If w
2cdc0 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
2cdd0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
2cde0 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
2cdf0 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65  be.    ** writte
2ce00 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63  n to the transac
2ce10 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  tion journal or 
2ce20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a  the ckeckpoint j
2ce30 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72  ournal.    ** or
2ce40 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20   both..    **.  
2ce50 20 20 2a 2a 20 48 69 67 68 65 72 20 6c 65 76 65    ** Higher leve
2ce60 6c 20 72 6f 75 74 69 6e 65 73 20 73 68 6f 75 6c  l routines shoul
2ce70 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 73  d have already s
2ce80 74 61 72 74 65 64 20 61 20 74 72 61 6e 73 61 63  tarted a transac
2ce90 74 69 6f 6e 2c 0a 20 20 20 20 2a 2a 20 77 68 69  tion,.    ** whi
2cea0 63 68 20 6d 65 61 6e 73 20 74 68 65 79 20 68 61  ch means they ha
2ceb0 76 65 20 61 63 71 75 69 72 65 64 20 74 68 65 20  ve acquired the 
2cec0 6e 65 63 65 73 73 61 72 79 20 6c 6f 63 6b 73 20  necessary locks 
2ced0 62 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  but the rollback
2cee0 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
2cef0 6d 69 67 68 74 20 6e 6f 74 20 79 65 74 20 62 65  might not yet be
2cf00 20 6f 70 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20   open..    */.  
2cf10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2cf20 2d 3e 73 74 61 74 65 3e 3d 52 45 53 45 52 56 45  ->state>=RESERVE
2cf30 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66  D_LOCK );.    if
2cf40 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
2cf50 72 6e 61 6c 3d 3d 30 0a 20 20 20 20 20 26 26 20  rnal==0.     && 
2cf60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2cf70 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
2cf80 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
2cf90 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61 6c   && !pagerUseWal
2cfa0 28 70 50 61 67 65 72 29 0a 20 20 20 20 29 7b 0a  (pPager).    ){.
2cfb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2cfc0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2cfd0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
2cfe0 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
2cff0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
2d000 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2d010 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
2d020 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
2d030 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31  ->dbModified = 1
2d040 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20  ;.  .    /* The 
2d050 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
2d060 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61  nal now exists a
2d070 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45 53  nd we have a RES
2d080 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20  ERVED or an.    
2d090 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
2d0a0 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  k on the main da
2d0b0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72  tabase file.  Wr
2d0c0 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
2d0d0 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74  page to.    ** t
2d0e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
2d0f0 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20  ournal if it is 
2d100 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64  not there alread
2d110 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
2d120 28 20 21 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  ( !pageInJournal
2d130 28 70 50 67 29 20 26 26 20 69 73 4f 70 65 6e 28  (pPg) && isOpen(
2d140 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
2d150 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
2d160 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2d170 72 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  r) );.      if( 
2d180 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65  pPg->pgno<=pPage
2d190 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b  r->dbOrigSize ){
2d1a0 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73  .        u32 cks
2d1b0 75 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  um;.        char
2d1c0 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20 20 20   *pData2;..     
2d1d0 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20     /* We should 
2d1e0 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74  never write to t
2d1f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2d200 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20  the page that.  
2d210 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
2d220 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  s the database l
2d230 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ocks.  The follo
2d240 77 69 6e 67 20 61 73 73 65 72 74 20 76 65 72 69  wing assert veri
2d250 66 69 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  fies.        ** 
2d260 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20  that we do not. 
2d270 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
2d280 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41  t( pPg->pgno!=PA
2d290 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
2d2a0 65 72 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  er) );..        
2d2b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2d2c0 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50  journalHdr <= pP
2d2d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2d2e0 20 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45   );.        CODE
2d2f0 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
2d300 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20  , pPg->pgno, 7, 
2d310 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2d320 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20  MEM, pData2);.  
2d330 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61        cksum = pa
2d340 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
2d350 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a  , (u8*)pData2);.
2d360 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
2d370 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
2d380 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
2d390 75 72 6e 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70  urnalOff, pPg->p
2d3a0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
2d3b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2d3c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2d3d0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
2d3e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44  (pPager->jfd, pD
2d3f0 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61  ata2, pPager->pa
2d400 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
2d410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d420 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
2d430 75 72 6e 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20  urnalOff + 4);. 
2d440 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
2d450 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70  >journalOff += p
2d460 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
2d470 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  4;.        }.   
2d480 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2d490 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d4a0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
2d4b0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
2d4c0 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
2d4d0 6c 4f 66 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20  lOff, cksum);.  
2d4e0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2d4f0 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b  journalOff += 4;
2d500 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d510 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55     IOTRACE(("JOU
2d520 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c  T %p %d %lld %d\
2d530 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
2d540 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20  >pgno, .        
2d550 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
2d560 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61  >journalOff, pPa
2d570 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b  ger->pageSize));
2d580 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 5f 49  .        PAGER_I
2d590 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
2d5a0 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b  r_writej_count);
2d5b0 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
2d5c0 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE(("JOURNAL %d
2d5d0 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
2d5e0 63 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  c=%d hash(%08x)\
2d5f0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2d600 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2d610 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20  , pPg->pgno, .  
2d620 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67             ((pPg
2d630 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
2d640 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70  ED_SYNC)?1:0), p
2d650 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
2d660 67 29 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  g)));..        /
2d670 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20  * Even if an IO 
2d680 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f  or diskfull erro
2d690 72 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  r occurred while
2d6a0 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65   journalling the
2d6b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
2d6c0 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62   in the block ab
2d6d0 6f 76 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65  ove, set the nee
2d6e0 64 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20  d-sync flag for 
2d6f0 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20  the page..      
2d700 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
2d710 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
2d720 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
2d730 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69  ack, the logic i
2d740 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61  n.        ** pla
2d750 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29  yback_one_page()
2d760 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74   will think that
2d770 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20   the page needs 
2d780 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20  to be restored. 
2d790 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65         ** in the
2d7a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2d7b0 41 6e 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72  And if an IO err
2d7c0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
2d7d0 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20  doing so,.      
2d7e0 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70    ** then corrup
2d7f0 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e  tion may follow.
2d800 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2d810 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
2d820 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  >noSync ){.     
2d830 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20       pPg->flags 
2d840 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
2d850 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  NC;.          pP
2d860 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
2d870 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   1;.        }.. 
2d880 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72         /* An err
2d890 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 20  or has occurred 
2d8a0 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a  writing to the j
2d8b0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
2d8c0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61   .        ** tra
2d8d0 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
2d8e0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20   rolled back by 
2d8f0 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65 2e  the layer above.
2d900 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2d910 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2d920 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2d930 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2d940 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2d950 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b   pPager->nRec++;
2d960 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2d970 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
2d980 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nal!=0 );.      
2d990 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69    rc = sqlite3Bi
2d9a0 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
2d9b0 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
2d9c0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
2d9d0 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
2d9e0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
2d9f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
2da00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72  ==SQLITE_OK || r
2da10 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
2da20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 7c 3d  );.        rc |=
2da30 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
2da40 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
2da50 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
2da60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2da70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2da80 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
2da90 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
2daa0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2dab0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
2dac0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2dad0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
2dae0 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26  ournalStarted &&
2daf0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
2db00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
2db10 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
2db20 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20  R_NEED_SYNC;.   
2db30 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
2db40 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
2db50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50       }.        P
2db60 41 47 45 52 54 52 41 43 45 28 28 22 41 50 50 45  AGERTRACE(("APPE
2db70 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  ND %d page %d ne
2db80 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20  edSync=%d\n",.  
2db90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
2dba0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
2dbb0 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20  Pg->pgno,.      
2dbc0 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e           ((pPg->
2dbd0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
2dbe0 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20  _SYNC)?1:0)));. 
2dbf0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
2dc00 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74      /* If the st
2dc10 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
2dc20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2dc30 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69  page is not in i
2dc40 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77  t,.    ** then w
2dc50 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
2dc60 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61   page to the sta
2dc70 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
2dc80 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a   Note that.    *
2dc90 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
2dca0 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64  journal format d
2dcb0 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20  iffers from the 
2dcc0 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c  standard journal
2dcd0 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69   format.    ** i
2dce0 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20  n that it omits 
2dcf0 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e  the checksums an
2dd00 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20  d the header..  
2dd10 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62    */.    if( sub
2dd20 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
2dd30 67 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  g) ){.      rc =
2dd40 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
2dd50 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
2dd60 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
2dd70 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   database size a
2dd80 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a  nd return..  */.
2dd90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2dda0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
2ddb0 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20 70  HARED );.  if( p
2ddc0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50  Pager->dbSize<pP
2ddd0 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  g->pgno ){.    p
2dde0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
2ddf0 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20  pPg->pgno;.  }. 
2de00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2de10 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61  *.** Mark a data
2de20 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62   page as writeab
2de30 6c 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  le. This routine
2de40 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
2de50 62 65 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e  before .** makin
2de60 67 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70  g changes to a p
2de70 61 67 65 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  age. The caller 
2de80 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72  must check the r
2de90 65 74 75 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20  eturn value .** 
2dea0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
2deb0 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20   and be careful 
2dec0 6e 6f 74 20 74 6f 20 63 68 61 6e 67 65 20 61 6e  not to change an
2ded0 79 20 70 61 67 65 20 64 61 74 61 20 75 6e 6c 65  y page data unle
2dee0 73 73 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ss .** this rout
2def0 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
2df00 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TE_OK..**.** The
2df10 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
2df20 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  een this functio
2df30 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74  n and pager_writ
2df40 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73  e() is that this
2df50 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73  .** function als
2df60 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 65  o deals with the
2df70 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68   special case wh
2df80 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61  ere 2 or more pa
2df90 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20  ges.** fit on a 
2dfa0 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
2dfb0 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  or. In this case
2dfc0 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74   all co-resident
2dfd0 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68   pages.** must h
2dfe0 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
2dff0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
2e000 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75  file before retu
2e010 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
2e020 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2e030 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72   SQLITE_NOMEM or
2e040 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
2e050 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  e is returned.**
2e060 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   as appropriate.
2e070 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
2e080 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
2e090 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2e0a0 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29  DbPage *pDbPage)
2e0b0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2e0c0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72  ITE_OK;..  PgHdr
2e0d0 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b   *pPg = pDbPage;
2e0e0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2e0f0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
2e100 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53    Pgno nPagePerS
2e110 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d  ector = (pPager-
2e120 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67  >sectorSize/pPag
2e130 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  er->pageSize);..
2e140 20 20 69 66 28 20 6e 50 61 67 65 50 65 72 53 65    if( nPagePerSe
2e150 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67  ctor>1 ){.    Pg
2e160 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20  no nPageCount;  
2e170 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
2e180 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
2e190 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   in database fil
2e1a0 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67  e */.    Pgno pg
2e1b0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
2e1c0 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65     /* First page
2e1d0 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70   of the sector p
2e1e0 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e  Pg is located on
2e1f0 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61  . */.    int nPa
2e200 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ge = 0;         
2e210 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2e220 70 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61  pages starting a
2e230 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c  t pg1 to journal
2e240 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20   */.    int ii; 
2e250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e260 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2e270 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65  r */.    int nee
2e280 64 53 79 6e 63 20 3d 20 30 3b 20 20 20 20 20 20  dSync = 0;      
2e290 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
2e2a0 79 20 70 61 67 65 20 68 61 73 20 50 47 48 44 52  y page has PGHDR
2e2b0 5f 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20  _NEED_SYNC */.. 
2e2c0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f     /* Set the do
2e2d0 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 66 6c 61  NotSyncSpill fla
2e2e0 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20  g to 1. This is 
2e2f0 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f  because we canno
2e300 74 20 61 6c 6c 6f 77 0a 20 20 20 20 2a 2a 20 61  t allow.    ** a
2e310 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
2e320 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 65  to be written be
2e330 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73 20  tween the pages 
2e340 6a 6f 75 72 6e 61 6c 65 64 20 62 79 0a 20 20 20  journaled by.   
2e350 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
2e360 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
2e370 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
2e380 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2e390 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69  er->doNotSyncSpi
2e3a0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  ll==0 );.    pPa
2e3b0 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70  ger->doNotSyncSp
2e3c0 69 6c 6c 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54  ill++;..    /* T
2e3d0 68 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65  his trick assume
2e3e0 73 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20  s that both the 
2e3f0 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
2e400 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20  ctor-size are.  
2e410 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20    ** an integer 
2e420 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73  power of 2. It s
2e430 65 74 73 20 76 61 72 69 61 62 6c 65 20 70 67 31  ets variable pg1
2e440 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69   to the identifi
2e450 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  er.    ** of the
2e460 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
2e470 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73  he sector pPg is
2e480 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20   located on..   
2e490 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28   */.    pg1 = ((
2e4a0 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e  pPg->pgno-1) & ~
2e4b0 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  (nPagePerSector-
2e4c0 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 72 63  1)) + 1;..    rc
2e4d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
2e4e0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
2e4f0 20 28 69 6e 74 20 2a 29 26 6e 50 61 67 65 43 6f   (int *)&nPageCo
2e500 75 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  unt);.    if( rc
2e510 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2e520 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67       if( pPg->pg
2e530 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  no>nPageCount ){
2e540 0a 20 20 20 20 20 20 20 20 6e 50 61 67 65 20 3d  .        nPage =
2e550 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67   (pPg->pgno - pg
2e560 31 29 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  1)+1;.      }els
2e570 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65  e if( (pg1+nPage
2e580 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61  PerSector-1)>nPa
2e590 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  geCount ){.     
2e5a0 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
2e5b0 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20  Count+1-pg1;.   
2e5c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e5d0 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50    nPage = nPageP
2e5e0 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 20 20  erSector;.      
2e5f0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  }.      assert(n
2e600 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 20 20 61  Page>0);.      a
2e610 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e  ssert(pg1<=pPg->
2e620 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 61 73 73  pgno);.      ass
2e630 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e  ert((pg1+nPage)>
2e640 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
2e650 7d 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  }..    for(ii=0;
2e660 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d   ii<nPage && rc=
2e670 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b  =SQLITE_OK; ii++
2e680 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  ){.      Pgno pg
2e690 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20   = pg1+ii;.     
2e6a0 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20   PgHdr *pPage;. 
2e6b0 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67       if( pg==pPg
2e6c0 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74  ->pgno || !sqlit
2e6d0 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
2e6e0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
2e6f0 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20   pg) ){.        
2e700 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a  if( pg!=PAGER_MJ
2e710 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
2e720 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2e730 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
2e740 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61  pPager, pg, &pPa
2e750 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
2e760 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e770 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2e780 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
2e790 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
2e7a0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
2e7b0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
2e7c0 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20  _SYNC ){.       
2e7d0 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20         needSync 
2e7e0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
2e7f0 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
2e800 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20  ->needSync);.   
2e810 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e820 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
2e830 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
2e840 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2e850 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
2e860 73 65 20 69 66 28 20 28 70 50 61 67 65 20 3d 20  se if( (pPage = 
2e870 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
2e880 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a  ger, pg))!=0 ){.
2e890 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
2e8a0 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  e->flags&PGHDR_N
2e8b0 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20  EED_SYNC ){.    
2e8c0 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
2e8d0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
2e8e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
2e8f0 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
2e900 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2e910 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 47 48     /* If the PGH
2e920 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
2e930 67 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e 79  g is set for any
2e940 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70 61   of the nPage pa
2e950 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61 72  ges .    ** star
2e960 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65  ting at pg1, the
2e970 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  n it needs to be
2e980 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20   set for all of 
2e990 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20  them. Because.  
2e9a0 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20    ** writing to 
2e9b0 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61  any of these nPa
2e9c0 67 65 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d  ge pages may dam
2e9d0 61 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20  age the others, 
2e9e0 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  the.    ** journ
2e9f0 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e  al file must con
2ea00 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63 6f  tain sync()ed co
2ea10 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74  pies of all of t
2ea20 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72  hem.    ** befor
2ea30 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63 61  e any of them ca
2ea40 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74  n be written out
2ea50 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2ea60 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
2ea70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ea80 5f 4f 4b 20 26 26 20 6e 65 65 64 53 79 6e 63 20  _OK && needSync 
2ea90 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2eaa0 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
2eab0 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a  r->noSync==0 );.
2eac0 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
2ead0 69 69 3c 6e 50 61 67 65 3b 20 69 69 2b 2b 29 7b  ii<nPage; ii++){
2eae0 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a  .        PgHdr *
2eaf0 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f  pPage = pager_lo
2eb00 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 31  okup(pPager, pg1
2eb10 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  +ii);.        if
2eb20 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ( pPage ){.     
2eb30 20 20 20 20 20 70 50 61 67 65 2d 3e 66 6c 61 67       pPage->flag
2eb40 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
2eb50 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20  SYNC;.          
2eb60 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2eb70 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
2eb80 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2eb90 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
2eba0 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20  >needSync);.    
2ebb0 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
2ebc0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
2ebd0 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20 20  Spill==1 );.    
2ebe0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
2ebf0 63 53 70 69 6c 6c 2d 2d 3b 0a 20 20 7d 65 6c 73  cSpill--;.  }els
2ec00 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
2ec10 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65 29  r_write(pDbPage)
2ec20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2ec30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
2ec40 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
2ec50 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65  age given in the
2ec60 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72   argument was pr
2ec70 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a  eviously passed.
2ec80 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ** to sqlite3Pag
2ec90 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f  erWrite().  In o
2eca0 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75  ther words, retu
2ecb0 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
2ecc0 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65   ok.** to change
2ecd0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
2ece0 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  the page..*/.#if
2ecf0 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20  ndef NDEBUG.int 
2ed00 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2ed10 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a  iteable(DbPage *
2ed20 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pPg){.  return p
2ed30 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2ed40 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a  DIRTY;.}.#endif.
2ed50 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
2ed60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
2ed70 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
2ed80 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  at it is not nec
2ed90 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69  essary to.** wri
2eda0 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  te the informati
2edb0 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62  on on page pPg b
2edc0 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c  ack to the disk,
2edd0 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20   even though.** 
2ede0 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20  that page might 
2edf0 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
2ee00 74 79 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e  ty.  This happen
2ee10 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s, for example, 
2ee20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  when.** the page
2ee30 20 68 61 73 20 62 65 65 6e 20 61 64 64 65 64 20   has been added 
2ee40 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65  as a leaf of the
2ee50 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20 73 6f   freelist and so
2ee60 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   its.** content 
2ee70 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72  no longer matter
2ee80 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65  s..**.** The ove
2ee90 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20  rlying software 
2eea0 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73  layer calls this
2eeb0 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c   routine when al
2eec0 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a  l of the data.**
2eed0 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
2eee0 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 54 68  ge is unused. Th
2eef0 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68  e pager marks th
2ef00 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20  e page as clean 
2ef10 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f  so.** that it do
2ef20 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74  es not get writt
2ef30 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  en to disk..**.*
2ef40 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61  * Tests show tha
2ef50 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  t this optimizat
2ef60 69 6f 6e 20 63 61 6e 20 71 75 61 64 72 75 70 6c  ion can quadrupl
2ef70 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c  e the speed of l
2ef80 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20  arge .** DELETE 
2ef90 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76  operations..*/.v
2efa0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
2efb0 44 6f 6e 74 57 72 69 74 65 28 50 67 48 64 72 20  DontWrite(PgHdr 
2efc0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
2efd0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
2efe0 61 67 65 72 3b 0a 20 20 69 66 28 20 28 70 50 67  ager;.  if( (pPg
2eff0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
2f000 52 54 59 29 20 26 26 20 70 50 61 67 65 72 2d 3e  RTY) && pPager->
2f010 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b  nSavepoint==0 ){
2f020 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
2f030 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67  ("DONT_WRITE pag
2f040 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
2f050 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49  Pg->pgno, PAGERI
2f060 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
2f070 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e   IOTRACE(("CLEAN
2f080 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
2f090 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20  r, pPg->pgno)). 
2f0a0 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
2f0b0 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54   PGHDR_DONT_WRIT
2f0c0 45 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  E;.#ifdef SQLITE
2f0d0 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
2f0e0 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
2f0f0 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
2f100 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  pPg);.#endif.  }
2f110 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2f120 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2f130 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68   to increment th
2f140 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  e value of the d
2f150 61 74 61 62 61 73 65 20 66 69 6c 65 20 0a 2a 2a  atabase file .**
2f160 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c   change-counter,
2f170 20 73 74 6f 72 65 64 20 61 73 20 61 20 34 2d 62   stored as a 4-b
2f180 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
2f190 6e 74 65 67 65 72 20 73 74 61 72 74 69 6e 67 20  nteger starting 
2f1a0 61 74 20 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73  at .** byte offs
2f1b0 65 74 20 32 34 20 6f 66 20 74 68 65 20 70 61 67  et 24 of the pag
2f1c0 65 72 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  er file..**.** I
2f1d0 66 20 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f  f the isDirectMo
2f1e0 64 65 20 66 6c 61 67 20 69 73 20 7a 65 72 6f 2c  de flag is zero,
2f1f0 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 64 6f   then this is do
2f200 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 0a 2a  ne by calling .*
2f210 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  * sqlite3PagerWr
2f220 69 74 65 28 29 20 6f 6e 20 70 61 67 65 20 31 2c  ite() on page 1,
2f230 20 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20   then modifying 
2f240 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2f250 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61 74 61  the.** page data
2f260 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
2f270 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  he file will be 
2f280 75 70 64 61 74 65 64 20 77 68 65 6e 20 74 68 65  updated when the
2f290 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e   current.** tran
2f2a0 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
2f2b0 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tted..**.** The 
2f2c0 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61  isDirectMode fla
2f2d0 67 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6e 6f  g may only be no
2f2e0 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 6c 69  n-zero if the li
2f2f0 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c  brary was compil
2f300 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 53  ed.** with the S
2f310 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
2f320 4d 49 43 5f 57 52 49 54 45 20 6d 61 63 72 6f 20  MIC_WRITE macro 
2f330 64 65 66 69 6e 65 64 2e 20 49 6e 20 74 68 69 73  defined. In this
2f340 20 63 61 73 65 2c 0a 2a 2a 20 69 66 20 69 73 44   case,.** if isD
2f350 69 72 65 63 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  irect is non-zer
2f360 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  o, then the data
2f370 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 70 64  base file is upd
2f380 61 74 65 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a  ated directly.**
2f390 20 62 79 20 77 72 69 74 69 6e 67 20 61 6e 20 75   by writing an u
2f3a0 70 64 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f  pdated version o
2f3b0 66 20 70 61 67 65 20 31 20 75 73 69 6e 67 20 61  f page 1 using a
2f3c0 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 0a 2a 2a   call to the .**
2f3d0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
2f3e0 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ) function..*/.s
2f3f0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
2f400 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
2f410 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
2f420 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74 4d 6f  , int isDirectMo
2f430 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  de){.  int rc = 
2f440 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
2f450 20 44 65 63 6c 61 72 65 20 61 6e 64 20 69 6e 69   Declare and ini
2f460 74 69 61 6c 69 7a 65 20 63 6f 6e 73 74 61 6e 74  tialize constant
2f470 20 69 6e 74 65 67 65 72 20 27 69 73 44 69 72 65   integer 'isDire
2f480 63 74 27 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a  ct'. If the.  **
2f490 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
2f4a0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
2f4b0 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75  abled in this bu
2f4c0 69 6c 64 2c 20 74 68 65 6e 20 69 73 44 69 72 65  ild, then isDire
2f4d0 63 74 0a 20 20 2a 2a 20 69 73 20 69 6e 69 74 69  ct.  ** is initi
2f4e0 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76 61  alized to the va
2f4f0 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
2f500 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 70  e isDirectMode p
2f510 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 20 74 6f  arameter.  ** to
2f520 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
2f530 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 69 73  Otherwise, it is
2f540 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 7a   always set to z
2f550 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ero..  **.  ** T
2f560 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20  he idea is that 
2f570 69 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  if the atomic-wr
2f580 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
2f590 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61   is not.  ** ena
2f5a0 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20  bled at compile 
2f5b0 74 69 6d 65 2c 20 74 68 65 20 63 6f 6d 70 69 6c  time, the compil
2f5c0 65 72 20 63 61 6e 20 6f 6d 69 74 20 74 68 65 20  er can omit the 
2f5d0 74 65 73 74 73 20 6f 66 0a 20 20 2a 2a 20 27 69  tests of.  ** 'i
2f5e0 73 44 69 72 65 63 74 27 20 62 65 6c 6f 77 2c 20  sDirect' below, 
2f5f0 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62  as well as the b
2f600 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65 64 20 69 6e  lock enclosed in
2f610 20 74 68 65 0a 20 20 2a 2a 20 22 69 66 28 20 69   the.  ** "if( i
2f620 73 44 69 72 65 63 74 20 29 22 20 63 6f 6e 64 69  sDirect )" condi
2f630 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  tion..  */.#ifnd
2f640 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2f650 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 23 20  _ATOMIC_WRITE.# 
2f660 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f  define DIRECT_MO
2f670 44 45 20 30 0a 20 20 61 73 73 65 72 74 28 20 69  DE 0.  assert( i
2f680 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30 20 29  sDirectMode==0 )
2f690 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2f6a0 45 54 45 52 28 69 73 44 69 72 65 63 74 4d 6f 64  ETER(isDirectMod
2f6b0 65 29 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  e);.#else.# defi
2f6c0 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 69  ne DIRECT_MODE i
2f6d0 73 44 69 72 65 63 74 4d 6f 64 65 0a 23 65 6e 64  sDirectMode.#end
2f6e0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  if..  assert( pP
2f6f0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
2f700 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
2f710 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68   if( !pPager->ch
2f720 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 26 26  angeCountDone &&
2f730 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
2f740 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  0 ){.    PgHdr *
2f750 70 50 67 48 64 72 3b 20 20 20 20 20 20 20 20 20  pPgHdr;         
2f760 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65 72 65         /* Refere
2f770 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f  nce to page 1 */
2f780 0a 20 20 20 20 75 33 32 20 63 68 61 6e 67 65 5f  .    u32 change_
2f790 63 6f 75 6e 74 65 72 3b 20 20 20 20 20 20 20 20  counter;        
2f7a0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61     /* Initial va
2f7b0 6c 75 65 20 6f 66 20 63 68 61 6e 67 65 2d 63 6f  lue of change-co
2f7c0 75 6e 74 65 72 20 66 69 65 6c 64 20 2a 2f 0a 0a  unter field */..
2f7d0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
2f7e0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26  ger->tempFile &&
2f7f0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2f800 66 64 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f  fd) );..    /* O
2f810 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68  pen page 1 of th
2f820 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69  e file for writi
2f830 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ng. */.    rc = 
2f840 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
2f850 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48  pPager, 1, &pPgH
2f860 64 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dr);.    assert(
2f870 20 70 50 67 48 64 72 3d 3d 30 20 7c 7c 20 72 63   pPgHdr==0 || rc
2f880 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
2f890 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 6f      /* If page o
2f8a0 6e 65 20 77 61 73 20 66 65 74 63 68 65 64 20 73  ne was fetched s
2f8b0 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 61 6e 64  uccessfully, and
2f8c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2f8d0 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 6f 70 65  s not.    ** ope
2f8e0 72 61 74 69 6e 67 20 69 6e 20 64 69 72 65 63 74  rating in direct
2f8f0 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20 70 61 67 65  -mode, make page
2f900 20 31 20 77 72 69 74 61 62 6c 65 2e 20 20 57 68   1 writable.  Wh
2f910 65 6e 20 6e 6f 74 20 69 6e 20 0a 20 20 20 20 2a  en not in .    *
2f920 2a 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 70  * direct mode, p
2f930 61 67 65 20 31 20 69 73 20 61 6c 77 61 79 73 20  age 1 is always 
2f940 68 65 6c 64 20 69 6e 20 63 61 63 68 65 20 61 6e  held in cache an
2f950 64 20 68 65 6e 63 65 20 74 68 65 20 50 61 67 65  d hence the Page
2f960 72 47 65 74 28 29 0a 20 20 20 20 2a 2a 20 61 62  rGet().    ** ab
2f970 6f 76 65 20 69 73 20 61 6c 77 61 79 73 20 73 75  ove is always su
2f980 63 63 65 73 73 66 75 6c 20 2d 20 68 65 6e 63 65  ccessful - hence
2f990 20 74 68 65 20 41 4c 57 41 59 53 20 6f 6e 20 72   the ALWAYS on r
2f9a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20  c==SQLITE_OK..  
2f9b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 44 49    */.    if( !DI
2f9c0 52 45 43 54 5f 4d 4f 44 45 20 26 26 20 41 4c 57  RECT_MODE && ALW
2f9d0 41 59 53 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  AYS(rc==SQLITE_O
2f9e0 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  K) ){.      rc =
2f9f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2fa00 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  te(pPgHdr);.    
2fa10 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
2fa20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2fa30 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
2fa40 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65  he value just re
2fa50 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20  ad and write it 
2fa60 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e  back to byte 24.
2fa70 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 6e 67 65   */.      change
2fa80 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74  _counter = sqlit
2fa90 65 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29  e3Get4byte((u8*)
2faa0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
2fab0 72 73 29 3b 0a 20 20 20 20 20 20 63 68 61 6e 67  rs);.      chang
2fac0 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20  e_counter++;.   
2fad0 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63     put32bits(((c
2fae0 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44 61  har*)pPgHdr->pDa
2faf0 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63  ta)+24, change_c
2fb00 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 20 20  ounter);..      
2fb10 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68  /* Also store th
2fb20 65 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e  e SQLite version
2fb30 20 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73   number in bytes
2fb40 20 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20   96..99 and in. 
2fb50 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 39 32       ** bytes 92
2fb60 2e 2e 39 35 20 73 74 6f 72 65 20 74 68 65 20 63  ..95 store the c
2fb70 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 66 6f  hange counter fo
2fb80 72 20 77 68 69 63 68 20 74 68 65 20 76 65 72 73  r which the vers
2fb90 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 20 20 20  ion number.     
2fba0 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f   ** is valid. */
2fbb0 0a 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73  .      put32bits
2fbc0 28 28 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d  (((char*)pPgHdr-
2fbd0 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e  >pData)+92, chan
2fbe0 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 20  ge_counter);.   
2fbf0 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63     put32bits(((c
2fc00 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44 61  har*)pPgHdr->pDa
2fc10 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56  ta)+96, SQLITE_V
2fc20 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a  ERSION_NUMBER);.
2fc30 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 75 6e  .      /* If run
2fc40 6e 69 6e 67 20 69 6e 20 64 69 72 65 63 74 20 6d  ning in direct m
2fc50 6f 64 65 2c 20 77 72 69 74 65 20 74 68 65 20 63  ode, write the c
2fc60 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65 20  ontents of page 
2fc70 31 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 2a  1 to the file. *
2fc80 2f 0a 20 20 20 20 20 20 69 66 28 20 44 49 52 45  /.      if( DIRE
2fc90 43 54 5f 4d 4f 44 45 20 29 7b 0a 20 20 20 20 20  CT_MODE ){.     
2fca0 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a     const void *z
2fcb0 42 75 66 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Buf;.        ass
2fcc0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 46  ert( pPager->dbF
2fcd0 69 6c 65 53 69 7a 65 3e 30 20 29 3b 0a 20 20 20  ileSize>0 );.   
2fce0 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
2fcf0 65 72 2c 20 70 50 67 48 64 72 2d 3e 70 44 61 74  er, pPgHdr->pDat
2fd00 61 2c 20 31 2c 20 36 2c 20 72 63 3d 53 51 4c 49  a, 1, 6, rc=SQLI
2fd10 54 45 5f 4e 4f 4d 45 4d 2c 20 7a 42 75 66 29 3b  TE_NOMEM, zBuf);
2fd20 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
2fd30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2fd40 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2fd50 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
2fd60 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50  er->fd, zBuf, pP
2fd70 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
2fd80 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
2fd90 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2fda0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2fdb0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61       pPager->cha
2fdc0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31  ngeCountDone = 1
2fdd0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2fde0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2fdf0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
2fe00 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20  ountDone = 1;.  
2fe10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2fe20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
2fe30 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
2fe40 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  */.    sqlite3Pa
2fe50 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
2fe60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2fe70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  c;.}../*.** Sync
2fe80 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20   the pager file 
2fe90 74 6f 20 64 69 73 6b 2e 20 54 68 69 73 20 69 73  to disk. This is
2fea0 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d   a no-op for in-
2feb0 6d 65 6d 6f 72 79 20 66 69 6c 65 73 0a 2a 2a 20  memory files.** 
2fec0 6f 72 20 70 61 67 65 73 20 77 69 74 68 20 74 68  or pages with th
2fed0 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66  e Pager.noSync f
2fee0 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49  lag set..**.** I
2fef0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
2ff00 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67   called on a pag
2ff10 65 72 20 66 6f 72 20 77 68 69 63 68 20 69 74 20  er for which it 
2ff20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 74 68 69 73  is a no-op, this
2ff30 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
2ff40 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  urns SQLITE_OK. 
2ff50 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 49 4f  Otherwise, an IO
2ff60 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2ff70 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
2ff80 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
2ff90 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2ffa0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
2ffb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ffc0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2ffd0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65  n code */.  asse
2ffe0 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
2fff0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
30000 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  nc ){.    rc = S
30010 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
30020 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
30030 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
30040 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  ->fd, pPager->sy
30050 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20  nc_flags);.  }. 
30060 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
30070 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61  *.** Sync the da
30080 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
30090 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72  the pager pPager
300a0 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
300b0 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20   to the name.** 
300c0 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
300d0 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
300e0 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
300f0 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64  into the individ
30100 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ual.** journal f
30110 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79  ile. zMaster may
30120 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20   be NULL, which 
30130 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
30140 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a  s no master.** j
30150 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65  ournal (a single
30160 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
30170 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  ction)..**.** Th
30180 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72  is routine ensur
30190 65 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20  es that:.**.**  
301a0 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20   * The database 
301b0 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e  file change-coun
301c0 74 65 72 20 69 73 20 75 70 64 61 74 65 64 2c 0a  ter is updated,.
301d0 2a 2a 20 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e  **   * the journ
301e0 61 6c 20 69 73 20 73 79 6e 63 65 64 20 28 75 6e  al is synced (un
301f0 6c 65 73 73 20 74 68 65 20 61 74 6f 6d 69 63 2d  less the atomic-
30200 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
30210 6f 6e 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20  on is used),.** 
30220 20 20 2a 20 61 6c 6c 20 64 69 72 74 79 20 70 61    * all dirty pa
30230 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  ges are written 
30240 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
30250 66 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68  file, .**   * th
30260 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
30270 69 73 20 74 72 75 6e 63 61 74 65 64 20 28 69 66  is truncated (if
30280 20 72 65 71 75 69 72 65 64 29 2c 20 61 6e 64 0a   required), and.
30290 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62  **   * the datab
302a0 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e  ase file synced.
302b0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79   .**.** The only
302c0 20 74 68 69 6e 67 20 74 68 61 74 20 72 65 6d 61   thing that rema
302d0 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ins to commit th
302e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
302f0 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a   to finalize .**
30300 20 28 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61   (delete, trunca
30310 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 66  te or zero the f
30320 69 72 73 74 20 70 61 72 74 20 6f 66 29 20 74 68  irst part of) th
30330 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
30340 6f 72 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68  or .** delete th
30350 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
30360 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69   file if specifi
30370 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ed)..**.** Note 
30380 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d  that if zMaster=
30390 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73  =NULL, this does
303a0 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61   not overwrite a
303b0 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a   previous value.
303c0 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20  ** passed to an 
303d0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
303e0 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c  itPhaseOne() cal
303f0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
30400 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20  final parameter 
30410 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72  - noSync - is tr
30420 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ue, then the dat
30430 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c  abase file itsel
30440 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63  f.** is not sync
30450 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  ed. The caller m
30460 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  ust call sqlite3
30470 50 61 67 65 72 53 79 6e 63 28 29 20 64 69 72 65  PagerSync() dire
30480 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20  ctly to.** sync 
30490 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
304a0 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  e before calling
304b0 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28   CommitPhaseTwo(
304c0 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a  ) to delete the.
304d0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
304e0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f  in this case..*/
304f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
30500 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
30510 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
30520 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
30530 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
30540 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
30550 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20  ar *zMaster,    
30560 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
30570 74 20 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74  t NULL, the mast
30580 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
30590 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20  */.  int noSync 
305a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
305b0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
305c0 6f 6d 69 74 20 74 68 65 20 78 53 79 6e 63 20 6f  omit the xSync o
305d0 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f  n the db file */
305e0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
305f0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
30600 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
30610 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
30620 65 20 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20  e dbOrigSize is 
30630 6e 65 76 65 72 20 73 65 74 20 69 66 20 6a 6f 75  never set if jou
30640 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 20 2a 2f  rnal_mode=OFF */
30650 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
30660 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
30670 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
30680 45 5f 4f 46 46 20 7c 7c 20 70 50 61 67 65 72 2d  E_OFF || pPager-
30690 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29  >dbOrigSize==0 )
306a0 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 70 72 69  ;..  /* If a pri
306b0 6f 72 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  or error occurre
306c0 64 2c 20 72 65 70 6f 72 74 20 74 68 61 74 20 65  d, report that e
306d0 72 72 6f 72 20 61 67 61 69 6e 2e 20 2a 2f 0a 20  rror again. */. 
306e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
306f0 43 6f 64 65 20 29 20 72 65 74 75 72 6e 20 70 50  Code ) return pP
30700 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a  ager->errCode;..
30710 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 44    PAGERTRACE(("D
30720 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69  ATABASE SYNC: Fi
30730 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73  le=%s zMaster=%s
30740 20 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20   nSize=%d\n", . 
30750 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69       pPager->zFi
30760 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c  lename, zMaster,
30770 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
30780 29 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  );..  if( MEMDB 
30790 26 26 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  && pPager->dbMod
307a0 69 66 69 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  ified ){.    /* 
307b0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  If this is an in
307c0 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e  -memory db, or n
307d0 6f 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  o pages have bee
307e0 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72  n written to, or
307f0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 75 6e   this.    ** fun
30800 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
30810 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69  y been called, i
30820 74 20 69 73 20 6d 6f 73 74 6c 79 20 61 20 6e 6f  t is mostly a no
30830 2d 6f 70 2e 20 20 48 6f 77 65 76 65 72 2c 20 61  -op.  However, a
30840 6e 79 0a 20 20 20 20 2a 2a 20 62 61 63 6b 75 70  ny.    ** backup
30850 20 69 6e 20 70 72 6f 67 72 65 73 73 20 6e 65 65   in progress nee
30860 64 73 20 74 6f 20 62 65 20 72 65 73 74 61 72 74  ds to be restart
30870 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
30880 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
30890 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
308a0 6b 75 70 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  kup);.  }else if
308b0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
308c0 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26  =PAGER_SYNCED &&
308d0 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
308e0 69 65 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ied ){.    if( p
308f0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
30900 72 29 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64  r) ){.      PgHd
30910 72 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  r *pList = sqlit
30920 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73  e3PcacheDirtyLis
30930 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
30940 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  e);.      if( pL
30950 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ist ){.        r
30960 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d  c = pagerWalFram
30970 65 73 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74  es(pPager, pList
30980 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
30990 2c 20 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 1, .          
309a0 20 20 28 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53    (pPager->fullS
309b0 79 6e 63 20 3f 20 70 50 61 67 65 72 2d 3e 73 79  ync ? pPager->sy
309c0 6e 63 5f 66 6c 61 67 73 20 3a 20 30 29 0a 20 20  nc_flags : 0).  
309d0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
309e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
309f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30a00 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
30a10 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72  eCleanAll(pPager
30a20 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20  ->pPCache);.    
30a30 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
30a40 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c       /* The foll
30a50 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61  owing block upda
30a60 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63  tes the change-c
30a70 6f 75 6e 74 65 72 2e 20 45 78 61 63 74 6c 79 20  ounter. Exactly 
30a80 68 6f 77 20 69 74 0a 20 20 20 20 20 20 2a 2a 20  how it.      ** 
30a90 64 6f 65 73 20 74 68 69 73 20 64 65 70 65 6e 64  does this depend
30aa0 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  s on whether or 
30ab0 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 75  not the atomic-u
30ac0 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  pdate optimizati
30ad0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20  on.      ** was 
30ae0 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
30af0 6c 65 20 74 69 6d 65 2c 20 61 6e 64 20 69 66 20  le time, and if 
30b00 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
30b10 20 6d 65 65 74 73 20 74 68 65 20 0a 20 20 20 20   meets the .    
30b20 20 20 2a 2a 20 72 75 6e 74 69 6d 65 20 63 72 69    ** runtime cri
30b30 74 65 72 69 61 20 74 6f 20 75 73 65 20 74 68 65  teria to use the
30b40 20 6f 70 65 72 61 74 69 6f 6e 3a 20 0a 20 20 20   operation: .   
30b50 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
30b60 20 20 2a 20 54 68 65 20 66 69 6c 65 2d 73 79 73    * The file-sys
30b70 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65  tem supports the
30b80 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72   atomic-write pr
30b90 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20 20 20  operty for.     
30ba0 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20   **      blocks 
30bb0 6f 66 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a  of size page-siz
30bc0 65 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a  e, and .      **
30bd0 20 20 20 20 2a 20 54 68 69 73 20 63 6f 6d 6d 69      * This commi
30be0 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  t is not part of
30bf0 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72   a multi-file tr
30c00 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20  ansaction, and. 
30c10 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 45 78 61       **    * Exa
30c20 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61  ctly one page ha
30c30 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  s been modified 
30c40 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65  and store in the
30c50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
30c60 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
30c70 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
30c80 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 65 6e 61  tion was not ena
30c90 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20  bled at compile 
30ca0 74 69 6d 65 2c 20 74 68 65 6e 20 74 68 65 0a 20  time, then the. 
30cb0 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e       ** pager_in
30cc0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
30cd0 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  () function is c
30ce0 61 6c 6c 65 64 20 74 6f 20 75 70 64 61 74 65 20  alled to update 
30cf0 74 68 65 20 63 68 61 6e 67 65 0a 20 20 20 20 20  the change.     
30d00 20 2a 2a 20 63 6f 75 6e 74 65 72 20 69 6e 20 27   ** counter in '
30d10 69 6e 64 69 72 65 63 74 2d 6d 6f 64 65 27 2e 20  indirect-mode'. 
30d20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  If the optimizat
30d30 69 6f 6e 20 69 73 20 63 6f 6d 70 69 6c 65 64 20  ion is compiled 
30d40 69 6e 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20  in but.      ** 
30d50 69 73 20 6e 6f 74 20 61 70 70 6c 69 63 61 62 6c  is not applicabl
30d60 65 20 74 6f 20 74 68 69 73 20 74 72 61 6e 73 61  e to this transa
30d70 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c 69  ction, call sqli
30d80 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65  te3JournalCreate
30d90 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d  ().      ** to m
30da0 61 6b 65 20 73 75 72 65 20 74 68 65 20 6a 6f 75  ake sure the jou
30db0 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 61 63  rnal file has ac
30dc0 74 75 61 6c 6c 79 20 62 65 65 6e 20 63 72 65 61  tually been crea
30dd0 74 65 64 2c 20 74 68 65 6e 20 63 61 6c 6c 0a 20  ted, then call. 
30de0 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e       ** pager_in
30df0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
30e00 28 29 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  () to update the
30e10 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
30e20 69 6e 20 69 6e 64 69 72 65 63 74 0a 20 20 20 20  in indirect.    
30e30 20 20 2a 2a 20 6d 6f 64 65 2e 20 0a 20 20 20 20    ** mode. .    
30e40 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 74    **.      ** Ot
30e50 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
30e60 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
30e70 62 6f 74 68 20 65 6e 61 62 6c 65 64 20 61 6e 64  both enabled and
30e80 20 61 70 70 6c 69 63 61 62 6c 65 2c 0a 20 20 20   applicable,.   
30e90 20 20 20 2a 2a 20 74 68 65 6e 20 63 61 6c 6c 20     ** then call 
30ea0 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
30eb0 65 63 6f 75 6e 74 65 72 28 29 20 74 6f 20 75 70  ecounter() to up
30ec0 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d  date the change-
30ed0 63 6f 75 6e 74 65 72 0a 20 20 20 20 20 20 2a 2a  counter.      **
30ee0 20 69 6e 20 27 64 69 72 65 63 74 27 20 6d 6f 64   in 'direct' mod
30ef0 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
30f00 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
30f10 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 0a 20   will never be. 
30f20 20 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20       ** created 
30f30 66 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61 63  for this transac
30f40 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
30f50 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45   #ifdef SQLITE_E
30f60 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
30f70 54 45 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  TE.      PgHdr *
30f80 70 50 67 3b 0a 20 20 20 20 20 20 61 73 73 65 72  pPg;.      asser
30f90 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
30fa0 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
30fb0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
30fc0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
30fd0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
30fe0 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
30ff0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
31000 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
31010 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
31020 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21    );.      if( !
31030 7a 4d 61 73 74 65 72 20 26 26 20 69 73 4f 70 65  zMaster && isOpe
31040 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a  n(pPager->jfd) .
31050 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72         && pPager
31060 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72  ->journalOff==jr
31070 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61  nlBufferSize(pPa
31080 67 65 72 29 20 0a 20 20 20 20 20 20 20 26 26 20  ger) .       && 
31090 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
310a0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
310b0 7a 65 0a 20 20 20 20 20 20 20 26 26 20 28 30 3d  ze.       && (0=
310c0 3d 28 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50  =(pPg = sqlite3P
310d0 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
310e0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29  Pager->pPCache))
310f0 20 7c 7c 20 30 3d 3d 70 50 67 2d 3e 70 44 69 72   || 0==pPg->pDir
31100 74 79 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ty).      ){.   
31110 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
31120 68 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67  he db file chang
31130 65 20 63 6f 75 6e 74 65 72 20 76 69 61 20 74 68  e counter via th
31140 65 20 64 69 72 65 63 74 2d 77 72 69 74 65 20 6d  e direct-write m
31150 65 74 68 6f 64 2e 20 54 68 65 20 0a 20 20 20 20  ethod. The .    
31160 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
31170 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66   call will modif
31180 79 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  y the in-memory 
31190 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
311a0 66 20 70 61 67 65 20 31 20 0a 20 20 20 20 20 20  f page 1 .      
311b0 20 20 2a 2a 20 74 6f 20 69 6e 63 6c 75 64 65 20    ** to include 
311c0 74 68 65 20 75 70 64 61 74 65 64 20 63 68 61 6e  the updated chan
311d0 67 65 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74  ge counter and t
311e0 68 65 6e 20 77 72 69 74 65 20 70 61 67 65 20 31  hen write page 1
311f0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 69 72   .        ** dir
31200 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74  ectly to the dat
31210 61 62 61 73 65 20 66 69 6c 65 2e 20 42 65 63 61  abase file. Beca
31220 75 73 65 20 6f 66 20 74 68 65 20 61 74 6f 6d 69  use of the atomi
31230 63 2d 77 72 69 74 65 20 0a 20 20 20 20 20 20 20  c-write .       
31240 20 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f 66 20   ** property of 
31250 74 68 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79  the host file-sy
31260 73 74 65 6d 2c 20 74 68 69 73 20 69 73 20 73 61  stem, this is sa
31270 66 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  fe..        */. 
31280 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
31290 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
312a0 6e 74 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b  nter(pPager, 1);
312b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
312c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
312d0 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28  e3JournalCreate(
312e0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
312f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
31300 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31310 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
31320 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
31330 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  er(pPager, 0);. 
31340 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
31350 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 20 20 72  .  #else.      r
31360 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
31370 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
31380 67 65 72 2c 20 30 29 3b 0a 20 20 23 65 6e 64 69  ger, 0);.  #endi
31390 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  f.      if( rc!=
313a0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
313b0 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
313c0 65 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20 20 20  e_exit;.  .     
313d0 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e   /* If this tran
313e0 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65  saction has made
313f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d   the database sm
31400 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20  aller, then all 
31410 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 62  pages.      ** b
31420 65 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62  eing discarded b
31430 79 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e  y the truncation
31440 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e   must be written
31450 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
31460 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 54        ** file. T
31470 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
31480 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  pen in auto-vacu
31490 75 6d 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a  um mode..      *
314a0 2a 0a 20 20 20 20 20 20 2a 2a 20 42 65 66 6f 72  *.      ** Befor
314b0 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 70 61  e reading the pa
314c0 67 65 73 20 77 69 74 68 20 70 61 67 65 20 6e 75  ges with page nu
314d0 6d 62 65 72 73 20 6c 61 72 67 65 72 20 74 68 61  mbers larger tha
314e0 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
314f0 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
31500 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 73   Pager.dbSize, s
31510 65 74 20 64 62 53 69 7a 65 20 62 61 63 6b 20 74  et dbSize back t
31520 6f 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20  o the value.    
31530 20 20 2a 2a 20 74 68 61 74 20 69 74 20 74 6f 6f    ** that it too
31540 6b 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  k at the start o
31550 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
31560 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  n. Otherwise, th
31570 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 73  e.      ** calls
31580 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
31590 47 65 74 28 29 20 72 65 74 75 72 6e 20 7a 65 72  Get() return zer
315a0 6f 65 64 20 70 61 67 65 73 20 69 6e 73 74 65 61  oed pages instea
315b0 64 20 6f 66 20 0a 20 20 20 20 20 20 2a 2a 20 72  d of .      ** r
315c0 65 61 64 69 6e 67 20 64 61 74 61 20 66 72 6f 6d  eading data from
315d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
315e0 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  le..      **.   
315f0 20 20 20 2a 2a 20 57 68 65 6e 20 6a 6f 75 72 6e     ** When journ
31600 61 6c 5f 6d 6f 64 65 3d 3d 4f 46 46 20 74 68 65  al_mode==OFF the
31610 20 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61   dbOrigSize is a
31620 6c 77 61 79 73 20 7a 65 72 6f 2c 20 73 6f 20 74  lways zero, so t
31630 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f  his.      ** blo
31640 63 6b 20 6e 65 76 65 72 20 72 75 6e 73 20 69 66  ck never runs if
31650 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46   journal_mode=OF
31660 46 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 23 69  F..      */.  #i
31670 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
31680 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
31690 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
316a0 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  bSize<pPager->db
316b0 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 20 20  OrigSize .      
316c0 20 26 26 20 41 4c 57 41 59 53 28 70 50 61 67 65   && ALWAYS(pPage
316d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
316e0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
316f0 45 5f 4f 46 46 29 0a 20 20 20 20 20 20 29 7b 0a  E_OFF).      ){.
31700 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 20          Pgno i; 
31710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31730 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
31740 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  riable */.      
31750 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20 69 53 6b    const Pgno iSk
31760 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47  ip = PAGER_MJ_PG
31770 4e 4f 28 70 50 61 67 65 72 29 3b 20 2f 2a 20 50  NO(pPager); /* P
31780 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 70 61 67 65  ending lock page
31790 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   */.        cons
317a0 74 20 50 67 6e 6f 20 64 62 53 69 7a 65 20 3d 20  t Pgno dbSize = 
317b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 20  pPager->dbSize; 
317c0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
317d0 65 20 69 6d 61 67 65 20 73 69 7a 65 20 2a 2f 20  e image size */ 
317e0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
317f0 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
31800 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20  ->dbOrigSize;.  
31810 20 20 20 20 20 20 66 6f 72 28 20 69 3d 64 62 53        for( i=dbS
31820 69 7a 65 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72  ize+1; i<=pPager
31830 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 20 69 2b  ->dbOrigSize; i+
31840 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  + ){.          i
31850 66 28 20 21 73 71 6c 69 74 65 33 42 69 74 76 65  f( !sqlite3Bitve
31860 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
31870 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20  nJournal, i) && 
31880 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20  i!=iSkip ){.    
31890 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70          PgHdr *p
318a0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
318b0 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 6a 6f 75    /* Page to jou
318c0 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20  rnal */.        
318d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
318e0 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
318f0 20 69 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20   i, &pPage);.   
31900 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
31910 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
31920 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
31930 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  ne_exit;.       
31940 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31950 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
31960 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
31970 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
31980 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
31990 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
319a0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63  LITE_OK ) goto c
319b0 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
319c0 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
319d0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
319e0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
319f0 7a 65 20 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20  ze = dbSize;.   
31a00 20 20 20 7d 20 0a 20 20 23 65 6e 64 69 66 0a 20     } .  #endif. 
31a10 20 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65   .      /* Write
31a20 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
31a30 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68  nal name into th
31a40 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
31a50 49 66 20 61 20 6d 61 73 74 65 72 20 0a 20 20 20  If a master .   
31a60 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
31a70 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65  le name has alre
31a80 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
31a90 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
31aa0 66 69 6c 65 2c 20 0a 20 20 20 20 20 20 2a 2a 20  file, .      ** 
31ab0 6f 72 20 69 66 20 7a 4d 61 73 74 65 72 20 69 73  or if zMaster is
31ac0 20 4e 55 4c 4c 20 28 6e 6f 20 6d 61 73 74 65 72   NULL (no master
31ad0 20 6a 6f 75 72 6e 61 6c 29 2c 20 74 68 65 6e 20   journal), then 
31ae0 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  this call is a n
31af0 6f 2d 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  o-op..      */. 
31b00 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d       rc = writeM
31b10 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
31b20 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
31b30 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
31b40 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f  ITE_OK ) goto co
31b50 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
31b60 78 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a  xit;.  .      /*
31b70 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
31b80 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 61  l file. If the a
31b90 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74  tomic-update opt
31ba0 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 65 69  imization is bei
31bb0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 64  ng.      ** used
31bc0 2c 20 74 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c  , this call will
31bd0 20 6e 6f 74 20 63 72 65 61 74 65 20 74 68 65 20   not create the 
31be0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
31bf0 70 65 72 66 6f 72 6d 20 61 6e 79 0a 20 20 20 20  perform any.    
31c00 20 20 2a 2a 20 72 65 61 6c 20 49 4f 2e 0a 20 20    ** real IO..  
31c10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
31c20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
31c30 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
31c40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31c50 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
31c60 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 0a  se_one_exit;.  .
31c70 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61        /* Write a
31c80 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74  ll dirty pages t
31c90 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
31ca0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ile. */.      rc
31cb0 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
31cc0 61 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c 73  agelist(pPager,s
31cd0 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
31ce0 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
31cf0 43 61 63 68 65 29 29 3b 0a 20 20 20 20 20 20 69  Cache));.      i
31d00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31d10 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
31d20 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49  rt( rc!=SQLITE_I
31d30 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a  OERR_BLOCKED );.
31d40 20 20 20 20 20 20 20 20 67 6f 74 6f 20 63 6f 6d          goto com
31d50 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
31d60 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
31d70 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
31d80 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e  leanAll(pPager->
31d90 70 50 43 61 63 68 65 29 3b 0a 20 20 0a 20 20 20  pPCache);.  .   
31da0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
31db0 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6e 6f 74  e on disk is not
31dc0 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61   the same size a
31dd0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  s the database i
31de0 6d 61 67 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74  mage,.      ** t
31df0 68 65 6e 20 75 73 65 20 70 61 67 65 72 5f 74 72  hen use pager_tr
31e00 75 6e 63 61 74 65 20 74 6f 20 67 72 6f 77 20 6f  uncate to grow o
31e10 72 20 73 68 72 69 6e 6b 20 74 68 65 20 66 69 6c  r shrink the fil
31e20 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f  e here..      */
31e30 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
31e40 72 2d 3e 64 62 53 69 7a 65 21 3d 70 50 61 67 65  r->dbSize!=pPage
31e50 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
31e60 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6e 4e  .        Pgno nN
31e70 65 77 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ew = pPager->dbS
31e80 69 7a 65 20 2d 20 28 70 50 61 67 65 72 2d 3e 64  ize - (pPager->d
31e90 62 53 69 7a 65 3d 3d 50 41 47 45 52 5f 4d 4a 5f  bSize==PAGER_MJ_
31ea0 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20  PGNO(pPager));. 
31eb0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
31ec0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
31ed0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  GER_EXCLUSIVE );
31ee0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
31ef0 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
31f00 67 65 72 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20  ger, nNew);.    
31f10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31f20 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
31f30 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
31f40 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20  it;.      }.  . 
31f50 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c       /* Finally,
31f60 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
31f70 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
31f80 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
31f90 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63  oSync && !noSync
31fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
31fb0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
31fc0 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
31fd0 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
31fe0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 49 4f        }.      IO
31ff0 54 52 41 43 45 28 28 22 44 42 53 59 4e 43 20 25  TRACE(("DBSYNC %
32000 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
32010 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72     }..    pPager
32020 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
32030 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 63 6f 6d  SYNCED;.  }..com
32040 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
32050 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  it:.  return rc;
32060 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  .}.../*.** When 
32070 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
32080 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 64 61 74   called, the dat
32090 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62  abase file has b
320a0 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 2a  een completely.*
320b0 2a 20 75 70 64 61 74 65 64 20 74 6f 20 72 65 66  * updated to ref
320c0 6c 65 63 74 20 74 68 65 20 63 68 61 6e 67 65 73  lect the changes
320d0 20 6d 61 64 65 20 62 79 20 74 68 65 20 63 75 72   made by the cur
320e0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
320f0 20 61 6e 64 0a 2a 2a 20 73 79 6e 63 65 64 20 74   and.** synced t
32100 6f 20 64 69 73 6b 2e 20 54 68 65 20 6a 6f 75 72  o disk. The jour
32110 6e 61 6c 20 66 69 6c 65 20 73 74 69 6c 6c 20 65  nal file still e
32120 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c  xists in the fil
32130 65 2d 73 79 73 74 65 6d 20 0a 2a 2a 20 74 68 6f  e-system .** tho
32140 75 67 68 2c 20 61 6e 64 20 69 66 20 61 20 66 61  ugh, and if a fa
32150 69 6c 75 72 65 20 6f 63 63 75 72 73 20 61 74 20  ilure occurs at 
32160 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 69  this point it wi
32170 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a  ll eventually.**
32180 20 62 65 20 75 73 65 64 20 61 73 20 61 20 68 6f   be used as a ho
32190 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  t-journal and th
321a0 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
321b0 63 74 69 6f 6e 20 72 6f 6c 6c 65 64 20 62 61 63  ction rolled bac
321c0 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  k..**.** This fu
321d0 6e 63 74 69 6f 6e 20 66 69 6e 61 6c 69 7a 65 73  nction finalizes
321e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
321f0 65 2c 20 65 69 74 68 65 72 20 62 79 20 64 65 6c  e, either by del
32200 65 74 69 6e 67 2c 20 0a 2a 2a 20 74 72 75 6e 63  eting, .** trunc
32210 61 74 69 6e 67 20 6f 72 20 70 61 72 74 69 61 6c  ating or partial
32220 6c 79 20 7a 65 72 6f 69 6e 67 20 69 74 2c 20 73  ly zeroing it, s
32230 6f 20 74 68 61 74 20 69 74 20 63 61 6e 6e 6f 74  o that it cannot
32240 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72   be used .** for
32250 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
32260 6c 62 61 63 6b 2e 20 4f 6e 63 65 20 74 68 69 73  lback. Once this
32270 20 69 73 20 64 6f 6e 65 20 74 68 65 20 74 72 61   is done the tra
32280 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 69  nsaction is.** i
32290 72 72 65 76 6f 63 61 62 6c 79 20 63 6f 6d 6d 69  rrevocably commi
322a0 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tted..**.** If a
322b0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
322c0 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
322d0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
322e0 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 6d 6f   the pager.** mo
322f0 76 65 73 20 69 6e 74 6f 20 74 68 65 20 65 72 72  ves into the err
32300 6f 72 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77  or state. Otherw
32310 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ise, SQLITE_OK i
32320 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
32330 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
32340 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61  ommitPhaseTwo(Pa
32350 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
32360 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
32370 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
32380 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
32390 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69  ode */..  /* Thi
323a0 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
323b0 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 69   not be called i
323c0 66 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20  f a prior error 
323d0 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 20 20  has occurred..  
323e0 2a 2a 20 42 75 74 20 69 66 20 28 64 75 65 20 74  ** But if (due t
323f0 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72  o a coding error
32400 20 65 6c 73 65 77 68 65 72 65 20 69 6e 20 74 68   elsewhere in th
32410 65 20 73 79 73 74 65 6d 29 20 69 74 20 64 6f 65  e system) it doe
32420 73 20 67 65 74 0a 20 20 2a 2a 20 63 61 6c 6c 65  s get.  ** calle
32430 64 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74  d, just return t
32440 68 65 20 73 61 6d 65 20 65 72 72 6f 72 20 63 6f  he same error co
32450 64 65 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  de without doing
32460 20 61 6e 79 74 68 69 6e 67 2e 20 2a 2f 0a 20 20   anything. */.  
32470 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
32480 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74  ->errCode) ) ret
32490 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
324a0 6f 64 65 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  ode;..  /* This 
324b0 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
324c0 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 69 66  not be called if
324d0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
324e0 74 20 69 6e 20 61 74 20 6c 65 61 73 74 0a 20 20  t in at least.  
324f0 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
32500 44 20 73 74 61 74 65 2e 20 2a 2a 46 49 58 4d 45  D state. **FIXME
32510 2a 2a 3a 20 4d 61 6b 65 20 69 74 20 73 6f 20 74  **: Make it so t
32520 68 61 74 20 74 68 69 73 20 74 65 73 74 20 61 6c  hat this test al
32530 77 61 79 73 0a 20 20 2a 2a 20 66 61 69 6c 73 20  ways.  ** fails 
32540 2d 20 6d 61 6b 65 20 69 74 20 73 6f 20 74 68 61  - make it so tha
32550 74 20 77 65 20 6e 65 76 65 72 20 72 65 61 63 68  t we never reach
32560 20 74 68 69 73 20 70 6f 69 6e 74 20 69 66 20 77   this point if w
32570 65 20 64 6f 20 6e 6f 74 20 68 6f 6c 64 0a 20 20  e do not hold.  
32580 2a 2a 20 61 6c 6c 20 6e 65 63 65 73 73 61 72 79  ** all necessary
32590 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69   locks..  */.  i
325a0 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
325b0 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53  >state<PAGER_RES
325c0 45 52 56 45 44 29 20 29 20 72 65 74 75 72 6e 20  ERVED) ) return 
325d0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20  SQLITE_ERROR;.. 
325e0 20 2f 2a 20 41 6e 20 6f 70 74 69 6d 69 7a 61 74   /* An optimizat
325f0 69 6f 6e 2e 20 49 66 20 74 68 65 20 64 61 74 61  ion. If the data
32600 62 61 73 65 20 77 61 73 20 6e 6f 74 20 61 63 74  base was not act
32610 75 61 6c 6c 79 20 6d 6f 64 69 66 69 65 64 20 64  ually modified d
32620 75 72 69 6e 67 0a 20 20 2a 2a 20 74 68 69 73 20  uring.  ** this 
32630 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
32640 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
32650 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d  g in exclusive-m
32660 6f 64 65 20 61 6e 64 20 69 73 0a 20 20 2a 2a 20  ode and is.  ** 
32670 75 73 69 6e 67 20 70 65 72 73 69 73 74 65 6e 74  using persistent
32680 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20   journals, then 
32690 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
326a0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20   a no-op..  **. 
326b0 20 2a 2a 20 54 68 65 20 73 74 61 72 74 20 6f 66   ** The start of
326c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
326d0 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74  e currently cont
326e0 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 6a 6f  ains a single jo
326f0 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64  urnal .  ** head
32700 65 72 20 77 69 74 68 20 74 68 65 20 6e 52 65 63  er with the nRec
32710 20 66 69 65 6c 64 20 73 65 74 20 74 6f 20 30 2e   field set to 0.
32720 20 49 66 20 73 75 63 68 20 61 20 6a 6f 75 72 6e   If such a journ
32730 61 6c 20 69 73 20 75 73 65 64 20 61 73 0a 20 20  al is used as.  
32740 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
32750 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72   during hot-jour
32760 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 30 20  nal rollback, 0 
32770 63 68 61 6e 67 65 73 20 77 69 6c 6c 20 62 65 20  changes will be 
32780 6d 61 64 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65  made.  ** to the
32790 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
327a0 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  So there is no n
327b0 65 65 64 20 74 6f 20 7a 65 72 6f 20 74 68 65 20  eed to zero the 
327c0 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65  journal .  ** he
327d0 61 64 65 72 2e 20 53 69 6e 63 65 20 74 68 65 20  ader. Since the 
327e0 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c  pager is in excl
327f0 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 72  usive mode, ther
32800 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 2a  e is no need.  *
32810 2a 20 74 6f 20 64 72 6f 70 20 61 6e 79 20 6c 6f  * to drop any lo
32820 63 6b 73 20 65 69 74 68 65 72 2e 0a 20 20 2a 2f  cks either..  */
32830 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
32840 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26 26 20  bModified==0 && 
32850 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
32860 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 70 50 61  eMode .   && pPa
32870 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
32880 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
32890 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 29 7b  ODE_PERSIST.  ){
328a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
328b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
328c0 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
328d0 70 50 61 67 65 72 29 20 7c 7c 20 21 70 50 61 67  pPager) || !pPag
328e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
328f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
32900 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50  ITE_OK;.  }..  P
32910 41 47 45 52 54 52 41 43 45 28 28 22 43 4f 4d 4d  AGERTRACE(("COMM
32920 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IT %d\n", PAGERI
32930 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 61  D(pPager)));.  a
32940 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
32950 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43  tate==PAGER_SYNC
32960 45 44 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 21  ED || MEMDB || !
32970 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
32980 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67  ed );.  rc = pag
32990 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
329a0 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  on(pPager, pPage
329b0 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20  r->setMaster);. 
329c0 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
329d0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
329e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
329f0 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20  ck all changes. 
32a00 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c  The database fal
32a10 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  ls back to PAGER
32a20 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a  _SHARED mode..**
32a30 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
32a40 6e 20 70 65 72 66 6f 72 6d 73 20 74 77 6f 20 74  n performs two t
32a50 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  asks:.**.**   1)
32a60 20 49 74 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74   It rolls back t
32a70 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
32a80 20 72 65 73 74 6f 72 69 6e 67 20 61 6c 6c 20 64   restoring all d
32a90 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
32aa0 20 0a 2a 2a 20 20 20 20 20 20 69 6e 2d 6d 65 6d   .**      in-mem
32ab0 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20  ory cache pages 
32ac0 74 6f 20 74 68 65 20 73 74 61 74 65 20 74 68 65  to the state the
32ad0 79 20 77 65 72 65 20 69 6e 20 77 68 65 6e 20 74  y were in when t
32ae0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  he transaction.*
32af0 2a 20 20 20 20 20 20 77 61 73 20 6f 70 65 6e 65  *      was opene
32b00 64 2c 20 61 6e 64 0a 2a 2a 20 20 20 32 29 20 49  d, and.**   2) I
32b10 74 20 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20  t finalizes the 
32b20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 6f  journal file, so
32b30 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
32b40 75 73 65 64 20 66 6f 72 20 68 6f 74 0a 2a 2a 20  used for hot.** 
32b50 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 61 74       rollback at
32b60 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20 74 68   any point in th
32b70 65 20 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  e future..**.** 
32b80 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 66  subject to the f
32b90 6f 6c 6c 6f 77 69 6e 67 20 71 75 61 6c 69 66 69  ollowing qualifi
32ba0 63 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 2a  cations:.**.** *
32bb0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
32bc0 66 69 6c 65 20 69 73 20 6e 6f 74 20 79 65 74 20  file is not yet 
32bd0 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66  open when this f
32be0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
32bf0 64 2c 0a 2a 2a 20 20 20 74 68 65 6e 20 6f 6e 6c  d,.**   then onl
32c00 79 20 28 32 29 20 69 73 20 70 65 72 66 6f 72 6d  y (2) is perform
32c10 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
32c20 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6a 6f 75   there is no jou
32c30 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 74  rnal file.**   t
32c40 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a 2a 0a  o roll back..**.
32c50 2a 2a 20 2a 20 49 66 20 69 6e 20 61 6e 20 65 72  ** * If in an er
32c60 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20  ror state other 
32c70 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  than SQLITE_FULL
32c80 2c 20 74 68 65 6e 20 74 61 73 6b 20 28 31 29 20  , then task (1) 
32c90 69 73 20 0a 2a 2a 20 20 20 70 65 72 66 6f 72 6d  is .**   perform
32ca0 65 64 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  ed. If successfu
32cb0 6c 2c 20 74 61 73 6b 20 28 32 29 2e 20 52 65 67  l, task (2). Reg
32cc0 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f  ardless of the o
32cd0 75 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66 20 65  utcome.**   of e
32ce0 69 74 68 65 72 2c 20 74 68 65 20 65 72 72 6f 72  ither, the error
32cf0 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64   state error cod
32d00 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
32d10 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20   the caller.**  
32d20 20 28 69 2e 65 2e 20 65 69 74 68 65 72 20 53 51   (i.e. either SQ
32d30 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51  LITE_IOERR or SQ
32d40 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a  LITE_CORRUPT)..*
32d50 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20 70 61  *.** * If the pa
32d60 67 65 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f  ger is in PAGER_
32d70 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
32d80 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29  then attempt (1)
32d90 2e 20 57 68 65 74 68 65 72 0a 2a 2a 20 20 20 6f  . Whether.**   o
32da0 72 20 6e 6f 74 20 28 31 29 20 69 73 20 73 75 63  r not (1) is suc
32db0 63 65 73 73 66 75 6c 2c 20 61 6c 73 6f 20 61 74  cessful, also at
32dc0 74 65 6d 70 74 20 28 32 29 2e 20 49 66 20 73 75  tempt (2). If su
32dd0 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
32de0 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2e  .**   SQLITE_OK.
32df0 20 4f 74 68 65 72 77 69 73 65 2c 20 65 6e 74 65   Otherwise, ente
32e00 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
32e10 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  e and return the
32e20 20 66 69 72 73 74 20 0a 2a 2a 20 20 20 65 72 72   first .**   err
32e30 6f 72 20 63 6f 64 65 20 65 6e 63 6f 75 6e 74 65  or code encounte
32e40 72 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49 6e  red. .**.**   In
32e50 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
32e60 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
32e70 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
32e80 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f 2e 20  was written to. 
32e90 0a 2a 2a 20 20 20 53 6f 20 69 73 20 73 61 66 65  .**   So is safe
32ea0 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
32eb0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 76   journal file ev
32ec0 65 6e 20 69 66 20 74 68 65 20 70 6c 61 79 62 61  en if the playba
32ed0 63 6b 20 0a 2a 2a 20 20 20 28 6f 70 65 72 61 74  ck .**   (operat
32ee0 69 6f 6e 20 31 29 20 66 61 69 6c 65 64 2e 20 48  ion 1) failed. H
32ef0 6f 77 65 76 65 72 20 74 68 65 20 70 61 67 65 72  owever the pager
32f00 20 6d 75 73 74 20 65 6e 74 65 72 20 74 68 65 20   must enter the 
32f10 65 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20  error state.**  
32f20 20 61 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   as the contents
32f30 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   of the in-memor
32f40 79 20 63 61 63 68 65 20 61 72 65 20 6e 6f 77 20  y cache are now 
32f50 73 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 2a  suspect..**.** *
32f60 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 69 6e 20   Finally, if in 
32f70 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
32f80 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74 74 65  state, then atte
32f90 6d 70 74 20 28 31 29 2e 20 4f 6e 6c 79 0a 2a 2a  mpt (1). Only.**
32fa0 20 20 20 61 74 74 65 6d 70 74 20 28 32 29 20 69     attempt (2) i
32fb0 66 20 28 31 29 20 69 73 20 73 75 63 63 65 73 73  f (1) is success
32fc0 66 75 6c 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ful. Return SQLI
32fd0 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
32fe0 66 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65 72 77  ful,.**   otherw
32ff0 69 73 65 20 65 6e 74 65 72 20 74 68 65 20 65 72  ise enter the er
33000 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72 65  ror state and re
33010 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
33020 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a  ode from the .**
33030 20 20 20 66 61 69 6c 69 6e 67 20 6f 70 65 72 61     failing opera
33040 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e  tion..**.**   In
33050 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 64   this case the d
33060 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61 79  atabase file may
33070 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
33080 65 6e 20 74 6f 2e 20 53 6f 20 69 66 20 74 68 65  en to. So if the
33090 0a 2a 2a 20 20 20 70 6c 61 79 62 61 63 6b 20 6f  .**   playback o
330a0 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74  peration did not
330b0 20 73 75 63 63 65 65 64 20 69 74 20 77 6f 75 6c   succeed it woul
330c0 64 20 6e 6f 74 20 62 65 20 73 61 66 65 20 74 6f  d not be safe to
330d0 20 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20 74   finalize.**   t
330e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
330f0 20 49 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   It needs to be 
33100 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
33110 2d 73 79 73 74 65 6d 20 73 6f 20 74 68 61 74 0a  -system so that.
33120 2a 2a 20 20 20 73 6f 6d 65 20 6f 74 68 65 72 20  **   some other 
33130 70 72 6f 63 65 73 73 20 63 61 6e 20 75 73 65 20  process can use 
33140 69 74 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  it to restore th
33150 65 20 64 61 74 61 62 61 73 65 20 73 74 61 74 65  e database state
33160 20 28 62 79 0a 2a 2a 20 20 20 68 6f 74 2d 6a 6f   (by.**   hot-jo
33170 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
33180 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
33190 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67  agerRollback(Pag
331a0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
331b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
331c0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
331d0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
331e0 64 65 20 2a 2f 0a 20 20 50 41 47 45 52 54 52 41  de */.  PAGERTRA
331f0 43 45 28 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64  CE(("ROLLBACK %d
33200 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
33210 67 65 72 29 29 29 3b 0a 20 20 69 66 28 20 70 61  ger)));.  if( pa
33220 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
33230 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  ) ){.    int rc2
33240 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
33250 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e  te3PagerSavepoin
33260 74 28 70 50 61 67 65 72 2c 20 53 41 56 45 50 4f  t(pPager, SAVEPO
33270 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 2d 31  INT_ROLLBACK, -1
33280 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67  );.    rc2 = pag
33290 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
332a0 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  on(pPager, pPage
332b0 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20  r->setMaster);. 
332c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
332d0 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b  E_OK ) rc = rc2;
332e0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
332f0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
33300 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  );.  }else if( !
33310 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
33320 65 64 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50  ed || !isOpen(pP
33330 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
33340 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
33350 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
33360 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74  ger, pPager->set
33370 4d 61 73 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65  Master);.  }else
33380 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
33390 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
333a0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
333b0 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20  FULL ){.    if( 
333c0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
333d0 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
333e0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c  {.      pager_pl
333f0 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30  ayback(pPager, 0
33400 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
33410 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
33420 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
33430 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
33440 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
33450 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  D ){.      int r
33460 63 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  c2;.      rc = p
33470 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
33480 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
33490 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f  rc2 = pager_end_
334a0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
334b0 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  er, pPager->setM
334c0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66  aster);.      if
334d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
334e0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
334f0 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc2;.      }.   
33500 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
33510 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
33520 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
33530 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d 45    }..    if( !ME
33540 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MDB ){.      pPa
33550 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
33560 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
33570 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
33580 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
33590 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e  ROLLBACK, we can
335a0 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74   no longer trust
335b0 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
335c0 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c  * cache. So call
335d0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f   pager_error() o
335e0 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f  n the way out to
335f0 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20   make any error 
33600 0a 20 20 20 20 2a 2a 20 70 65 72 73 69 73 74 65  .    ** persiste
33610 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  nt..    */.    r
33620 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28  c = pager_error(
33630 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d  pPager, rc);.  }
33640 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
33650 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
33660 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61  UE if the databa
33670 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  se file is opene
33680 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65  d read-only.  Re
33690 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
336a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
336b0 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69   (in theory) wri
336c0 74 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c  table..*/.u8 sql
336d0 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f  ite3PagerIsreado
336e0 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65  nly(Pager *pPage
336f0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
33700 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d  ger->readOnly;.}
33710 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
33720 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
33730 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
33740 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ager..*/.int sql
33750 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
33760 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
33770 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
33780 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
33790 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
337a0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
337b0 72 6e 20 74 68 65 20 61 70 70 72 6f 78 69 6d 61  rn the approxima
337c0 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  te number of byt
337d0 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 63 75 72  es of memory cur
337e0 72 65 6e 74 6c 79 0a 2a 2a 20 75 73 65 64 20 62  rently.** used b
337f0 79 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20  y the pager and 
33800 69 74 73 20 61 73 73 6f 63 69 61 74 65 64 20 63  its associated c
33810 61 63 68 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ache..*/.int sql
33820 69 74 65 33 50 61 67 65 72 4d 65 6d 55 73 65 64  ite3PagerMemUsed
33830 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
33840 0a 20 20 69 6e 74 20 70 65 72 50 61 67 65 53 69  .  int perPageSi
33850 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
33860 65 53 69 7a 65 20 2b 20 70 50 61 67 65 72 2d 3e  eSize + pPager->
33870 6e 45 78 74 72 61 20 2b 20 32 30 3b 0a 20 20 72  nExtra + 20;.  r
33880 65 74 75 72 6e 20 70 65 72 50 61 67 65 53 69 7a  eturn perPageSiz
33890 65 2a 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  e*sqlite3PcacheP
338a0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d  agecount(pPager-
338b0 3e 70 50 43 61 63 68 65 29 0a 20 20 20 20 20 20  >pPCache).      
338c0 20 20 20 20 20 2b 20 73 71 6c 69 74 65 33 4d 61       + sqlite3Ma
338d0 6c 6c 6f 63 53 69 7a 65 28 70 50 61 67 65 72 29  llocSize(pPager)
338e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
338f0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
33900 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
33910 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
33920 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
33930 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
33940 74 28 44 62 50 61 67 65 20 2a 70 50 61 67 65 29  t(DbPage *pPage)
33950 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
33960 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63  e3PcachePageRefc
33970 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d 0a 0a  ount(pPage);.}..
33980 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
33990 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ST./*.** This ro
339a0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
339b0 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
339c0 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  alysis only..*/.
339d0 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65  int *sqlite3Page
339e0 72 53 74 61 74 73 28 50 61 67 65 72 20 2a 70 50  rStats(Pager *pP
339f0 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20  ager){.  static 
33a00 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30  int a[11];.  a[0
33a10 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  ] = sqlite3Pcach
33a20 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
33a30 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b  ->pPCache);.  a[
33a40 31 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  1] = sqlite3Pcac
33a50 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
33a60 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
33a70 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33 50 63  a[2] = sqlite3Pc
33a80 61 63 68 65 47 65 74 43 61 63 68 65 73 69 7a 65  acheGetCachesize
33a90 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
33aa0 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67  );.  a[3] = pPag
33ab0 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
33ac0 3f 20 28 69 6e 74 29 20 70 50 61 67 65 72 2d 3e  ? (int) pPager->
33ad0 64 62 53 69 7a 65 20 3a 20 2d 31 3b 0a 20 20 61  dbSize : -1;.  a
33ae0 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  [4] = pPager->st
33af0 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50  ate;.  a[5] = pP
33b00 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
33b10 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[6] = pPager->
33b20 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70  nHit;.  a[7] = p
33b30 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20  Pager->nMiss;.  
33b40 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73  a[8] = 0;  /* Us
33b50 65 64 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d  ed to be pPager-
33b60 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d  >nOvfl */.  a[9]
33b70 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64   = pPager->nRead
33b80 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67  ;.  a[10] = pPag
33b90 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65  er->nWrite;.  re
33ba0 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66  turn a;.}.#endif
33bb0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
33bc0 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
33bd0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  n in-memory page
33be0 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
33bf0 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28 50 61  3PagerIsMemdb(Pa
33c00 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
33c10 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a  return MEMDB;.}.
33c20 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61  ./*.** Check tha
33c30 74 20 74 68 65 72 65 20 61 72 65 20 61 74 20 6c  t there are at l
33c40 65 61 73 74 20 6e 53 61 76 65 70 6f 69 6e 74 20  east nSavepoint 
33c50 73 61 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2e  savepoints open.
33c60 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a   If there are.**
33c70 20 63 75 72 72 65 6e 74 6c 79 20 6c 65 73 73 20   currently less 
33c80 74 68 61 6e 20 6e 53 61 76 65 70 6f 69 6e 74 73  than nSavepoints
33c90 20 6f 70 65 6e 2c 20 74 68 65 6e 20 6f 70 65 6e   open, then open
33ca0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76   one or more sav
33cb0 65 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 6d 61  epoints.** to ma
33cc0 6b 65 20 75 70 20 74 68 65 20 64 69 66 66 65 72  ke up the differ
33cd0 65 6e 63 65 2e 20 49 66 20 74 68 65 20 6e 75 6d  ence. If the num
33ce0 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74  ber of savepoint
33cf0 73 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20  s is already.** 
33d00 65 71 75 61 6c 20 74 6f 20 6e 53 61 76 65 70 6f  equal to nSavepo
33d10 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66  int, then this f
33d20 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
33d30 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  op..**.** If a m
33d40 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
33d50 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e   fails, SQLITE_N
33d60 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
33d70 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a  . If an error .*
33d80 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f  * occurs while o
33d90 70 65 6e 69 6e 67 20 74 68 65 20 73 75 62 2d 6a  pening the sub-j
33da0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
33db0 6e 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  n an IO error co
33dc0 64 65 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  de is.** returne
33dd0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  d. Otherwise, SQ
33de0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
33df0 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
33e00 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
33e10 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 53 61  *pPager, int nSa
33e20 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20  vepoint){.  int 
33e30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
33e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e50 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
33e60 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  code */.  int nC
33e70 75 72 72 65 6e 74 20 3d 20 70 50 61 67 65 72 2d  urrent = pPager-
33e80 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20  >nSavepoint;    
33e90 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e      /* Current n
33ea0 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
33eb0 6e 74 73 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 53  nts */..  if( nS
33ec0 61 76 65 70 6f 69 6e 74 3e 6e 43 75 72 72 65 6e  avepoint>nCurren
33ed0 74 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65  t && pPager->use
33ee0 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69  Journal ){.    i
33ef0 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
33f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f10 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
33f20 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
33f30 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
33f40 74 20 2a 61 4e 65 77 3b 20 20 20 20 20 20 20 20  t *aNew;        
33f50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
33f60 77 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  w Pager.aSavepoi
33f70 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  nt array */.    
33f80 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
33f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33fa0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
33fb0 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  of database file
33fc0 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20 73 71   */..    rc = sq
33fd0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
33fe0 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
33ff0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
34000 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
34010 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 50 61    /* Grow the Pa
34020 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
34030 72 72 61 79 20 75 73 69 6e 67 20 72 65 61 6c 6c  rray using reall
34040 6f 63 28 29 2e 20 52 65 74 75 72 6e 20 53 51 4c  oc(). Return SQL
34050 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20 20 2a 2a  ITE_NOMEM.    **
34060 20 69 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69   if the allocati
34070 6f 6e 20 66 61 69 6c 73 2e 20 4f 74 68 65 72 77  on fails. Otherw
34080 69 73 65 2c 20 7a 65 72 6f 20 74 68 65 20 6e 65  ise, zero the ne
34090 77 20 70 6f 72 74 69 6f 6e 20 69 6e 20 63 61 73  w portion in cas
340a0 65 20 61 20 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c  e a .    ** mall
340b0 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  oc failure occur
340c0 73 20 77 68 69 6c 65 20 70 6f 70 75 6c 61 74 69  s while populati
340d0 6e 67 20 69 74 20 69 6e 20 74 68 65 20 66 6f 72  ng it in the for
340e0 28 2e 2e 2e 29 20 6c 6f 6f 70 20 62 65 6c 6f 77  (...) loop below
340f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 4e 65  ..    */.    aNe
34100 77 20 3d 20 28 50 61 67 65 72 53 61 76 65 70 6f  w = (PagerSavepo
34110 69 6e 74 20 2a 29 73 71 6c 69 74 65 33 52 65 61  int *)sqlite3Rea
34120 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70 50  lloc(.        pP
34130 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
34140 2c 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61  , sizeof(PagerSa
34150 76 65 70 6f 69 6e 74 29 2a 6e 53 61 76 65 70 6f  vepoint)*nSavepo
34160 69 6e 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  int.    );.    i
34170 66 28 20 21 61 4e 65 77 20 29 7b 0a 20 20 20 20  f( !aNew ){.    
34180 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
34190 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
341a0 20 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b 6e 43   memset(&aNew[nC
341b0 75 72 72 65 6e 74 5d 2c 20 30 2c 20 28 6e 53 61  urrent], 0, (nSa
341c0 76 65 70 6f 69 6e 74 2d 6e 43 75 72 72 65 6e 74  vepoint-nCurrent
341d0 29 20 2a 20 73 69 7a 65 6f 66 28 50 61 67 65 72  ) * sizeof(Pager
341e0 53 61 76 65 70 6f 69 6e 74 29 29 3b 0a 20 20 20  Savepoint));.   
341f0 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
34200 69 6e 74 20 3d 20 61 4e 65 77 3b 0a 0a 20 20 20  int = aNew;..   
34210 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65   /* Populate the
34220 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
34230 73 74 72 75 63 74 75 72 65 73 20 6a 75 73 74 20  structures just 
34240 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a 20 20  allocated. */.  
34250 20 20 66 6f 72 28 69 69 3d 6e 43 75 72 72 65 6e    for(ii=nCurren
34260 74 3b 20 69 69 3c 6e 53 61 76 65 70 6f 69 6e 74  t; ii<nSavepoint
34270 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
34280 4e 65 77 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d 20  New[ii].nOrig = 
34290 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28  nPage;.      if(
342a0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
342b0 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e  jfd) && pPager->
342c0 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 29 7b 0a  journalOff>0 ){.
342d0 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d          aNew[ii]
342e0 2e 69 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  .iOffset = pPage
342f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
34300 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34310 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66      aNew[ii].iOf
34320 66 73 65 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48  fset = JOURNAL_H
34330 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
34340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 4e 65       }.      aNe
34350 77 5b 69 69 5d 2e 69 53 75 62 52 65 63 20 3d 20  w[ii].iSubRec = 
34360 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b  pPager->nSubRec;
34370 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e  .      aNew[ii].
34380 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 73  pInSavepoint = s
34390 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
343a0 74 65 28 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  te(nPage);.     
343b0 20 69 66 28 20 21 61 4e 65 77 5b 69 69 5d 2e 70   if( !aNew[ii].p
343c0 49 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20  InSavepoint ){. 
343d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
343e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
343f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 61    }.      if( pa
34400 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
34410 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
34420 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74  ite3WalSavepoint
34430 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 61  (pPager->pWal, a
34440 4e 65 77 5b 69 69 5d 2e 61 57 61 6c 44 61 74 61  New[ii].aWalData
34450 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
34460 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
34470 69 6e 74 20 3d 20 69 69 2b 31 3b 0a 20 20 20 20  int = ii+1;.    
34480 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
34490 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
344a0 3d 3d 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a  ==nSavepoint );.
344b0 20 20 20 20 61 73 73 65 72 74 54 72 75 6e 63 61      assertTrunca
344c0 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  teConstraint(pPa
344d0 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ger);.  }..  ret
344e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
344f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
34500 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c  s called to roll
34510 62 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 20  back or release 
34520 28 63 6f 6d 6d 69 74 29 20 61 20 73 61 76 65 70  (commit) a savep
34530 6f 69 6e 74 2e 0a 2a 2a 20 54 68 65 20 73 61 76  oint..** The sav
34540 65 70 6f 69 6e 74 20 74 6f 20 72 65 6c 65 61 73  epoint to releas
34550 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65  e or rollback ne
34560 65 64 20 6e 6f 74 20 62 65 20 74 68 65 20 6d 6f  ed not be the mo
34570 73 74 20 72 65 63 65 6e 74 6c 79 20 0a 2a 2a 20  st recently .** 
34580 63 72 65 61 74 65 64 20 73 61 76 65 70 6f 69 6e  created savepoin
34590 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  t..**.** Paramet
345a0 65 72 20 6f 70 20 69 73 20 61 6c 77 61 79 73 20  er op is always 
345b0 65 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54  either SAVEPOINT
345c0 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 20 53 41 56  _ROLLBACK or SAV
345d0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 0a  EPOINT_RELEASE..
345e0 2a 2a 20 49 66 20 69 74 20 69 73 20 53 41 56 45  ** If it is SAVE
345f0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74  POINT_RELEASE, t
34600 68 65 6e 20 72 65 6c 65 61 73 65 20 61 6e 64 20  hen release and 
34610 64 65 73 74 72 6f 79 20 74 68 65 20 73 61 76 65  destroy the save
34620 70 6f 69 6e 74 20 77 69 74 68 0a 2a 2a 20 69 6e  point with.** in
34630 64 65 78 20 69 53 61 76 65 70 6f 69 6e 74 2e 20  dex iSavepoint. 
34640 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49  If it is SAVEPOI
34650 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
34660 6e 20 72 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63  n rollback all c
34670 68 61 6e 67 65 73 0a 2a 2a 20 74 68 61 74 20 68  hanges.** that h
34680 61 76 65 20 6f 63 63 75 72 72 65 64 20 73 69 6e  ave occurred sin
34690 63 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ce the specified
346a0 20 73 61 76 65 70 6f 69 6e 74 20 77 61 73 20 63   savepoint was c
346b0 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  reated..**.** Th
346c0 65 20 73 61 76 65 70 6f 69 6e 74 20 74 6f 20 72  e savepoint to r
346d0 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65 61  ollback or relea
346e0 73 65 20 69 73 20 69 64 65 6e 74 69 66 69 65 64  se is identified
346f0 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 0a 2a   by parameter .*
34700 2a 20 69 53 61 76 65 70 6f 69 6e 74 2e 20 41 20  * iSavepoint. A 
34710 76 61 6c 75 65 20 6f 66 20 30 20 6d 65 61 6e 73  value of 0 means
34720 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
34730 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73 61 76  he outermost sav
34740 65 70 6f 69 6e 74 0a 2a 2a 20 28 74 68 65 20 66  epoint.** (the f
34750 69 72 73 74 20 63 72 65 61 74 65 64 29 2e 20 41  irst created). A
34760 20 76 61 6c 75 65 20 6f 66 20 28 50 61 67 65 72   value of (Pager
34770 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29 20 6d  .nSavepoint-1) m
34780 65 61 6e 73 20 6f 70 65 72 61 74 65 0a 2a 2a 20  eans operate.** 
34790 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
347a0 6e 74 6c 79 20 63 72 65 61 74 65 64 20 73 61 76  ntly created sav
347b0 65 70 6f 69 6e 74 2e 20 49 66 20 69 53 61 76 65  epoint. If iSave
347c0 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72  point is greater
347d0 20 74 68 61 6e 0a 2a 2a 20 28 50 61 67 65 72 2e   than.** (Pager.
347e0 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29 2c 20 74  nSavepoint-1), t
347f0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
34800 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
34810 0a 2a 2a 20 49 66 20 61 20 6e 65 67 61 74 69 76  .** If a negativ
34820 65 20 76 61 6c 75 65 20 69 73 20 70 61 73 73 65  e value is passe
34830 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
34840 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  on, then the cur
34850 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  rent.** transact
34860 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
34870 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66  ck. This is diff
34880 65 72 65 6e 74 20 74 6f 20 63 61 6c 6c 69 6e 67  erent to calling
34890 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65   .** sqlite3Page
348a0 72 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65 63 61  rRollback() beca
348b0 75 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  use this functio
348c0 6e 20 64 6f 65 73 20 6e 6f 74 20 74 65 72 6d 69  n does not termi
348d0 6e 61 74 65 0a 2a 2a 20 74 68 65 20 74 72 61 6e  nate.** the tran
348e0 73 61 63 74 69 6f 6e 20 6f 72 20 75 6e 6c 6f 63  saction or unloc
348f0 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  k the database, 
34900 69 74 20 6a 75 73 74 20 72 65 73 74 6f 72 65 73  it just restores
34910 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
34920 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
34930 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
34940 6c 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20  l state. .**.** 
34950 49 6e 20 61 6e 79 20 63 61 73 65 2c 20 61 6c 6c  In any case, all
34960 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69 74 68   savepoints with
34970 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65   an index greate
34980 72 20 74 68 61 6e 20 69 53 61 76 65 70 6f 69 6e  r than iSavepoin
34990 74 20 0a 2a 2a 20 61 72 65 20 64 65 73 74 72 6f  t .** are destro
349a0 79 65 64 2e 20 49 66 20 74 68 69 73 20 69 73 20  yed. If this is 
349b0 61 20 72 65 6c 65 61 73 65 20 6f 70 65 72 61 74  a release operat
349c0 69 6f 6e 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49  ion (op==SAVEPOI
349d0 4e 54 5f 52 45 4c 45 41 53 45 29 2c 0a 2a 2a 20  NT_RELEASE),.** 
349e0 74 68 65 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  then savepoint i
349f0 53 61 76 65 70 6f 69 6e 74 20 69 73 20 61 6c 73  Savepoint is als
34a00 6f 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a  o destroyed..**.
34a10 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
34a20 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
34a30 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 65  TE_NOMEM if a me
34a40 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
34a50 66 61 69 6c 73 2c 0a 2a 2a 20 6f 72 20 61 6e 20  fails,.** or an 
34a60 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  IO error code if
34a70 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
34a80 75 72 73 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e  urs while rollin
34a90 67 20 62 61 63 6b 20 61 20 0a 2a 2a 20 73 61 76  g back a .** sav
34aa0 65 70 6f 69 6e 74 2e 20 49 66 20 6e 6f 20 65 72  epoint. If no er
34ab0 72 6f 72 73 20 6f 63 63 75 72 2c 20 53 51 4c 49  rors occur, SQLI
34ac0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
34ad0 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74  d..*/ .int sqlit
34ae0 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e3PagerSavepoint
34af0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
34b00 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76  int op, int iSav
34b10 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72  epoint){.  int r
34b20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
34b30 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41    assert( op==SA
34b40 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
34b50 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  || op==SAVEPOINT
34b60 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 61  _ROLLBACK );.  a
34b70 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e  ssert( iSavepoin
34b80 74 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 53 41 56 45  t>=0 || op==SAVE
34b90 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
34ba0 3b 0a 0a 20 20 69 66 28 20 69 53 61 76 65 70 6f  ;..  if( iSavepo
34bb0 69 6e 74 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76  int<pPager->nSav
34bc0 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 69 6e  epoint ){.    in
34bd0 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
34be0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
34bf0 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  iable */.    int
34c00 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20   nNew;          
34c10 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 6d  /* Number of rem
34c20 61 69 6e 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  aining savepoint
34c30 73 20 61 66 74 65 72 20 74 68 69 73 20 6f 70 2e  s after this op.
34c40 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75   */..    /* Figu
34c50 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
34c60 73 61 76 65 70 6f 69 6e 74 73 20 77 69 6c 6c 20  savepoints will 
34c70 73 74 69 6c 6c 20 62 65 20 61 63 74 69 76 65 20  still be active 
34c80 61 66 74 65 72 20 74 68 69 73 0a 20 20 20 20 2a  after this.    *
34c90 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53 74 6f  * operation. Sto
34ca0 72 65 20 74 68 69 73 20 76 61 6c 75 65 20 69 6e  re this value in
34cb0 20 6e 4e 65 77 2e 20 54 68 65 6e 20 66 72 65 65   nNew. Then free
34cc0 20 72 65 73 6f 75 72 63 65 73 20 61 73 73 6f 63   resources assoc
34cd0 69 61 74 65 64 20 0a 20 20 20 20 2a 2a 20 77 69  iated .    ** wi
34ce0 74 68 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74  th any savepoint
34cf0 73 20 74 68 61 74 20 61 72 65 20 64 65 73 74 72  s that are destr
34d00 6f 79 65 64 20 62 79 20 74 68 69 73 20 6f 70 65  oyed by this ope
34d10 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ration..    */. 
34d20 20 20 20 6e 4e 65 77 20 3d 20 69 53 61 76 65 70     nNew = iSavep
34d30 6f 69 6e 74 20 2b 20 28 28 20 6f 70 3d 3d 53 41  oint + (( op==SA
34d40 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
34d50 29 20 3f 20 30 20 3a 20 31 29 3b 0a 20 20 20 20  ) ? 0 : 1);.    
34d60 66 6f 72 28 69 69 3d 6e 4e 65 77 3b 20 69 69 3c  for(ii=nNew; ii<
34d70 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
34d80 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  nt; ii++){.     
34d90 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
34da0 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53  stroy(pPager->aS
34db0 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e  avepoint[ii].pIn
34dc0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
34dd0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53  }.    pPager->nS
34de0 61 76 65 70 6f 69 6e 74 20 3d 20 6e 4e 65 77 3b  avepoint = nNew;
34df0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
34e00 20 69 73 20 61 20 72 65 6c 65 61 73 65 20 6f 66   is a release of
34e10 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73   the outermost s
34e20 61 76 65 70 6f 69 6e 74 2c 20 74 72 75 6e 63 61  avepoint, trunca
34e30 74 65 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  te .    ** the s
34e40 75 62 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 7a 65  ub-journal to ze
34e50 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
34e60 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 70 3d  . */.    if( op=
34e70 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
34e80 53 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  SE ){.      if( 
34e90 6e 4e 65 77 3d 3d 30 20 26 26 20 69 73 4f 70 65  nNew==0 && isOpe
34ea0 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
34eb0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ){.        /* On
34ec0 6c 79 20 74 72 75 6e 63 61 74 65 20 69 66 20 69  ly truncate if i
34ed0 74 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  t is an in-memor
34ee0 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a  y sub-journal. *
34ef0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  /.        if( sq
34f00 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61  lite3IsMemJourna
34f10 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  l(pPager->sjfd) 
34f20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
34f30 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
34f40 61 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ate(pPager->sjfd
34f50 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
34f60 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
34f70 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
34f80 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
34f90 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a  r->nSubRec = 0;.
34fa0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
34fb0 20 20 2f 2a 20 45 6c 73 65 20 74 68 69 73 20 69    /* Else this i
34fc0 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
34fd0 72 61 74 69 6f 6e 2c 20 70 6c 61 79 62 61 63 6b  ration, playback
34fe0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 73   the specified s
34ff0 61 76 65 70 6f 69 6e 74 2e 0a 20 20 20 20 2a 2a  avepoint..    **
35000 20 49 66 20 74 68 69 73 20 69 73 20 61 20 74 65   If this is a te
35010 6d 70 2d 66 69 6c 65 2c 20 69 74 20 69 73 20 70  mp-file, it is p
35020 6f 73 73 69 62 6c 65 20 74 68 61 74 20 74 68 65  ossible that the
35030 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
35040 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 79 65 74  s.    ** not yet
35050 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 20 49 6e   been opened. In
35060 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
35070 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20 63 68   have been no ch
35080 61 6e 67 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20  anges to.    ** 
35090 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
350a0 65 2c 20 73 6f 20 74 68 65 20 70 6c 61 79 62 61  e, so the playba
350b0 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 63 61 6e  ck operation can
350c0 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 20   be skipped..   
350d0 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
350e0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
350f0 67 65 72 29 20 7c 7c 20 69 73 4f 70 65 6e 28 70  ger) || isOpen(p
35100 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
35110 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
35120 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 20  int *pSavepoint 
35130 3d 20 28 6e 4e 65 77 3d 3d 30 29 3f 30 3a 26 70  = (nNew==0)?0:&p
35140 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
35150 74 5b 6e 4e 65 77 2d 31 5d 3b 0a 20 20 20 20 20  t[nNew-1];.     
35160 20 72 63 20 3d 20 70 61 67 65 72 50 6c 61 79 62   rc = pagerPlayb
35170 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 70 50 61  ackSavepoint(pPa
35180 67 65 72 2c 20 70 53 61 76 65 70 6f 69 6e 74 29  ger, pSavepoint)
35190 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 72  ;.      assert(r
351a0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 29 3b  c!=SQLITE_DONE);
351b0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 7d 0a 20 20  .    }.  .  }.  
351c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
351d0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
351e0 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
351f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
35200 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
35210 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69   *sqlite3PagerFi
35220 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  lename(Pager *pP
35230 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
35240 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
35250 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
35260 72 6e 20 74 68 65 20 56 46 53 20 73 74 72 75 63  rn the VFS struc
35270 74 75 72 65 20 66 6f 72 20 74 68 65 20 70 61 67  ture for the pag
35280 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c  er..*/.const sql
35290 69 74 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65  ite3_vfs *sqlite
352a0 33 50 61 67 65 72 56 66 73 28 50 61 67 65 72 20  3PagerVfs(Pager 
352b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
352c0 72 6e 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b  rn pPager->pVfs;
352d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
352e0 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65   the file handle
352f0 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
35300 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  e file associate
35310 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 70 61  d.** with the pa
35320 67 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74  ger.  This might
35330 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   return NULL if 
35340 74 68 65 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20  the file has.** 
35350 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
35360 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  ned..*/.sqlite3_
35370 66 69 6c 65 20 2a 73 71 6c 69 74 65 33 50 61 67  file *sqlite3Pag
35380 65 72 46 69 6c 65 28 50 61 67 65 72 20 2a 70 50  erFile(Pager *pP
35390 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
353a0 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f  pPager->fd;.}../
353b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
353c0 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
353d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
353e0 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
353f0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f   *sqlite3PagerJo
35400 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20  urnalname(Pager 
35410 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
35420 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  rn pPager->zJour
35430 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nal;.}../*.** Re
35440 74 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79  turn true if fsy
35450 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64  nc() calls are d
35460 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73  isabled for this
35470 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20   pager.  Return 
35480 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e  FALSE.** if fsyn
35490 63 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65  c()s are execute
354a0 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69  d normally..*/.i
354b0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e  nt sqlite3PagerN
354c0 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  osync(Pager *pPa
354d0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
354e0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d  Pager->noSync;.}
354f0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
35500 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20  HAS_CODEC./*.** 
35510 53 65 74 20 6f 72 20 72 65 74 72 69 65 76 65 20  Set or retrieve 
35520 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68  the codec for th
35530 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64  is pager.*/.void
35540 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
35550 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a  Codec(.  Pager *
35560 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a  pPager,.  void *
35570 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
35580 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c  void*,Pgno,int),
35590 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
355a0 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c  SizeChng)(void*,
355b0 69 6e 74 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64  int,int),.  void
355c0 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76   (*xCodecFree)(v
355d0 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 20 2a 70  oid*),.  void *p
355e0 43 6f 64 65 63 0a 29 7b 0a 20 20 69 66 28 20 70  Codec.){.  if( p
355f0 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65  Pager->xCodecFre
35600 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  e ) pPager->xCod
35610 65 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  ecFree(pPager->p
35620 43 6f 64 65 63 29 3b 0a 20 20 70 50 61 67 65 72  Codec);.  pPager
35630 2d 3e 78 43 6f 64 65 63 20 3d 20 70 50 61 67 65  ->xCodec = pPage
35640 72 2d 3e 6d 65 6d 44 62 20 3f 20 30 20 3a 20 78  r->memDb ? 0 : x
35650 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d  Codec;.  pPager-
35660 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20  >xCodecSizeChng 
35670 3d 20 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  = xCodecSizeChng
35680 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  ;.  pPager->xCod
35690 65 63 46 72 65 65 20 3d 20 78 43 6f 64 65 63 46  ecFree = xCodecF
356a0 72 65 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  ree;.  pPager->p
356b0 43 6f 64 65 63 20 3d 20 70 43 6f 64 65 63 3b 0a  Codec = pCodec;.
356c0 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a    pagerReportSiz
356d0 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 76 6f 69  e(pPager);.}.voi
356e0 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47  d *sqlite3PagerG
356f0 65 74 43 6f 64 65 63 28 50 61 67 65 72 20 2a 70  etCodec(Pager *p
35700 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
35710 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 3b   pPager->pCodec;
35720 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
35730 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
35740 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
35750 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 70 50  Move the page pP
35760 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67  g to location pg
35770 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 0a  no in the file..
35780 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  **.** There must
35790 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   be no reference
357a0 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 72  s to the page pr
357b0 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64  eviously located
357c0 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69   at.** pgno (whi
357d0 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c  ch we call pPgOl
357e0 64 29 20 74 68 6f 75 67 68 20 74 68 61 74 20 70  d) though that p
357f0 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  age is allowed t
35800 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65  o be.** in cache
35810 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 70  .  If the page p
35820 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65  reviously locate
35830 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74  d at pgno is not
35840 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74   already.** in t
35850 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
35860 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  nal, it is not p
35870 75 74 20 74 68 65 72 65 20 62 79 20 62 79 20 74  ut there by by t
35880 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
35890 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f  ** References to
358a0 20 74 68 65 20 70 61 67 65 20 70 50 67 20 72 65   the page pPg re
358b0 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61  main valid. Upda
358c0 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61  ting any.** meta
358d0 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64  -data associated
358e0 20 77 69 74 68 20 70 50 67 20 28 69 2e 65 2e 20   with pPg (i.e. 
358f0 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74  data stored in t
35900 68 65 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a  he nExtra bytes.
35910 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f  ** allocated alo
35920 6e 67 20 77 69 74 68 20 74 68 65 20 70 61 67 65  ng with the page
35930 29 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  ) is the respons
35940 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
35950 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  aller..**.** A t
35960 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
35970 62 65 20 61 63 74 69 76 65 20 77 68 65 6e 20 74  be active when t
35980 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
35990 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74  alled. It used t
359a0 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  o be.** required
359b0 20 74 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e   that a statemen
359c0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
359d0 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75  s not active, bu
359e0 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69  t this restricti
359f0 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72  on.** has been r
35a00 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20 49  emoved (CREATE I
35a10 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f  NDEX needs to mo
35a20 76 65 20 61 20 70 61 67 65 20 77 68 65 6e 20 61  ve a page when a
35a30 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72   statement.** tr
35a40 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
35a50 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ive)..**.** If t
35a60 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65  he fourth argume
35a70 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 69 73  nt, isCommit, is
35a80 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
35a90 74 68 69 73 20 70 61 67 65 20 69 73 20 62 65 69  this page is bei
35aa0 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61 73 20 70  ng.** moved as p
35ab0 61 72 74 20 6f 66 20 61 20 64 61 74 61 62 61 73  art of a databas
35ac0 65 20 72 65 6f 72 67 61 6e 69 7a 61 74 69 6f 6e  e reorganization
35ad0 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68 65   just before the
35ae0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
35af0 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74   is being commit
35b00 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ted. In this cas
35b10 65 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  e, it is guarant
35b20 65 65 64 20 74 68 61 74 20 74 68 65 20 64 61 74  eed that the dat
35b30 61 62 61 73 65 20 70 61 67 65 20 0a 2a 2a 20 70  abase page .** p
35b40 50 67 20 72 65 66 65 72 73 20 74 6f 20 77 69 6c  Pg refers to wil
35b50 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  l not be written
35b60 20 74 6f 20 61 67 61 69 6e 20 77 69 74 68 69 6e   to again within
35b70 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
35b80 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  n..**.** This fu
35b90 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72  nction may retur
35ba0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f  n SQLITE_NOMEM o
35bb0 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  r an IO error co
35bc0 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a  de if an error.*
35bd0 2a 20 6f 63 63 75 72 73 2e 20 4f 74 68 65 72 77  * occurs. Otherw
35be0 69 73 65 2c 20 69 74 20 72 65 74 75 72 6e 73 20  ise, it returns 
35bf0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
35c00 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  t sqlite3PagerMo
35c10 76 65 70 61 67 65 28 50 61 67 65 72 20 2a 70 50  vepage(Pager *pP
35c20 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70 50  ager, DbPage *pP
35c30 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 69 6e  g, Pgno pgno, in
35c40 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a 20 20 50  t isCommit){.  P
35c50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 20 20  gHdr *pPgOld;   
35c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
35c70 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 6f 76  he page being ov
35c80 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20  erwritten. */.  
35c90 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e  Pgno needSyncPgn
35ca0 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  o = 0;       /* 
35cb0 4f 6c 64 20 76 61 6c 75 65 20 6f 66 20 70 50 67  Old value of pPg
35cc0 2d 3e 70 67 6e 6f 2c 20 69 66 20 73 79 6e 63 20  ->pgno, if sync 
35cd0 69 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  is required */. 
35ce0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
35cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35d00 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
35d10 20 20 50 67 6e 6f 20 6f 72 69 67 50 67 6e 6f 3b    Pgno origPgno;
35d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35d30 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  * The original p
35d40 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20  age number */.. 
35d50 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
35d60 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e  ef>0 );..  /* In
35d70 20 6f 72 64 65 72 20 74 6f 20 62 65 20 61 62 6c   order to be abl
35d80 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  e to rollback, a
35d90 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
35da0 62 61 73 65 20 6d 75 73 74 20 6a 6f 75 72 6e 61  base must journa
35db0 6c 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  l.  ** the page 
35dc0 77 65 20 61 72 65 20 6d 6f 76 69 6e 67 20 66 72  we are moving fr
35dd0 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d  om..  */.  if( M
35de0 45 4d 44 42 20 29 7b 0a 20 20 20 20 72 63 20 3d  EMDB ){.    rc =
35df0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
35e00 74 65 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28  te(pPg);.    if(
35e10 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
35e20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
35e30 65 20 70 61 67 65 20 62 65 69 6e 67 20 6d 6f 76  e page being mov
35e40 65 64 20 69 73 20 64 69 72 74 79 20 61 6e 64 20  ed is dirty and 
35e50 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 73 61 76  has not been sav
35e60 65 64 20 62 79 20 74 68 65 20 6c 61 74 65 73 74  ed by the latest
35e70 0a 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2c  .  ** savepoint,
35e80 20 74 68 65 6e 20 73 61 76 65 20 74 68 65 20 63   then save the c
35e90 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20  urrent contents 
35ea0 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  of the page into
35eb0 20 74 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a   the .  ** sub-j
35ec0 6f 75 72 6e 61 6c 20 6e 6f 77 2e 20 54 68 69 73  ournal now. This
35ed0 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
35ee0 68 61 6e 64 6c 65 20 74 68 65 20 66 6f 6c 6c 6f  handle the follo
35ef0 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 20  wing scenario:. 
35f00 20 2a 2a 0a 20 20 2a 2a 20 20 20 42 45 47 49 4e   **.  **   BEGIN
35f10 3b 0a 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72  ;.  **     <jour
35f20 6e 61 6c 20 70 61 67 65 20 58 2c 20 74 68 65 6e  nal page X, then
35f30 20 6d 6f 64 69 66 79 20 69 74 20 69 6e 20 6d 65   modify it in me
35f40 6d 6f 72 79 3e 0a 20 20 2a 2a 20 20 20 20 20 53  mory>.  **     S
35f50 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20  AVEPOINT one;.  
35f60 2a 2a 20 20 20 20 20 20 20 3c 4d 6f 76 65 20 70  **       <Move p
35f70 61 67 65 20 58 20 74 6f 20 6c 6f 63 61 74 69 6f  age X to locatio
35f80 6e 20 59 3e 0a 20 20 2a 2a 20 20 20 20 20 52 4f  n Y>.  **     RO
35f90 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20  LLBACK TO one;. 
35fa0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 61 67 65   **.  ** If page
35fb0 20 58 20 77 65 72 65 20 6e 6f 74 20 77 72 69 74   X were not writ
35fc0 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  ten to the sub-j
35fd0 6f 75 72 6e 61 6c 20 68 65 72 65 2c 20 69 74 20  ournal here, it 
35fe0 77 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62  would not.  ** b
35ff0 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 72 65  e possible to re
36000 73 74 6f 72 65 20 69 74 73 20 63 6f 6e 74 65 6e  store its conten
36010 74 73 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c  ts when the "ROL
36020 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 22 0a 20 20  LBACK TO one".  
36030 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 72  ** statement wer
36040 65 20 69 73 20 70 72 6f 63 65 73 73 65 64 2e 0a  e is processed..
36050 20 20 2a 2a 0a 20 20 2a 2a 20 73 75 62 6a 6f 75    **.  ** subjou
36060 72 6e 61 6c 50 61 67 65 28 29 20 6d 61 79 20 6e  rnalPage() may n
36070 65 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  eed to allocate 
36080 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 70  space to store p
36090 50 67 2d 3e 70 67 6e 6f 20 69 6e 74 6f 0a 20 20  Pg->pgno into.  
360a0 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  ** one or more s
360b0 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
360c0 2e 20 54 68 69 73 20 69 73 20 74 68 65 20 72 65  . This is the re
360d0 61 73 6f 6e 20 74 68 69 73 20 66 75 6e 63 74 69  ason this functi
360e0 6f 6e 0a 20 20 2a 2a 20 6d 61 79 20 72 65 74 75  on.  ** may retu
360f0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  rn SQLITE_NOMEM.
36100 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  .  */.  if( pPg-
36110 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
36120 54 59 0a 20 20 20 26 26 20 73 75 62 6a 52 65 71  TY.   && subjReq
36130 75 69 72 65 73 50 61 67 65 28 70 50 67 29 0a 20  uiresPage(pPg). 
36140 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    && SQLITE_OK!=
36150 28 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c  (rc = subjournal
36160 50 61 67 65 28 70 50 67 29 29 0a 20 20 29 7b 0a  Page(pPg)).  ){.
36170 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
36180 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
36190 28 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20  (("MOVE %d page 
361a0 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29  %d (needSync=%d)
361b0 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c   moves to %d\n",
361c0 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28   .      PAGERID(
361d0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
361e0 6e 6f 2c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  no, (pPg->flags&
361f0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
36200 3f 31 3a 30 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ?1:0, pgno));.  
36210 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25  IOTRACE(("MOVE %
36220 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  p %d %d\n", pPag
36230 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  er, pPg->pgno, p
36240 67 6e 6f 29 29 0a 0a 20 20 2f 2a 20 49 66 20 74  gno))..  /* If t
36250 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73  he journal needs
36260 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20   to be sync()ed 
36270 62 65 66 6f 72 65 20 70 61 67 65 20 70 50 67 2d  before page pPg-
36280 3e 70 67 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62  >pgno can.  ** b
36290 65 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 73 74  e written to, st
362a0 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e  ore pPg->pgno in
362b0 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20   local variable 
362c0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20  needSyncPgno..  
362d0 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69  **.  ** If the i
362e0 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  sCommit flag is 
362f0 73 65 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  set, there is no
36300 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65   need to remembe
36310 72 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20  r that.  ** the 
36320 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
36330 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
36340 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67  ore database pag
36350 65 20 70 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a  e pPg->pgno .  *
36360 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  * can be written
36370 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20   to. The caller 
36380 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d  has already prom
36390 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74  ised not to writ
363a0 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  e to it..  */.  
363b0 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  if( (pPg->flags&
363c0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
363d0 20 26 26 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b   && !isCommit ){
363e0 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e  .    needSyncPgn
363f0 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
36400 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 49     assert( pageI
36410 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c  nJournal(pPg) ||
36420 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
36430 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b  r->dbOrigSize );
36440 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
36450 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
36460 52 54 59 20 29 3b 0a 20 20 20 20 61 73 73 65 72  RTY );.    asser
36470 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
36480 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ync );.  }..  /*
36490 20 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f   If the cache co
364a0 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69  ntains a page wi
364b0 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70  th page-number p
364c0 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20  gno, remove it. 
364d0 20 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68 61 73   ** from its has
364e0 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69  h chain. Also, i
364f0 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  f the PgHdr.need
36500 53 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72  Sync was set for
36510 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f   .  ** page pgno
36520 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76   before the 'mov
36530 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74  e' operation, it
36540 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74   needs to be ret
36550 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20  ained .  ** for 
36560 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74  the page moved t
36570 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  here..  */.  pPg
36580 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44  ->flags &= ~PGHD
36590 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 70  R_NEED_SYNC;.  p
365a0 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f  PgOld = pager_lo
365b0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
365c0 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  o);.  assert( !p
365d0 50 67 4f 6c 64 20 7c 7c 20 70 50 67 4f 6c 64 2d  PgOld || pPgOld-
365e0 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 20 20 69 66  >nRef==1 );.  if
365f0 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20  ( pPgOld ){.    
36600 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70  pPg->flags |= (p
36610 50 67 4f 6c 64 2d 3e 66 6c 61 67 73 26 50 47 48  PgOld->flags&PGH
36620 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20  DR_NEED_SYNC);. 
36630 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
36640 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
36650 64 69 73 63 61 72 64 20 70 61 67 65 73 20 66 72  discard pages fr
36660 6f 6d 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  om an in-memory 
36670 64 61 74 61 62 61 73 65 20 73 69 6e 63 65 20 77  database since w
36680 65 20 6d 69 67 68 74 0a 20 20 20 20 20 20 2a 2a  e might.      **
36690 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   need to rollbac
366a0 6b 20 6c 61 74 65 72 2e 20 20 4a 75 73 74 20 6d  k later.  Just m
366b0 6f 76 65 20 74 68 65 20 70 61 67 65 20 6f 75 74  ove the page out
366c0 20 6f 66 20 74 68 65 20 77 61 79 2e 20 2a 2f 0a   of the way. */.
366d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
366e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
366f0 64 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d );.      sqlit
36700 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67  e3PcacheMove(pPg
36710 4f 6c 64 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  Old, pPager->dbS
36720 69 7a 65 2b 31 29 3b 0a 20 20 20 20 7d 65 6c 73  ize+1);.    }els
36730 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
36740 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 4f 6c  PcacheDrop(pPgOl
36750 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  d);.    }.  }.. 
36760 20 6f 72 69 67 50 67 6e 6f 20 3d 20 70 50 67 2d   origPgno = pPg-
36770 3e 70 67 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33  >pgno;.  sqlite3
36780 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67 2c 20  PcacheMove(pPg, 
36790 70 67 6e 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33  pgno);.  sqlite3
367a0 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
367b0 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pPg);.  pPager->
367c0 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a  dbModified = 1;.
367d0 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50  .  if( needSyncP
367e0 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  gno ){.    /* If
367f0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73   needSyncPgno is
36800 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
36810 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
36820 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20   needs to be .  
36830 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65    ** sync()ed be
36840 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73  fore any data is
36850 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61   written to data
36860 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e  base file page n
36870 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20  eedSyncPgno..   
36880 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e   ** Currently, n
36890 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73  o such page exis
368a0 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63  ts in the page-c
368b0 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20  ache and the .  
368c0 20 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e 61 6c    ** "is journal
368d0 65 64 22 20 62 69 74 76 65 63 20 66 6c 61 67 20  ed" bitvec flag 
368e0 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68  has been set. Th
368f0 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  is needs to be r
36900 65 6d 65 64 69 65 64 20 62 79 0a 20 20 20 20 2a  emedied by.    *
36910 2a 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 70 61  * loading the pa
36920 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
36930 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74  r-cache and sett
36940 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65  ing the PgHdr.ne
36950 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 66  edSync .    ** f
36960 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lag..    **.    
36970 2a 2a 20 49 66 20 74 68 65 20 61 74 74 65 6d 70  ** If the attemp
36980 74 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 70 61  t to load the pa
36990 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
369a0 2d 63 61 63 68 65 20 66 61 69 6c 73 2c 20 28 64  -cache fails, (d
369b0 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20 6d  ue.    ** to a m
369c0 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61  alloc() or IO fa
369d0 69 6c 75 72 65 29 2c 20 63 6c 65 61 72 20 74 68  ilure), clear th
369e0 65 20 62 69 74 20 69 6e 20 74 68 65 20 70 49 6e  e bit in the pIn
369f0 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a  Journal[].    **
36a00 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73   array. Otherwis
36a10 65 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  e, if the page i
36a20 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 77 72 69  s loaded and wri
36a30 74 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20 20  tten again in.  
36a40 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61    ** this transa
36a50 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62 65  ction, it may be
36a60 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
36a70 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
36a80 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74 20 69  fore.    ** it i
36a90 73 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  s synced into th
36aa0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
36ab0 54 68 69 73 20 77 61 79 2c 20 69 74 20 6d 61 79  This way, it may
36ac0 20 65 6e 64 20 75 70 20 69 6e 0a 20 20 20 20 2a   end up in.    *
36ad0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
36ae0 6c 65 20 74 77 69 63 65 2c 20 62 75 74 20 74 68  le twice, but th
36af0 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62  at is not a prob
36b00 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lem..    **.    
36b10 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50 61  ** The sqlite3Pa
36b20 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d 61  gerGet() call ma
36b30 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72  y cause the jour
36b40 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20  nal to sync. So 
36b50 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
36b60 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
36b70 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20  ync flag is set 
36b80 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  too..    */.    
36b90 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20  PgHdr *pPgHdr;. 
36ba0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
36bb0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
36bc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
36bd0 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
36be0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70  needSyncPgno, &p
36bf0 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20  PgHdr);.    if( 
36c00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
36c10 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 53  .      if( needS
36c20 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  yncPgno<=pPager-
36c30 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
36c40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
36c50 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
36c60 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73  !=0 );.        s
36c70 71 6c 69 74 65 33 42 69 74 76 65 63 43 6c 65 61  qlite3BitvecClea
36c80 72 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  r(pPager->pInJou
36c90 72 6e 61 6c 2c 20 6e 65 65 64 53 79 6e 63 50 67  rnal, needSyncPg
36ca0 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  no, pPager->pTmp
36cb0 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Space);.      }.
36cc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
36cd0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
36ce0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
36cf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
36d00 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26  ger->noSync==0 &
36d10 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  & !MEMDB );.    
36d20 70 50 67 48 64 72 2d 3e 66 6c 61 67 73 20 7c 3d  pPgHdr->flags |=
36d30 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
36d40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
36d50 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
36d60 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Hdr);.    sqlite
36d70 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48  3PagerUnref(pPgH
36d80 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  dr);.  }..  /*. 
36d90 20 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65   ** For an in-me
36da0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6d  mory database, m
36db0 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72 69  ake sure the ori
36dc0 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 69  ginal page conti
36dd0 6e 75 65 73 0a 20 20 2a 2a 20 74 6f 20 65 78 69  nues.  ** to exi
36de0 73 74 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20  st, in case the 
36df0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64  transaction need
36e00 73 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20  s to roll back. 
36e10 20 55 73 65 20 70 50 67 4f 6c 64 0a 20 20 2a 2a   Use pPgOld.  **
36e20 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   as the original
36e30 20 70 61 67 65 20 73 69 6e 63 65 20 69 74 20 68   page since it h
36e40 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
36e50 61 6c 6c 6f 63 61 74 65 64 2e 0a 20 20 2a 2f 0a  allocated..  */.
36e60 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
36e70 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
36e80 4d 6f 76 65 28 70 50 67 4f 6c 64 2c 20 6f 72 69  Move(pPgOld, ori
36e90 67 50 67 6e 6f 29 3b 0a 20 20 20 20 73 71 6c 69  gPgno);.    sqli
36ea0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
36eb0 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  gOld);.  }..  re
36ec0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
36ed0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
36ee0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
36ef0 20 74 6f 20 74 68 65 20 64 61 74 61 20 66 6f 72   to the data for
36f00 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
36f10 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  age..*/.void *sq
36f20 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
36f30 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  a(DbPage *pPg){.
36f40 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
36f50 52 65 66 3e 30 20 7c 7c 20 70 50 67 2d 3e 70 50  Ref>0 || pPg->pP
36f60 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20  ager->memDb );. 
36f70 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 44 61   return pPg->pDa
36f80 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ta;.}../*.** Ret
36f90 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
36fa0 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72   the Pager.nExtr
36fb0 61 20 62 79 74 65 73 20 6f 66 20 22 65 78 74 72  a bytes of "extr
36fc0 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c  a" space .** all
36fd0 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
36fe0 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  h the specified 
36ff0 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  page..*/.void *s
37000 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
37010 74 72 61 28 44 62 50 61 67 65 20 2a 70 50 67 29  tra(DbPage *pPg)
37020 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  {.  return pPg->
37030 70 45 78 74 72 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExtra;.}../*.**
37040 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63   Get/set the loc
37050 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68  king-mode for th
37060 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65  is pager. Parame
37070 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62  ter eMode must b
37080 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45  e one.** of PAGE
37090 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
370a0 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ERY, PAGER_LOCKI
370b0 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72  NGMODE_NORMAL or
370c0 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49   .** PAGER_LOCKI
370d0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
370e0 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74  . If the paramet
370f0 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59  er is not _QUERY
37100 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f  , then.** the lo
37110 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65  cking-mode is se
37120 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73  t to the value s
37130 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
37140 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
37150 75 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47  ue is either PAG
37160 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
37170 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45  ORMAL or.** PAGE
37180 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
37190 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74  CLUSIVE, indicat
371a0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
371b0 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65  (possibly update
371c0 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  d).** locking-mo
371d0 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
371e0 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f  e3PagerLockingMo
371f0 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  de(Pager *pPager
37200 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20  , int eMode){.  
37210 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50  assert( eMode==P
37220 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
37230 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20  _QUERY.         
37240 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
37250 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
37260 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20  ORMAL.          
37270 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
37280 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
37290 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73  CLUSIVE );.  ass
372a0 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
372b0 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29  NGMODE_QUERY<0 )
372c0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
372d0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
372e0 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52  RMAL>=0 && PAGER
372f0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
37300 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69  LUSIVE>=0 );.  i
37310 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21  f( eMode>=0 && !
37320 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
37330 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
37340 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
37350 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20  (u8)eMode;.  }. 
37360 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61   return (int)pPa
37370 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
37380 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  de;.}../*.** Set
37390 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
373a0 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
373b0 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64  . Parameter eMod
373c0 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  e must be one of
373d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50 41 47 45 52  :.**.**    PAGER
373e0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
373f0 45 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f  ETE.**    PAGER_
37400 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
37410 43 41 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52  CATE.**    PAGER
37420 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
37430 53 49 53 54 0a 2a 2a 20 20 20 20 50 41 47 45 52  SIST.**    PAGER
37440 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
37450 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
37460 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 0a  RNALMODE_MEMORY.
37470 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
37480 4e 41 4c 4d 4f 44 45 5f 57 41 4c 0a 2a 2a 0a 2a  NALMODE_WAL.**.*
37490 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 6d 6f 64  * The journalmod
374a0 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
374b0 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 20  value specified 
374c0 69 66 20 74 68 65 20 63 68 61 6e 67 65 20 69 73  if the change is
374d0 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 54 68 65   allowed..** The
374e0 20 63 68 61 6e 67 65 20 6d 61 79 20 62 65 20 64   change may be d
374f0 69 73 61 6c 6c 6f 77 65 64 20 66 6f 72 20 74 68  isallowed for th
37500 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 61 73  e following reas
37510 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ons:.**.**   *  
37520 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  An in-memory dat
37530 61 62 61 73 65 20 63 61 6e 20 6f 6e 6c 79 20 68  abase can only h
37540 61 76 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 5f  ave its journal_
37550 6d 6f 64 65 20 73 65 74 20 74 6f 20 5f 4f 46 46  mode set to _OFF
37560 0a 2a 2a 20 20 20 20 20 20 6f 72 20 5f 4d 45 4d  .**      or _MEM
37570 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ORY..**.**   *  
37580 54 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  Temporary databa
37590 73 65 73 20 63 61 6e 6e 6f 74 20 68 61 76 65 20  ses cannot have 
375a0 5f 57 41 4c 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65  _WAL journalmode
375b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
375c0 72 6e 65 64 20 69 6e 64 69 63 61 74 65 20 74 68  rned indicate th
375d0 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69  e current (possi
375e0 62 6c 79 20 75 70 64 61 74 65 64 29 20 6a 6f 75  bly updated) jou
375f0 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e  rnal-mode..*/.in
37600 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  t sqlite3PagerSe
37610 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67  tJournalMode(Pag
37620 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
37630 65 4d 6f 64 65 29 7b 0a 20 20 75 38 20 65 4f 6c  eMode){.  u8 eOl
37640 64 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  d = pPager->jour
37650 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 2f 2a 20 50  nalMode;    /* P
37660 72 69 6f 72 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65  rior journalmode
37670 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 65 4d   */..  /* The eM
37680 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  ode parameter is
37690 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 2a 2f   always valid */
376a0 0a 20 20 61 73 73 65 72 74 28 20 20 20 20 20 20  .  assert(      
376b0 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
376c0 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a  RNALMODE_DELETE.
376d0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
376e0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
376f0 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
37700 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
37710 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
37720 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
37730 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
37740 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
37750 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
37760 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
37770 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
37780 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
37790 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
377a0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
377b0 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 0a 20 20  DE_MEMORY );..  
377c0 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  /* Do not allow 
377d0 74 68 65 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65 20  the journalmode 
377e0 6f 66 20 61 20 54 45 4d 50 20 64 61 74 61 62 61  of a TEMP databa
377f0 73 65 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64  se to be changed
37800 20 74 6f 20 57 41 4c 0a 20 20 2a 2f 0a 20 20 69   to WAL.  */.  i
37810 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
37820 69 6c 65 20 26 26 20 65 4d 6f 64 65 3d 3d 50 41  ile && eMode==PA
37830 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
37840 57 41 4c 20 29 7b 0a 20 20 20 20 61 73 73 65 72  WAL ){.    asser
37850 74 28 20 65 4f 6c 64 21 3d 50 41 47 45 52 5f 4a  t( eOld!=PAGER_J
37860 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29  OURNALMODE_WAL )
37870 3b 0a 20 20 20 20 65 4d 6f 64 65 20 3d 20 65 4f  ;.    eMode = eO
37880 6c 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  ld;.  }..  /* Do
37890 20 61 6c 6c 6f 77 20 74 68 65 20 6a 6f 75 72 6e   allow the journ
378a0 61 6c 6d 6f 64 65 20 6f 66 20 61 6e 20 69 6e 2d  almode of an in-
378b0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
378c0 74 6f 20 62 65 20 73 65 74 20 74 6f 0a 20 20 2a  to be set to.  *
378d0 2a 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72  * anything other
378e0 20 74 68 61 6e 20 4d 45 4d 4f 52 59 20 6f 72 20   than MEMORY or 
378f0 4f 46 46 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d  OFF.  */.  if( M
37900 45 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65  EMDB ){.    asse
37910 72 74 28 20 65 4f 6c 64 3d 3d 50 41 47 45 52 5f  rt( eOld==PAGER_
37920 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
37930 52 59 20 7c 7c 20 65 4f 6c 64 3d 3d 50 41 47 45  RY || eOld==PAGE
37940 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
37950 46 20 29 3b 0a 20 20 20 20 69 66 28 20 65 4d 6f  F );.    if( eMo
37960 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
37970 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 26 26 20  LMODE_MEMORY && 
37980 65 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  eMode!=PAGER_JOU
37990 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a  RNALMODE_OFF ){.
379a0 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 65 4f        eMode = eO
379b0 6c 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ld;.    }.  }.. 
379c0 20 69 66 28 20 65 4d 6f 64 65 21 3d 65 4f 6c 64   if( eMode!=eOld
379d0 20 29 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20   ){.    /* When 
379e0 63 68 61 6e 67 69 6e 67 20 62 65 74 77 65 65 6e  changing between
379f0 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 73 2c   rollback modes,
37a00 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e   close the journ
37a10 61 6c 20 66 69 6c 65 20 70 72 69 6f 72 0a 20 20  al file prior.  
37a20 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 68 61 6e    ** to the chan
37a30 67 65 2e 20 20 42 75 74 20 77 68 65 6e 20 63 68  ge.  But when ch
37a40 61 6e 67 69 6e 67 20 66 72 6f 6d 20 61 20 72 6f  anging from a ro
37a50 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74 6f 20 57  llback mode to W
37a60 41 4c 2c 20 6b 65 65 70 0a 20 20 20 20 2a 2a 20  AL, keep.    ** 
37a70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  the journal open
37a80 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20   since there is 
37a90 61 20 72 6f 6c 6c 62 61 63 6b 2d 73 74 79 6c 65  a rollback-style
37aa0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
37ab0 70 6c 61 79 0a 20 20 20 20 2a 2a 20 75 73 65 64  play.    ** used
37ac0 20 74 6f 20 63 6f 6e 76 65 72 74 20 74 68 65 20   to convert the 
37ad0 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 73 20  version numbers 
37ae0 69 6e 20 74 68 65 20 62 74 72 65 65 20 68 65 61  in the btree hea
37af0 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  der..    */.    
37b00 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
37b10 72 2d 3e 6a 66 64 29 20 26 26 20 65 4d 6f 64 65  r->jfd) && eMode
37b20 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
37b30 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20  ODE_WAL ){.     
37b40 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
37b50 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
37b60 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 61 6e    }..    /* Chan
37b70 67 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  ge the journal m
37b80 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67  ode. */.    pPag
37b90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
37ba0 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 0a 20 20  = (u8)eMode;..  
37bb0 20 20 2f 2a 20 57 68 65 6e 20 74 72 61 6e 73 69    /* When transi
37bc0 73 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 54 52  stioning from TR
37bd0 55 4e 43 41 54 45 20 6f 72 20 50 45 52 53 49 53  UNCATE or PERSIS
37be0 54 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 6a  T to any other j
37bf0 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f  ournal.    ** mo
37c00 64 65 20 65 78 63 65 70 74 20 57 41 4c 20 28 61  de except WAL (a
37c10 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  nd we are not in
37c20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58   locking_mode=EX
37c30 43 4c 55 53 49 56 45 29 20 74 68 65 6e 20 0a 20  CLUSIVE) then . 
37c40 20 20 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65     ** delete the
37c50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
37c60 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
37c70 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
37c80 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20  MODE_TRUNCATE & 
37c90 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)==1 );.    ass
37ca0 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
37cb0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
37cc0 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)==1 );.    a
37cd0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
37ce0 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
37cf0 20 26 20 35 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 5)==0 );.    
37d00 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
37d10 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
37d20 59 20 26 20 35 29 3d 3d 34 20 29 3b 0a 20 20 20  Y & 5)==4 );.   
37d30 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
37d40 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
37d50 26 20 35 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  & 5)==0 );.    a
37d60 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
37d70 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 26 20  URNALMODE_WAL & 
37d80 35 29 3d 3d 35 20 29 3b 0a 0a 20 20 20 20 61 73  5)==5 );..    as
37d90 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
37da0 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
37db0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
37dc0 65 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  e );.    if( !pP
37dd0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
37de0 6f 64 65 20 26 26 20 28 65 4f 6c 64 20 26 20 35  ode && (eOld & 5
37df0 29 3d 3d 31 20 26 26 20 28 65 4d 6f 64 65 20 26  )==1 && (eMode &
37e00 20 31 29 3d 3d 30 20 29 7b 0a 0a 20 20 20 20 20   1)==0 ){..     
37e10 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
37e20 20 77 65 20 77 6f 75 6c 64 20 6c 69 6b 65 20 74   we would like t
37e30 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
37e40 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 69 74  rnal file. If it
37e50 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 74   is.      ** not
37e60 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 6e 20   possible, then 
37e70 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72  that is not a pr
37e80 6f 62 6c 65 6d 2e 20 44 65 6c 65 74 69 6e 67 20  oblem. Deleting 
37e90 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
37ea0 0a 20 20 20 20 20 20 2a 2a 20 68 65 72 65 20 69  .      ** here i
37eb0 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
37ec0 6e 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a 2a  n only..      **
37ed0 0a 20 20 20 20 20 20 2a 2a 20 42 65 66 6f 72 65  .      ** Before
37ee0 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f   deleting the jo
37ef0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 62 74 61  urnal file, obta
37f00 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
37f10 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20  ck on the.      
37f20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
37f30 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
37f40 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
37f50 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65  file is not dele
37f60 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 77 68 69  ted.      ** whi
37f70 6c 65 20 69 74 20 69 73 20 69 6e 20 75 73 65 20  le it is in use 
37f80 62 79 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6c  by some other cl
37f90 69 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ient..      */. 
37fa0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51       int rc = SQ
37fb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
37fc0 6e 74 20 73 74 61 74 65 20 3d 20 70 50 61 67 65  nt state = pPage
37fd0 72 2d 3e 73 74 61 74 65 3b 0a 20 20 20 20 20 20  r->state;.      
37fe0 69 66 28 20 73 74 61 74 65 3c 50 41 47 45 52 5f  if( state<PAGER_
37ff0 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 20 20  SHARED ){.      
38000 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
38010 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 50  gerSharedLock(pP
38020 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
38030 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
38040 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
38050 41 52 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  ARED ){.        
38060 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
38070 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
38080 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
38090 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
380a0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a  RESERVED_LOCK);.
380b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
380c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
380d0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
380e0 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
380f0 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
38100 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
38110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
38120 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
38130 26 20 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  & state==PAGER_S
38140 48 41 52 45 44 20 29 7b 0a 20 20 20 20 20 20 20  HARED ){.       
38150 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
38160 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  (pPager->fd, SHA
38170 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
38180 20 7d 65 6c 73 65 20 69 66 28 20 73 74 61 74 65   }else if( state
38190 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  ==PAGER_UNLOCK )
381a0 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
381b0 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
381c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
381d0 73 65 72 74 28 20 73 74 61 74 65 3d 3d 70 50 61  sert( state==pPa
381e0 67 65 72 2d 3e 73 74 61 74 65 20 29 3b 0a 20 20  ger->state );.  
381f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
38200 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6a 6f 75  turn the new jou
38210 72 6e 61 6c 20 6d 6f 64 65 20 2a 2f 0a 20 20 72  rnal mode */.  r
38220 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65  eturn (int)pPage
38230 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a  r->journalMode;.
38240 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
38250 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72  the current jour
38260 6e 61 6c 20 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74  nal mode..*/.int
38270 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
38280 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65  JournalMode(Page
38290 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
382a0 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72  turn (int)pPager
382b0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d  ->journalMode;.}
382c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
382d0 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65 72  RUE if the pager
382e0 20 69 73 20 69 6e 20 61 20 73 74 61 74 65 20 77   is in a state w
382f0 68 65 72 65 20 69 74 20 69 73 20 4f 4b 20 74 6f  here it is OK to
38300 20 63 68 61 6e 67 65 20 74 68 65 0a 2a 2a 20 6a   change the.** j
38310 6f 75 72 6e 61 6c 6d 6f 64 65 2e 20 20 4a 6f 75  ournalmode.  Jou
38320 72 6e 61 6c 6d 6f 64 65 20 63 68 61 6e 67 65 73  rnalmode changes
38330 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
38340 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   when the databa
38350 73 65 0a 2a 2a 20 69 73 20 75 6e 6d 6f 64 69 66  se.** is unmodif
38360 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ied..*/.int sqli
38370 74 65 33 50 61 67 65 72 4f 6b 54 6f 43 68 61 6e  te3PagerOkToChan
38380 67 65 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61  geJournalMode(Pa
38390 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
383a0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f  if( pPager->dbMo
383b0 64 69 66 69 65 64 20 29 20 72 65 74 75 72 6e 20  dified ) return 
383c0 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 69  0;.  if( NEVER(i
383d0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
383e0 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  d) && pPager->jo
383f0 75 72 6e 61 6c 4f 66 66 3e 30 29 20 29 20 72 65  urnalOff>0) ) re
38400 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
38410 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74   1;.}../*.** Get
38420 2f 73 65 74 20 74 68 65 20 73 69 7a 65 2d 6c 69  /set the size-li
38430 6d 69 74 20 75 73 65 64 20 66 6f 72 20 70 65 72  mit used for per
38440 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  sistent journal 
38450 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 74  files..**.** Set
38460 74 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6c 69  ting the size li
38470 6d 69 74 20 74 6f 20 2d 31 20 6d 65 61 6e 73 20  mit to -1 means 
38480 6e 6f 20 6c 69 6d 69 74 20 69 73 20 65 6e 66 6f  no limit is enfo
38490 72 63 65 64 2e 0a 2a 2a 20 41 6e 20 61 74 74 65  rced..** An atte
384a0 6d 70 74 20 74 6f 20 73 65 74 20 61 20 6c 69 6d  mpt to set a lim
384b0 69 74 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  it smaller than 
384c0 2d 31 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  -1 is a no-op..*
384d0 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 50 61 67  /.i64 sqlite3Pag
384e0 65 72 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  erJournalSizeLim
384f0 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
38500 2c 20 69 36 34 20 69 4c 69 6d 69 74 29 7b 0a 20  , i64 iLimit){. 
38510 20 69 66 28 20 69 4c 69 6d 69 74 3e 3d 2d 31 20   if( iLimit>=-1 
38520 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
38530 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
38540 3d 20 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20  = iLimit;.  }.  
38550 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6a  return pPager->j
38560 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b  ournalSizeLimit;
38570 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
38580 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
38590 65 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  e pPager->pBacku
385a0 70 20 76 61 72 69 61 62 6c 65 2e 20 54 68 65 20  p variable. The 
385b0 62 61 63 6b 75 70 20 6d 6f 64 75 6c 65 0a 2a 2a  backup module.**
385c0 20 69 6e 20 62 61 63 6b 75 70 2e 63 20 6d 61 69   in backup.c mai
385d0 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6e 74 65  ntains the conte
385e0 6e 74 20 6f 66 20 74 68 69 73 20 76 61 72 69 61  nt of this varia
385f0 62 6c 65 2e 20 54 68 69 73 20 6d 6f 64 75 6c 65  ble. This module
38600 0a 2a 2a 20 75 73 65 73 20 69 74 20 6f 70 61 71  .** uses it opaq
38610 75 65 6c 79 20 61 73 20 61 6e 20 61 72 67 75 6d  uely as an argum
38620 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 42 61  ent to sqlite3Ba
38630 63 6b 75 70 52 65 73 74 61 72 74 28 29 20 61 6e  ckupRestart() an
38640 64 0a 2a 2a 20 73 71 6c 69 74 65 33 42 61 63 6b  d.** sqlite3Back
38650 75 70 55 70 64 61 74 65 28 29 20 6f 6e 6c 79 2e  upUpdate() only.
38660 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 62 61 63 6b  .*/.sqlite3_back
38670 75 70 20 2a 2a 73 71 6c 69 74 65 33 50 61 67 65  up **sqlite3Page
38680 72 42 61 63 6b 75 70 50 74 72 28 50 61 67 65 72  rBackupPtr(Pager
38690 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
386a0 75 72 6e 20 26 70 50 61 67 65 72 2d 3e 70 42 61  urn &pPager->pBa
386b0 63 6b 75 70 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  ckup;.}..#ifndef
386c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
386d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
386e0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
386f0 68 65 6e 20 74 68 65 20 75 73 65 72 20 69 6e 76  hen the user inv
38700 6f 6b 65 73 20 22 50 52 41 47