/ Hex Artifact Content
Login

Artifact edf1f8b02b5c106bd3a3add0d06f28859195a0f8:


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: 20 20 75 33 32 20 61 57 61 6c 44 61 74 61 5b 57    u32 aWalData[W
2660: 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e 44 41  AL_SAVEPOINT_NDA
2670: 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 57  TA];        /* W
2680: 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63 6f 6e  AL savepoint con
2690: 74 65 78 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  text */.};../*.*
26a0: 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61  * A open page ca
26b0: 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  che is an instan
26c0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
26d0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
26e0: 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a  *.** errCode.**.
26f0: 2a 2a 20 20 20 50 61 67 65 72 2e 65 72 72 43 6f  **   Pager.errCo
2700: 64 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  de may be set to
2710: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53   SQLITE_IOERR, S
2720: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f  QLITE_CORRUPT, o
2730: 72 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49 54 45  r.**   or SQLITE
2740: 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20  _FULL. Once one 
2750: 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72  of the first thr
2760: 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73  ee errors occurs
2770: 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a  , it persists.**
2780: 20 20 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e     and is return
2790: 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  ed as the result
27a0: 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20   of every major 
27b0: 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20  pager API call. 
27c0: 20 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49 54 45   The.**   SQLITE
27d0: 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64  _FULL return cod
27e0: 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69  e is slightly di
27f0: 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73  fferent. It pers
2800: 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20  ists only until 
2810: 74 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20 73 75  the.**   next su
2820: 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63  ccessful rollbac
2830: 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f  k is performed o
2840: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
2850: 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20 53 51  e. Also,.**   SQ
2860: 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e  LITE_FULL does n
2870: 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71  ot affect the sq
2880: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
2890: 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
28a0: 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20 41 50  Lookup().**   AP
28b0: 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69  Is, they may sti
28c0: 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63 63 65  ll be used succe
28d0: 73 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 64  ssfully..**.** d
28e0: 62 53 69 7a 65 56 61 6c 69 64 2c 20 64 62 53 69  bSizeValid, dbSi
28f0: 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 2c 20  ze, dbOrigSize, 
2900: 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a 2a 2a  dbFileSize.**.**
2910: 20 20 20 4d 61 6e 61 67 69 6e 67 20 74 68 65 20     Managing the 
2920: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
2930: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67  base file in pag
2940: 65 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20 63  es is a little c
2950: 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20 20  omplicated..**  
2960: 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61   The variable Pa
2970: 67 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74 61  ger.dbSize conta
2980: 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ins the number o
2990: 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68 65  f pages that the
29a0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 69   database.**   i
29b0: 6d 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 63  mage currently c
29c0: 6f 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65 20  ontains. As the 
29d0: 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 67  database image g
29e0: 72 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73 20  rows or shrinks 
29f0: 74 68 69 73 0a 2a 2a 20 20 20 76 61 72 69 61 62  this.**   variab
2a00: 6c 65 20 69 73 20 75 70 64 61 74 65 64 2e 20 54  le is updated. T
2a10: 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67 65  he variable Page
2a20: 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e  r.dbFileSize con
2a30: 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  tains the number
2a40: 0a 2a 2a 20 20 20 6f 66 20 70 61 67 65 73 20 69  .**   of pages i
2a50: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2a60: 69 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 62 65  ile. This may be
2a70: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
2a80: 50 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a 2a 20  Pager.dbSize.** 
2a90: 20 20 69 66 20 73 6f 6d 65 20 70 61 67 65 73 20    if some pages 
2aa0: 68 61 76 65 20 62 65 65 6e 20 61 70 70 65 6e 64  have been append
2ab0: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
2ac0: 73 65 20 69 6d 61 67 65 20 62 75 74 20 6e 6f 74  se image but not
2ad0: 20 79 65 74 20 77 72 69 74 74 65 6e 0a 2a 2a 20   yet written.** 
2ae0: 20 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20 63    out from the c
2af0: 61 63 68 65 20 74 6f 20 74 68 65 20 61 63 74 75  ache to the actu
2b00: 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  al file on disk.
2b10: 20 4f 72 20 69 66 20 74 68 65 20 69 6d 61 67 65   Or if the image
2b20: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 74   has been.**   t
2b30: 72 75 6e 63 61 74 65 64 20 62 79 20 61 6e 20 69  runcated by an i
2b40: 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
2b50: 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65  m operation. The
2b60: 20 50 61 67 65 72 2e 64 62 4f 72 69 67 53 69 7a   Pager.dbOrigSiz
2b70: 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20  e variable.**   
2b80: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d  contains the num
2b90: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
2ba0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
2bb0: 67 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ge when the curr
2bc0: 65 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73 61 63  ent.**   transac
2bd0: 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e  tion was opened.
2be0: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
2bf0: 20 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74 68   all three of th
2c00: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 69 73  ese variables is
2c10: 0a 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61 72 61  .**   only guara
2c20: 6e 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72 72  nteed to be corr
2c30: 65 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c 65  ect if the boole
2c40: 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 56  an Pager.dbSizeV
2c50: 61 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a 2a  alid is true..**
2c60: 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e 64 65  .**   TODO: Unde
2c70: 72 20 77 68 61 74 20 63 6f 6e 64 69 74 69 6f 6e  r what condition
2c80: 73 20 69 73 20 64 62 53 69 7a 65 56 61 6c 69 64  s is dbSizeValid
2c90: 20 73 65 74 3f 20 43 6c 65 61 72 65 64 3f 0a 2a   set? Cleared?.*
2ca0: 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74  *.** changeCount
2cb0: 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Done.**.**   Thi
2cc0: 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  s boolean variab
2cd0: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  le is used to ma
2ce0: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
2cf0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
2d00: 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74  .**   (the 4-byt
2d10: 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61  e header field a
2d20: 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  t byte offset 24
2d30: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2d40: 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20   file) is .**   
2d50: 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65  not updated more
2d60: 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65   often than nece
2d70: 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ssary. .**.**   
2d80: 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  It is set to tru
2d90: 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67  e when the chang
2da0: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
2db0: 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63  is updated, whic
2dc0: 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79  h .**   can only
2dd0: 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78   happen if an ex
2de0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
2df0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
2e00: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
2e10: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73  It is cleared (s
2e20: 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65  et to false) whe
2e30: 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69  never an exclusi
2e40: 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20  ve lock is .**  
2e50: 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e   relinquished on
2e60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e70: 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20  le. Each time a 
2e80: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2e90: 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54  ommitted,.**   T
2ea0: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
2eb0: 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65  ne flag is inspe
2ec0: 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74  cted. If it is t
2ed0: 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66  rue, the work of
2ee0: 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74  .**   updating t
2ef0: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2f00: 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72  r is omitted for
2f10: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
2f20: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
2f30: 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d    This mechanism
2f40: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e   means that when
2f50: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
2f60: 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f  usive mode, a co
2f70: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e  nnection .**   n
2f80: 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20  eed only update 
2f90: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
2fa0: 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65  er once, for the
2fb0: 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69   first transacti
2fc0: 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65  on.**   committe
2fd0: 64 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64 69 66  d..**.** dbModif
2fe0: 69 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ied.**.**   The 
2ff0: 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67 20  dbModified flag 
3000: 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20  is set whenever 
3010: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
3020: 69 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a 20 20  is dirtied..**  
3030: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 61   It is cleared a
3040: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63  t the end of eac
3050: 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  h transaction..*
3060: 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 75 73 65  *.**   It is use
3070: 64 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  d when committin
3080: 67 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20 65  g or otherwise e
3090: 6e 64 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  nding a transact
30a0: 69 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74 68 65  ion. If.**   the
30b0: 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67   dbModified flag
30c0: 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 6c   is clear then l
30d0: 65 73 73 20 77 6f 72 6b 20 68 61 73 20 74 6f 20  ess work has to 
30e0: 62 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 6a  be done..**.** j
30f0: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 0a 2a 2a  ournalStarted.**
3100: 0a 2a 2a 20 20 20 54 68 69 73 20 66 6c 61 67 20  .**   This flag 
3110: 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20  is set whenever 
3120: 74 68 65 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  the the main jou
3130: 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 20 61  rnal is opened a
3140: 6e 64 0a 2a 2a 20 20 20 69 6e 69 74 69 61 6c 69  nd.**   initiali
3150: 7a 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  zed.**.**   The 
3160: 70 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c  point of this fl
3170: 61 67 20 69 73 20 74 68 61 74 20 69 74 20 6d 75  ag is that it mu
3180: 73 74 20 62 65 20 73 65 74 20 61 66 74 65 72 20  st be set after 
3190: 74 68 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20  the .**   first 
31a0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
31b0: 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  n a journal file
31c0: 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
31d0: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41   to disk..**   A
31e0: 66 74 65 72 20 74 68 69 73 20 68 61 73 20 68 61  fter this has ha
31f0: 70 70 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65  ppened, new page
3200: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
3210: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20  e database .**  
3220: 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65   do not need the
3230: 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
3240: 20 66 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68   flag set, as th
3250: 65 79 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a  ey do not need.*
3260: 2a 20 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20  *   to wait for 
3270: 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62  a journal sync b
3280: 65 66 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62  efore they can b
3290: 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
32a0: 0a 2a 2a 20 20 20 74 68 65 20 64 61 74 61 62 61  .**   the databa
32b0: 73 65 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e  se file (see fun
32c0: 63 74 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74  ction pager_writ
32d0: 65 28 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73  e())..**   .** s
32e0: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
32f0: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   This variable i
3300: 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65  s used to ensure
3310: 20 74 68 61 74 20 74 68 65 20 6d 61 73 74 65 72   that the master
3320: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
3330: 6d 65 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29  me.**   (if any)
3340: 20 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e   is only written
3350: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
3360: 6c 20 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a  l file once..**.
3370: 2a 2a 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74  **   When commit
3380: 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
3390: 6f 6e 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  on, the master j
33a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
33b0: 20 28 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d   (if any).**   m
33c0: 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ay be written in
33d0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
33e0: 69 6c 65 20 77 68 69 6c 65 20 74 68 65 20 70 61  ile while the pa
33f0: 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a  ger is still in.
3400: 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52  **   PAGER_RESER
3410: 56 45 44 20 73 74 61 74 65 20 28 73 65 65 20 43  VED state (see C
3420: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
3430: 66 6f 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e  for the action).
3440: 20 49 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74   It.**   then at
3450: 74 65 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64  tempts to upgrad
3460: 65 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76  e to an exclusiv
3470: 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20  e lock. If this 
3480: 61 74 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69  attempt.**   fai
3490: 6c 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  ls, then SQLITE_
34a0: 42 55 53 59 20 6d 61 79 20 62 65 20 72 65 74 75  BUSY may be retu
34b0: 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
34c0: 20 61 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a   and the user.**
34d0: 20 20 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74     may attempt t
34e0: 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
34f0: 6e 73 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c  nsaction again l
3500: 61 74 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a  ater (calling.**
3510: 20 20 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e     CommitPhaseOn
3520: 65 28 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73  e() again). This
3530: 20 66 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f   flag is used to
3540: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
3550: 20 0a 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f   .**   master jo
3560: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e  urnal name is on
3570: 6c 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ly written to th
3580: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
3590: 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69  he first.**   ti
35a0: 6d 65 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  me CommitPhaseOn
35b0: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
35c0: 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 2c  *.** doNotSpill,
35d0: 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 0a   doNotSyncSpill.
35e0: 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 65 6e 61  **.**   When ena
35f0: 62 6c 65 64 2c 20 63 61 63 68 65 20 73 70 69 6c  bled, cache spil
3600: 6c 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65  ls are prohibite
3610: 64 2e 20 20 54 68 65 20 64 6f 4e 6f 74 53 70 69  d.  The doNotSpi
3620: 6c 6c 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20  ll variable.**  
3630: 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63 61   inhibits all ca
3640: 63 68 65 20 73 70 69 6c 6c 20 61 6e 64 20 64 6f  che spill and do
3650: 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 6e 68  NotSyncSpill inh
3660: 69 62 69 74 73 20 74 68 6f 73 65 20 73 70 69 6c  ibits those spil
3670: 6c 73 20 74 68 61 74 0a 2a 2a 20 20 20 77 6f 75  ls that.**   wou
3680: 6c 64 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75  ld require a jou
3690: 72 6e 61 6c 20 73 79 6e 63 2e 20 20 54 68 65 20  rnal sync.  The 
36a0: 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69  doNotSyncSpill i
36b0: 73 20 73 65 74 20 61 6e 64 20 63 6c 65 61 72 65  s set and cleare
36c0: 64 20 0a 2a 2a 20 20 20 62 79 20 73 71 6c 69 74  d .**   by sqlit
36d0: 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
36e0: 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65  n order to preve
36f0: 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e  nt a journal syn
3700: 63 20 66 72 6f 6d 20 68 61 70 70 65 6e 69 6e 67  c from happening
3710: 20 0a 2a 2a 20 20 20 69 6e 20 62 65 74 77 65 65   .**   in betwee
3720: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  n the journallin
3730: 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f  g of two pages o
3740: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  n the same secto
3750: 72 2e 20 20 54 68 65 0a 2a 2a 20 20 20 64 6f 4e  r.  The.**   doN
3760: 6f 74 53 70 69 6c 6c 20 76 61 6c 75 65 20 73 65  otSpill value se
3770: 74 20 74 6f 20 70 72 65 76 65 6e 74 20 70 61 67  t to prevent pag
3780: 65 72 53 74 72 65 73 73 28 29 20 66 72 6f 6d 20  erStress() from 
3790: 74 72 79 69 6e 67 20 74 6f 20 75 73 65 0a 2a 2a  trying to use.**
37a0: 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64     the journal d
37b0: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
37c0: 2e 0a 2a 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63  ..**.** needSync
37d0: 0a 2a 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 49  .**.**   TODO: I
37e0: 74 20 6d 69 67 68 74 20 62 65 20 65 61 73 69 65  t might be easie
37f0: 72 20 74 6f 20 73 65 74 20 74 68 69 73 20 76 61  r to set this va
3800: 72 69 61 62 6c 65 20 69 6e 20 77 72 69 74 65 4a  riable in writeJ
3810: 6f 75 72 6e 61 6c 48 64 72 28 29 0a 2a 2a 20 20  ournalHdr().**  
3820: 20 61 6e 64 20 77 72 69 74 65 4d 61 73 74 65 72   and writeMaster
3830: 4a 6f 75 72 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20  Journal() only. 
3840: 43 68 61 6e 67 65 20 69 74 73 20 6d 65 61 6e 69  Change its meani
3850: 6e 67 20 74 6f 20 22 75 6e 73 79 6e 63 65 64 20  ng to "unsynced 
3860: 64 61 74 61 0a 2a 2a 20 20 20 68 61 73 20 62 65  data.**   has be
3870: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
3880: 65 20 6a 6f 75 72 6e 61 6c 22 2e 0a 2a 2a 0a 2a  e journal"..**.*
3890: 2a 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a  * subjInMemory.*
38a0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61  *.**   This is a
38b0: 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c   boolean variabl
38c0: 65 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e  e. If true, then
38d0: 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75   any required su
38e0: 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69  b-journal.**   i
38f0: 73 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69  s opened as an i
3900: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
3910: 20 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c   file. If false,
3920: 20 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a   then in-memory.
3930: 2a 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  **   sub-journal
3940: 73 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20  s are only used 
3950: 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  for in-memory pa
3960: 67 65 72 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74  ger files..*/.st
3970: 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73  ruct Pager {.  s
3980: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
3990: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53  ;          /* OS
39a0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73   functions to us
39b0: 65 20 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38  e for IO */.  u8
39c0: 20 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20   exclusiveMode; 
39d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f            /* Boo
39e0: 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f  lean. True if lo
39f0: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c  cking_mode==EXCL
3a00: 55 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f  USIVE */.  u8 jo
3a10: 75 72 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20  urnalMode;      
3a20: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20         /* On of 
3a30: 74 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  the PAGER_JOURNA
3a40: 4c 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a  LMODE_* values *
3a50: 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61  /.  u8 useJourna
3a60: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
3a70: 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63  /* Use a rollbac
3a80: 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69  k journal on thi
3a90: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  s file */.  u8 n
3aa0: 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20  oReadlock;      
3ab0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
3ac0: 74 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61  t bother to obta
3ad0: 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a  in readlocks */.
3ae0: 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20    u8 noSync;    
3af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3b00: 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65   Do not sync the
3b10: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65   journal if true
3b20: 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e   */.  u8 fullSyn
3b30: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3b40: 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79    /* Do extra sy
3b50: 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ncs of the journ
3b60: 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  al for robustnes
3b70: 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66  s */.  u8 sync_f
3b80: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
3b90: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e     /* One of SYN
3ba0: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
3bb0: 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65  _FULL */.  u8 te
3bc0: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
3bd0: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
3be0: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
3bf0: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
3c00: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
3c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3c20: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
3c30: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
3c40: 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20  8 memDb;        
3c50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3c60: 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c  ue to inhibit al
3c70: 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20  l file I/O */.. 
3c80: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
3c90: 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73  g block contains
3ca0: 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d   those class mem
3cb0: 62 65 72 73 20 74 68 61 74 20 61 72 65 20 64 79  bers that are dy
3cc0: 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d  namically.  ** m
3cd0: 6f 64 69 66 69 65 64 20 64 75 72 69 6e 67 20 6e  odified during n
3ce0: 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73  ormal operations
3cf0: 2e 20 54 68 65 20 6f 74 68 65 72 20 76 61 72 69  . The other vari
3d00: 61 62 6c 65 73 20 69 6e 20 74 68 69 73 20 73 74  ables in this st
3d10: 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 72 65  ructure.  ** are
3d20: 20 65 69 74 68 65 72 20 63 6f 6e 73 74 61 6e 74   either constant
3d30: 20 74 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20   throughout the 
3d40: 6c 69 66 65 74 69 6d 65 20 6f 66 20 74 68 65 20  lifetime of the 
3d50: 70 61 67 65 72 2c 20 6f 72 20 65 6c 73 65 0a 20  pager, or else. 
3d60: 20 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72   ** used to stor
3d70: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
3d80: 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20  parameters that 
3d90: 61 66 66 65 63 74 20 74 68 65 20 77 61 79 20 74  affect the way t
3da0: 68 65 20 70 61 67 65 72 20 0a 20 20 2a 2a 20 6f  he pager .  ** o
3db0: 70 65 72 61 74 65 73 2e 0a 20 20 2a 2a 0a 20 20  perates..  **.  
3dc0: 2a 2a 20 54 68 65 20 27 73 74 61 74 65 27 20 76  ** The 'state' v
3dd0: 61 72 69 61 62 6c 65 20 69 73 20 64 65 73 63 72  ariable is descr
3de0: 69 62 65 64 20 69 6e 20 6d 6f 72 65 20 64 65 74  ibed in more det
3df0: 61 69 6c 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ail along with t
3e00: 68 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74  he.  ** descript
3e10: 69 6f 6e 73 20 6f 66 20 74 68 65 20 76 61 6c 75  ions of the valu
3e20: 65 73 20 69 74 20 6d 61 79 20 74 61 6b 65 20 2d  es it may take -
3e30: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 65 74   PAGER_UNLOCK et
3e40: 63 2e 20 4d 61 6e 79 20 6f 66 20 74 68 65 0a 20  c. Many of the. 
3e50: 20 2a 2a 20 6f 74 68 65 72 20 76 61 72 69 61 62   ** other variab
3e60: 6c 65 73 20 69 6e 20 74 68 69 73 20 62 6c 6f 63  les in this bloc
3e70: 6b 20 61 72 65 20 64 65 73 63 72 69 62 65 64 20  k are described 
3e80: 69 6e 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 64  in the comment d
3e90: 69 72 65 63 74 6c 79 20 0a 20 20 2a 2a 20 61 62  irectly .  ** ab
3ea0: 6f 76 65 20 74 68 69 73 20 63 6c 61 73 73 20 64  ove this class d
3eb0: 65 66 69 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  efinition..  */.
3ec0: 20 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20    u8 state;     
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3ee0: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f   PAGER_UNLOCK, _
3ef0: 53 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45  SHARED, _RESERVE
3f00: 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20  D, etc. */.  u8 
3f10: 64 62 4d 6f 64 69 66 69 65 64 3b 20 20 20 20 20  dbModified;     
3f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3f30: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
3f40: 79 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  y changes to the
3f50: 20 44 62 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64   Db */.  u8 need
3f60: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
3f70: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3f80: 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65  an fsync() is ne
3f90: 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  eded on the jour
3fa0: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  nal */.  u8 jour
3fb0: 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20  nalStarted;     
3fc0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3fd0: 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61  header of journa
3fe0: 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20  l is synced */. 
3ff0: 20 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44   u8 changeCountD
4000: 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  one;         /* 
4010: 53 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d  Set after increm
4020: 65 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67  enting the chang
4030: 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  e-counter */.  u
4040: 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20  8 setMaster;    
4050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
4060: 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65  ue if a m-j name
4070: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
4080: 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75  n to jrnl */.  u
4090: 38 20 64 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20  8 doNotSpill;   
40a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
40b0: 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63   not spill the c
40c0: 61 63 68 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65  ache when non-ze
40d0: 72 6f 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74  ro */.  u8 doNot
40e0: 53 79 6e 63 53 70 69 6c 6c 3b 20 20 20 20 20 20  SyncSpill;      
40f0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 6f      /* Do not do
4100: 20 61 20 73 70 69 6c 6c 20 74 68 61 74 20 72 65   a spill that re
4110: 71 75 69 72 65 73 20 6a 72 6e 6c 20 73 79 6e 63  quires jrnl sync
4120: 20 2a 2f 0a 20 20 75 38 20 64 62 53 69 7a 65 56   */.  u8 dbSizeV
4130: 61 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  alid;           
4140: 20 20 2f 2a 20 53 65 74 20 77 68 65 6e 20 64 62    /* Set when db
4150: 53 69 7a 65 20 69 73 20 63 6f 72 72 65 63 74 20  Size is correct 
4160: 2a 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65  */.  u8 subjInMe
4170: 6d 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  mory;           
4180: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
4190: 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f  in-memory sub-jo
41a0: 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f  urnals */.  Pgno
41b0: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
41c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
41d0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
41e0: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
41f0: 50 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b  Pgno dbOrigSize;
4200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64              /* d
4210: 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65  bSize before the
4220: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
4230: 74 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  tion */.  Pgno d
4240: 62 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20  bFileSize;      
4250: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4260: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
4270: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
4280: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
4290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
42a0: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
42b0: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
42c0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
42d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42e0: 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e    /* Pages journ
42f0: 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74  alled since last
4300: 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65   j-header writte
4310: 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  n */.  u32 cksum
4320: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
4330: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
4340: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
4350: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
4360: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65   */.  u32 nSubRe
4370: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
4380: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
4390: 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74  ecords written t
43a0: 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  o sub-journal */
43b0: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f  .  Bitvec *pInJo
43c0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f  urnal;         /
43d0: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
43e0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
43f0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
4400: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
4410: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
4420: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
4430: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f   for database */
4440: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
4450: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *jfd;          /
4460: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
4470: 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e  r for main journ
4480: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
4490: 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20  file *sjfd;     
44a0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
44b0: 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a  riptor for sub-j
44c0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
44d0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
44e0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
44f0: 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20  nt write offset 
4500: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
4510: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
4520: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
4530: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
4540: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
4550: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
4560: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  /.  i64 journalS
4570: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  izeLimit;       
4580: 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f  /* Size limit fo
4590: 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  r persistent jou
45a0: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
45b0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
45c0: 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41  aSavepoint; /* A
45d0: 72 72 61 79 20 6f 66 20 61 63 74 69 76 65 20 73  rray of active s
45e0: 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69  avepoints */.  i
45f0: 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  nt nSavepoint;  
4600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4610: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
4620: 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d   in aSavepoint[]
4630: 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c   */.  char dbFil
4640: 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20  eVers[16];      
4650: 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65    /* Changes whe
4660: 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66  never database f
4670: 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20  ile changes */. 
4680: 20 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b   u32 sectorSize;
4690: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
46a0: 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  Assumed sector s
46b0: 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ize during rollb
46c0: 61 63 6b 20 2a 2f 0a 0a 20 20 75 31 36 20 6e 45  ack */..  u16 nE
46d0: 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
46e0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
46f0: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20  s many bytes to 
4700: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
4710: 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65  age */.  i16 nRe
4720: 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20  serve;          
4730: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4740: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61  f unused bytes a
4750: 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61  t end of each pa
4760: 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46  ge */.  u32 vfsF
4770: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
4780: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72      /* Flags for
4790: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
47a0: 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 70 61  en() */.  int pa
47b0: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
47c0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
47d0: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61  of bytes in a pa
47e0: 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  ge */.  Pgno mxP
47f0: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
4800: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
4810: 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74  llowed size of t
4820: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
4830: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
4840: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
4850: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
4860: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63  base file */.  c
4870: 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20  har *zJournal;  
4880: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
4890: 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
48a0: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  l file */.  int 
48b0: 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28  (*xBusyHandler)(
48c0: 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74  void*); /* Funct
48d0: 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e  ion to call when
48e0: 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20   busy */.  void 
48f0: 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  *pBusyHandlerArg
4900: 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78  ;      /* Contex
4910: 74 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78  t argument for x
4920: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 23  BusyHandler */.#
4930: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
4940: 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d  T.  int nHit, nM
4950: 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  iss;            
4960: 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20 61 6e  /* Cache hits an
4970: 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69  d missing */.  i
4980: 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65  nt nRead, nWrite
4990: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
49a0: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
49b0: 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e  d/written */.#en
49c0: 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65  dif.  void (*xRe
49d0: 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29  initer)(DbPage*)
49e0: 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72  ; /* Call this r
49f0: 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f  outine when relo
4a00: 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23  ading pages */.#
4a10: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
4a20: 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28  _CODEC.  void *(
4a30: 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
4a40: 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20  oid*,Pgno,int); 
4a50: 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65  /* Routine for e
4a60: 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20  n/decoding data 
4a70: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  */.  void (*xCod
4a80: 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64  ecSizeChng)(void
4a90: 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e  *,int,int); /* N
4aa0: 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20 73 69  otify of page si
4ab0: 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  ze changes */.  
4ac0: 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65  void (*xCodecFre
4ad0: 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20  e)(void*);      
4ae0: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75         /* Destru
4af0: 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64  ctor for the cod
4b00: 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  ec */.  void *pC
4b10: 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  odec;           
4b20: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
4b30: 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e  ument to xCodec.
4b40: 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65  .. methods */.#e
4b50: 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d  ndif.  char *pTm
4b60: 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
4b70: 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65     /* Pager.page
4b80: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70  Size bytes of sp
4b90: 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20  ace for tmp use 
4ba0: 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43  */.  PCache *pPC
4bb0: 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20  ache;           
4bc0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
4bd0: 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74  age cache object
4be0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61   */.  sqlite3_ba
4bf0: 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20  ckup *pBackup;  
4c00: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
4c10: 6c 69 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20  list of ongoing 
4c20: 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73  backup processes
4c30: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
4c40: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61  TE_OMIT_WAL.  Wa
4c50: 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20  l *pWal;        
4c60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
4c70: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65  te-ahead log use
4c80: 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  d by "journal_mo
4c90: 64 65 3d 77 61 6c 22 20 2a 2f 0a 23 65 6e 64 69  de=wal" */.#endi
4ca0: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  f.};../*.** The 
4cb0: 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
4cc0: 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20   variables hold 
4cd0: 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f  counters used fo
4ce0: 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72  r.** testing pur
4cf0: 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65  poses only.  The
4d00: 73 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20  se variables do 
4d10: 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20  not exist in.** 
4d20: 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75  a non-testing bu
4d30: 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69  ild.  These vari
4d40: 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68  ables are not th
4d50: 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69  read-safe..*/.#i
4d60: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
4d70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
4d80: 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20  er_readdb_count 
4d90: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  = 0;    /* Numbe
4da0: 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20  r of full pages 
4db0: 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a  read from DB */.
4dc0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
4dd0: 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20  r_writedb_count 
4de0: 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72  = 0;   /* Number
4df0: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77   of full pages w
4e00: 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a  ritten to DB */.
4e10: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
4e20: 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d  r_writej_count =
4e30: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
4e40: 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65   of pages writte
4e50: 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  n to journal */.
4e60: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
4e70: 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73  NCR(v)  v++.#els
4e80: 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  e.# define PAGER
4e90: 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a  _INCR(v).#endif.
4ea0: 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c  .../*.** Journal
4eb0: 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74   files begin wit
4ec0: 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
4ed0: 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54  magic string.  T
4ee0: 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f  he data.** was o
4ef0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65  btained from /de
4f00: 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73  v/random.  It is
4f10: 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20   used only as a 
4f20: 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a  sanity check..**
4f30: 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f  .** Since versio
4f40: 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75  n 2.8.0, the jou
4f50: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74  rnal format cont
4f60: 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20  ains additional 
4f70: 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69  sanity.** checki
4f80: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  ng information. 
4f90: 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61   If the power fa
4fa0: 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  ils while the jo
4fb0: 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a  urnal is being.*
4fc0: 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d  * written, semi-
4fd0: 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64  random garbage d
4fe0: 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72  ata might appear
4ff0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
5000: 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f  ** file after po
5010: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e  wer is restored.
5020: 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20    If an attempt 
5030: 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20  is then made.** 
5040: 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72  to roll the jour
5050: 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61  nal back, the da
5060: 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20  tabase could be 
5070: 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20  corrupted.  The 
5080: 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61  additional.** sa
5090: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61  nity checking da
50a0: 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74  ta is an attempt
50b0: 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65   to discover the
50c0: 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a   garbage in the.
50d0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69  ** journal and i
50e0: 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  gnore it..**.** 
50f0: 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  The sanity check
5100: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
5110: 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72  for the new jour
5120: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69  nal format consi
5130: 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62  sts.** of a 32-b
5140: 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65  it checksum on e
5150: 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61  ach page of data
5160: 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20  .  The checksum 
5170: 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74  covers both.** t
5180: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
5190: 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70  nd the pPager->p
51a0: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
51b0: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61   data for the pa
51c0: 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75  ge..** This cksu
51d0: 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  m is initialized
51e0: 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e   to a 32-bit ran
51f0: 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61  dom value that a
5200: 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a  ppears in the.**
5210: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69   journal file ri
5220: 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65  ght after the he
5230: 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f  ader.  The rando
5240: 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73  m initializer is
5250: 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62   important,.** b
5260: 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64  ecause garbage d
5270: 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73  ata that appears
5280: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
5290: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65   journal is like
52a0: 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20  ly.** data that 
52b0: 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65  was once in othe
52c0: 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76  r files that hav
52d0: 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74  e now been delet
52e0: 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67  ed.  If the.** g
52f0: 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65  arbage data came
5300: 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74   from an obsolet
5310: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
5320: 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69  the checksums mi
5330: 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63  ght.** be correc
5340: 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69  t.  But by initi
5350: 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63  alizing the chec
5360: 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76  ksum to random v
5370: 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73  alue which.** is
5380: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65   different for e
5390: 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65  very journal, we
53a0: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72   minimize that r
53b0: 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  isk..*/.static c
53c0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
53d0: 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ar aJournalMagic
53e0: 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30  [] = {.  0xd9, 0
53f0: 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c  xd5, 0x05, 0xf9,
5400: 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36   0x20, 0xa1, 0x6
5410: 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a  3, 0xd7,.};../*.
5420: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
5430: 68 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 20  he of each page 
5440: 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f  record in the jo
5450: 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62  urnal is given b
5460: 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y.** the followi
5470: 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65  ng macro..*/.#de
5480: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  fine JOURNAL_PG_
5490: 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50  SZ(pPager)  ((pP
54a0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
54b0: 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  + 8)../*.** The 
54c0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
54d0: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ize for this pag
54e0: 65 72 2e 20 54 68 69 73 20 69 73 20 75 73 75 61  er. This is usua
54f0: 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a  lly the same .**
5500: 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c   size as a singl
5510: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53  e disk sector. S
5520: 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f  ee also setSecto
5530: 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66  rSize()..*/.#def
5540: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ine JOURNAL_HDR_
5550: 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67  SZ(pPager) (pPag
5560: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a  er->sectorSize).
5570: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f  ./*.** The macro
5580: 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69   MEMDB is true i
5590: 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  f we are dealing
55a0: 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f   with an in-memo
55b0: 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  ry database..** 
55c0: 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20  We do this as a 
55d0: 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66  macro so that if
55e0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54   the SQLITE_OMIT
55f0: 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20  _MEMORYDB macro 
5600: 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76  is set,.** the v
5610: 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69  alue of MEMDB wi
5620: 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74  ll be a constant
5630: 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65   and the compile
5640: 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a  r will optimize.
5650: 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74  ** out code that
5660: 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65   would never exe
5670: 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  cute..*/.#ifdef 
5680: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
5690: 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45  RYDB.# define ME
56a0: 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65  MDB 0.#else.# de
56b0: 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65  fine MEMDB pPage
56c0: 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a  r->memDb.#endif.
56d0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
56e0: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
56f0: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
5700: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
5710: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
5720: 34 37 34 38 33 36 34 37 0a 0a 23 69 66 6e 64 65  47483647..#ifnde
5730: 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  f NDEBUG ./*.** 
5740: 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  Usage:.**.**   a
5750: 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
5760: 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
5770: 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ) );.*/.static i
5780: 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  nt assert_pager_
5790: 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  state(Pager *pPa
57a0: 67 65 72 29 7b 0a 0a 20 20 2f 2a 20 41 20 74 65  ger){..  /* A te
57b0: 6d 70 2d 66 69 6c 65 20 69 73 20 61 6c 77 61 79  mp-file is alway
57c0: 73 20 69 6e 20 50 41 47 45 52 5f 45 58 43 4c 55  s in PAGER_EXCLU
57d0: 53 49 56 45 20 6f 72 20 50 41 47 45 52 5f 53 59  SIVE or PAGER_SY
57e0: 4e 43 45 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20  NCED state. */. 
57f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
5800: 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
5810: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
5820: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
5830: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 63 68 61 6e  ;..  /* The chan
5840: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
5850: 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 66   is always set f
5860: 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 20 2a 2f  or temp-files */
5870: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
5880: 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c  r->tempFile==0 |
5890: 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  | pPager->change
58a0: 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20  CountDone );..  
58b0: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
58c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
58d0: 20 74 72 75 65 20 69 66 20 69 74 20 69 73 20 6e   true if it is n
58e0: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
58f0: 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f  e page *pPg into
5900: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
5910: 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64  ..** A page need
5920: 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
5930: 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  into the sub-jou
5940: 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65 78  rnal if there ex
5950: 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d  ists one.** or m
5960: 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  ore open savepoi
5970: 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a  nts for which:.*
5980: 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67  *.**   * The pag
5990: 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  e-number is less
59a0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
59b0: 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  o PagerSavepoint
59c0: 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20  .nOrig, and.**  
59d0: 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72 65   * The bit corre
59e0: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
59f0: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e  page-number is n
5a00: 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20  ot set in.**    
5a10: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
5a20: 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f  pInSavepoint..*/
5a30: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
5a40: 52 65 71 75 69 72 65 73 50 61 67 65 28 50 67 48  RequiresPage(PgH
5a50: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 67 6e 6f  dr *pPg){.  Pgno
5a60: 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
5a70: 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
5a80: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
5a90: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
5aa0: 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e  (i=0; i<pPager->
5ab0: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29  nSavepoint; i++)
5ac0: 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  {.    PagerSavep
5ad0: 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65  oint *p = &pPage
5ae0: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d  r->aSavepoint[i]
5af0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72  ;.    if( p->nOr
5b00: 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73  ig>=pgno && 0==s
5b10: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
5b20: 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74  (p->pInSavepoint
5b30: 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  , pgno) ){.     
5b40: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
5b50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
5b60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
5b70: 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67   true if the pag
5b80: 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
5b90: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5ba0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5bb0: 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67  pageInJournal(Pg
5bc0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  Hdr *pPg){.  ret
5bd0: 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65  urn sqlite3Bitve
5be0: 63 54 65 73 74 28 70 50 67 2d 3e 70 50 61 67 65  cTest(pPg->pPage
5bf0: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
5c00: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a  Pg->pgno);.}../*
5c10: 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69  .** Read a 32-bi
5c20: 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74  t integer from t
5c30: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
5c40: 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65  scriptor.  Store
5c50: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
5c60: 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20  that is read in 
5c70: 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53  *pRes.  Return S
5c80: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
5c90: 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f  ything worked, o
5ca0: 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  r an.** error co
5cb0: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
5cc0: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a  goes wrong..**.*
5cd0: 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65  * All values are
5ce0: 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20   stored on disk 
5cf0: 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a  as big-endian..*
5d00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
5d10: 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f  d32bits(sqlite3_
5d20: 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66  file *fd, i64 of
5d30: 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29  fset, u32 *pRes)
5d40: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
5d50: 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72  r ac[4];.  int r
5d60: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
5d70: 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66  d(fd, ac, sizeof
5d80: 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20  (ac), offset);. 
5d90: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5da0: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  OK ){.    *pRes 
5db0: 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
5dc0: 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(ac);.  }.  ret
5dd0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5de0: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
5df0: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73  integer into a s
5e00: 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20  tring buffer in 
5e10: 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20  big-endian byte 
5e20: 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  order..*/.#defin
5e30: 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29  e put32bits(A,B)
5e40: 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74    sqlite3Put4byt
5e50: 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a  e((u8*)A,B)../*.
5e60: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
5e70: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74  t integer into t
5e80: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
5e90: 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72  scriptor.  Retur
5ea0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
5eb0: 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
5ec0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
5ed0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
5ee0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
5ef0: 74 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71  t write32bits(sq
5f00: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
5f10: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
5f20: 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b  val){.  char ac[
5f30: 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  4];.  put32bits(
5f40: 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75  ac, val);.  retu
5f50: 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  rn sqlite3OsWrit
5f60: 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66  e(fd, ac, 4, off
5f70: 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  set);.}../*.** T
5f80: 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
5f90: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66  his macro is a f
5fa0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28  ile descriptor (
5fb0: 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c  type sqlite3_fil
5fc0: 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30  e*)..** Return 0
5fd0: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70   if it is not op
5fe0: 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20  en, or non-zero 
5ff0: 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69  (but not 1) if i
6000: 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  t is..**.** This
6010: 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72   is so that expr
6020: 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77  essions can be w
6030: 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a  ritten as:.**.**
6040: 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
6050: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e  ager->jfd) ){ ..
6060: 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20  ..**.** instead 
6070: 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70  of.**.**   if( p
6080: 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74  Pager->jfd->pMet
6090: 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23  hods ){ ....*/.#
60a0: 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46  define isOpen(pF
60b0: 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68  d) ((pFd)->pMeth
60c0: 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66  ods)../*.** If f
60d0: 69 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e 2c  ile pFd is open,
60e0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55   call sqlite3OsU
60f0: 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a  nlock() on it..*
6100: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 55  /.static int osU
6110: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
6120: 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f  le *pFd, int eLo
6130: 63 6b 29 7b 0a 20 20 69 66 28 20 21 69 73 4f 70  ck){.  if( !isOp
6140: 65 6e 28 70 46 64 29 20 29 7b 0a 20 20 20 20 72  en(pFd) ){.    r
6150: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6160: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
6170: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46  lite3OsUnlock(pF
6180: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a  d, eLock);.}../*
6190: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
61a0: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  n determines whe
61b0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
61c0: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
61d0: 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  imization.** can
61e0: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
61f0: 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70  is pager. The op
6200: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
6210: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
6220: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
6230: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
6240: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
6250: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
6260: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
6270: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
6280: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
6290: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
62a0: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
62b0: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
62c0: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
62d0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
62e0: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
62f0: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ge size..**.** T
6300: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
6310: 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65  is also always e
6320: 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f  nabled for tempo
6330: 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69  rary files. It i
6340: 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  s.** an error to
6350: 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
6360: 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73  ion if pPager is
6370: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e   opened on an in
6380: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
6390: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
63a0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
63b0: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30  annot be used, 0
63c0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
63d0: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
63e0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c  .** then the val
63f0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
6400: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
6410: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
6420: 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   it.** contains 
6430: 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f  rollback data fo
6440: 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  r exactly one pa
6450: 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ge..*/.#ifdef SQ
6460: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
6470: 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20  IC_WRITE.static 
6480: 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  int jrnlBufferSi
6490: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
64a0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  ){.  assert( !ME
64b0: 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50  MDB );.  if( !pP
64c0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
64d0: 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20  {.    int dc;   
64e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64f0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
6500: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
6510: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
6520: 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  ctor;           
6530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
6540: 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20  ctor size */.   
6550: 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20   int szPage;    
6560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6570: 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
6580: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
6590: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
65a0: 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73  d) );.    dc = s
65b0: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
65c0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
65d0: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e  ager->fd);.    n
65e0: 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d  Sector = pPager-
65f0: 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
6600: 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
6610: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20  ->pageSize;..   
6620: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
6630: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
6640: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61  (512>>8));.    a
6650: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
6660: 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
6670: 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69  5536>>8));.    i
6680: 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54  f( 0==(dc&(SQLIT
6690: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
66a0: 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e  szPage>>8)) || n
66b0: 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29  Sector>szPage) )
66c0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
66d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
66e0: 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44  eturn JOURNAL_HD
66f0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a  R_SZ(pPager) + J
6700: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
6710: 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ger);.}.#endif..
6720: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
6730: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
6740: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
6750: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
6760: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
6770: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
6780: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
6790: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
67a0: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
67b0: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
67c0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
67d0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
67e0: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
67f0: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
6800: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
6810: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
6820: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
6830: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
6840: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
6850: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
6860: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
6870: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
6880: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
6890: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
68a0: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
68b0: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
68c0: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
68d0: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
68e0: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
68f0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
6900: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
6910: 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64  eSize, (unsigned
6920: 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70   char *)pPage->p
6930: 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Data);.}.static 
6940: 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70  void pager_set_p
6950: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
6960: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
6970: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
6980: 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29  _pagehash(pPage)
6990: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
69a0: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
69b0: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
69c0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
69d0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
69e0: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
69f0: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
6a00: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
6a10: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
6a20: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
6a30: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
6a40: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
6a50: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
6a60: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
6a70: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
6a80: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
6a90: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
6aa0: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
6ab0: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
6ac0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
6ad0: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
6ae0: 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e    assert( !pPg->
6af0: 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67  pageHash || pPag
6b00: 65 72 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20  er->errCode.    
6b10: 20 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73    || (pPg->flags
6b20: 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c  &PGHDR_DIRTY) ||
6b30: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d   pPg->pageHash==
6b40: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
6b50: 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  Pg) );.}..#else.
6b60: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61  #define pager_da
6b70: 74 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23  tahash(X,Y)  0.#
6b80: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67  define pager_pag
6b90: 65 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66  ehash(X)  0.#def
6ba0: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
6bb0: 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c  ).#endif  /* SQL
6bc0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
6bd0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  */../*.** When t
6be0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68  his is called th
6bf0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
6c00: 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
6c10: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a  must be open..**
6c20: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
6c30: 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20  ttempts to read 
6c40: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
6c50: 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20   file name from 
6c60: 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74  the .** end of t
6c70: 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20  he file and, if 
6c80: 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69  successful, copi
6c90: 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72  es it into memor
6ca0: 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62  y supplied .** b
6cb0: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65  y the caller. Se
6cc0: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
6cd0: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
6ce0: 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f  nal() for the fo
6cf0: 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20  rmat.** used to 
6d00: 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a  store a master j
6d10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
6d20: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
6d30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
6d40: 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73  *.** zMaster mus
6d50: 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
6d60: 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20  fer of at least 
6d70: 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 61 6c  nMaster bytes al
6d80: 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
6d90: 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73  e caller. This s
6da0: 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33  hould be sqlite3
6db0: 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b  _vfs.mxPathname+
6dc0: 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65  1 (to ensure the
6dd0: 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20  re is.** enough 
6de0: 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74  space to write t
6df0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
6e00: 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20  l name). If the 
6e10: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
6e20: 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f  * name in the jo
6e30: 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20  urnal is longer 
6e40: 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74  than nMaster byt
6e50: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a  es (including a.
6e60: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  ** nul-terminato
6e70: 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  r), then this is
6e80: 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e   handled as if n
6e90: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
6ea0: 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72   name.** were pr
6eb0: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75  esent in the jou
6ec0: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rnal..**.** If a
6ed0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6ee0: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
6ef0: 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20  sent at the end 
6f00: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  of the journal.*
6f10: 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  * file, then it 
6f20: 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  is copied into t
6f30: 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
6f40: 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e  d to by zMaster.
6f50: 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e   A.** nul-termin
6f60: 61 74 6f 72 20 62 79 74 65 20 69 73 20 61 70 70  ator byte is app
6f70: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66  ended to the buf
6f80: 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  fer following th
6f90: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
6fa0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a  nal file name..*
6fb0: 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65  *.** If it is de
6fc0: 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f  termined that no
6fd0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6fe0: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
6ff0: 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72  sent .** zMaster
7000: 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20  [0] is set to 0 
7010: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
7020: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
7030: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
7040: 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66   while reading f
7050: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
7060: 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a  file, an SQLite.
7070: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
7080: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
7090: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73  atic int readMas
70a0: 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74  terJournal(sqlit
70b0: 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20  e3_file *pJrnl, 
70c0: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75  char *zMaster, u
70d0: 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69  32 nMaster){.  i
70e0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
70f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
7100: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33  urn code */.  u3
7110: 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  2 len;          
7120: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
7130: 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d  th in bytes of m
7140: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
7150: 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b  me */.  i64 szJ;
7160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7170: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
7180: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75   in bytes of jou
7190: 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20  rnal file pJrnl 
71a0: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
71b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71c0: 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76  /* MJ checksum v
71d0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a  alue read from j
71e0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
71f0: 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
7200: 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
7210: 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
7220: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
7230: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20  ar aMagic[8];   
7240: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
7250: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
7260: 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  ader */.  zMaste
7270: 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  r[0] = '\0';..  
7280: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
7290: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
72a0: 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73  leSize(pJrnl, &s
72b0: 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31  zJ)).   || szJ<1
72c0: 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  6.   || SQLITE_O
72d0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
72e0: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
72f0: 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20  6, &len)).   || 
7300: 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20  len>=nMaster .  
7310: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
7320: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
7330: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26  pJrnl, szJ-12, &
7340: 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51  cksum)).   || SQ
7350: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
7360: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
7370: 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73  nl, aMagic, 8, s
7380: 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d  zJ-8)).   || mem
7390: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
73a0: 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20  rnalMagic, 8).  
73b0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
73c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
73d0: 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65  ad(pJrnl, zMaste
73e0: 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c  r, len, szJ-16-l
73f0: 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  en)).  ){.    re
7400: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
7410: 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68  /* See if the ch
7420: 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74  ecksum matches t
7430: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
7440: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28  l name */.  for(
7450: 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29  u=0; u<len; u++)
7460: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a  {.    cksum -= z
7470: 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20  Master[u];.  }. 
7480: 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20   if( cksum ){.  
7490: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63    /* If the chec
74a0: 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64  ksum doesn't add
74b0: 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72   up, then one or
74c0: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73   more of the dis
74d0: 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a  k sectors.    **
74e0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
74f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
7500: 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75  ilename is corru
7510: 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73  pted. This means
7520: 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65  .    ** definite
7530: 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f  ly roll back, so
7540: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
7550: 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72  ITE_OK and repor
7560: 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a  t a (nul).    **
7570: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
7580: 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f  filename..    */
7590: 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20  .    len = 0;.  
75a0: 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d  }.  zMaster[len]
75b0: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72   = '\0';.   .  r
75c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
75d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
75e0: 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74   the offset of t
75f0: 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  he sector bounda
7600: 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61  ry at or immedia
7610: 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  tely .** followi
7620: 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ng the value in 
7630: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
7640: 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73  ff, assuming a s
7650: 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f  ector .** size o
7660: 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  f pPager->sector
7670: 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  Size bytes..**.*
7680: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
7690: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
76a0: 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f  **.**   Pager.jo
76b0: 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20  urnalOff        
76c0: 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a    Return value.*
76d0: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
76e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
7700: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
7710: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
7720: 20 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20    512           
7730: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
7740: 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20  **   100        
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
7760: 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20  12.**   2000    
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7780: 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74    2048.** .*/.st
7790: 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c  atic i64 journal
77a0: 48 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20  HdrOffset(Pager 
77b0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
77c0: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36  offset = 0;.  i6
77d0: 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  4 c = pPager->jo
77e0: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
77f0: 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  c ){.    offset 
7800: 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c  = ((c-1)/JOURNAL
7810: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
7820: 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48  + 1) * JOURNAL_H
7830: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
7840: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
7850: 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  set%JOURNAL_HDR_
7860: 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  SZ(pPager)==0 );
7870: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
7880: 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=c );.  assert
7890: 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55  ( (offset-c)<JOU
78a0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
78b0: 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
78c0: 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  offset;.}../*.**
78d0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
78e0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
78f0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
7900: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
7910: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
7920: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
7930: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7940: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69  has not been wri
7950: 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69  tten to.** withi
7960: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
7970: 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20  ansaction (i.e. 
7980: 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  if Pager.journal
7990: 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49  Off==0)..**.** I
79a0: 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20  f doTruncate is 
79b0: 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20  non-zero or the 
79c0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
79d0: 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20  eLimit variable 
79e0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20  is.** set to 0, 
79f0: 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68  then truncate th
7a00: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
7a10: 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
7a20: 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  size. Otherwise,
7a30: 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d  .** zero the 28-
7a40: 62 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74  byte header at t
7a50: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
7a60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e  journal file. In
7a70: 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a   either case, .*
7a80: 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
7a90: 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63  s not in no-sync
7aa0: 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
7ab0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d  journal file imm
7ac0: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74  ediately .** aft
7ad0: 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72  er writing or tr
7ae0: 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a  uncating it..**.
7af0: 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72  ** If Pager.jour
7b00: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20  nalSizeLimit is 
7b10: 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76  set to a positiv
7b20: 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  e, non-zero valu
7b30: 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77  e, and.** follow
7b40: 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69  ing the truncati
7b50: 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65  on or zeroing de
7b60: 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68  scribed above th
7b70: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a  e size of the .*
7b80: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
7b90: 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65  n bytes is large
7ba0: 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  r than this valu
7bb0: 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65  e, then truncate
7bc0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
7bd0: 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f  file to Pager.jo
7be0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62  urnalSizeLimit b
7bf0: 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ytes. The journa
7c00: 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
7c10: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79  ot need to be sy
7c20: 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  nced following t
7c30: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  his operation..*
7c40: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
7c50: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e  ror occurs, aban
7c60: 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  don processing a
7c70: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f  nd return the IO
7c80: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20   error code..** 
7c90: 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
7ca0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  n SQLITE_OK..*/.
7cb0: 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a  static int zeroJ
7cc0: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
7cd0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54  *pPager, int doT
7ce0: 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20  runcate){.  int 
7cf0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7d20: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
7d30: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
7d40: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
7d50: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
7d60: 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
7d70: 20 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69   const i64 iLimi
7d80: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
7d90: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
7da0: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
7db0: 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49  of jsl */..    I
7dc0: 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44  OTRACE(("JZEROHD
7dd0: 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  R %p\n", pPager)
7de0: 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e  ).    if( doTrun
7df0: 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d  cate || iLimit==
7e00: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
7e10: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
7e20: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
7e30: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
7e40: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
7e50: 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38   char zeroHdr[28
7e60: 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72  ] = {0};.      r
7e70: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
7e80: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
7e90: 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28  zeroHdr, sizeof(
7ea0: 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20  zeroHdr), 0);.  
7eb0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
7ec0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50  SQLITE_OK && !pP
7ed0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
7ee0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7ef0: 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
7f00: 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
7f10: 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65  C_DATAONLY|pPage
7f20: 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
7f30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74      }..    /* At
7f40: 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
7f50: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
7f60: 6f 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65  ommitted but the
7f70: 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20   write lock .   
7f80: 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c   ** is still hel
7f90: 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49  d on the file. I
7fa0: 66 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a  f there is a siz
7fb0: 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72  e limit configur
7fc0: 65 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74  ed for .    ** t
7fd0: 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f  he persistent jo
7fe0: 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f  urnal and the jo
7ff0: 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65  urnal file curre
8000: 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f  ntly consumes mo
8010: 72 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20  re.    ** space 
8020: 74 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20  than that limit 
8030: 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e  allows for, trun
8040: 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65  cate it now. The
8050: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20  re is no need.  
8060: 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65    ** to sync the
8070: 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20   file following 
8080: 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  this operation..
8090: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
80a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
80b0: 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20  iLimit>0 ){.    
80c0: 20 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20    i64 sz;.      
80d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
80e0: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
80f0: 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20  fd, &sz);.      
8100: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
8110: 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29  K && sz>iLimit )
8120: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
8130: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
8140: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c  (pPager->jfd, iL
8150: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  imit);.      }. 
8160: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
8170: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
8180: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
8190: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
81a0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
81b0: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
81c0: 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a  nal.** header (J
81d0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
81e0: 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20  tes) is written 
81f0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
8200: 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20   file at the.** 
8210: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
8220: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d  ..**.** The form
8230: 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  at for the journ
8240: 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20  al header is as 
8250: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20  follows:.** - 8 
8260: 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65  bytes: Magic ide
8270: 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  ntifying journal
8280: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20   format..** - 4 
8290: 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66  bytes: Number of
82a0: 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72   records in jour
82b0: 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79  nal, or -1 no-sy
82c0: 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a  nc mode is on..*
82d0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e  * - 4 bytes: Ran
82e0: 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20  dom number used 
82f0: 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a  for page hash..*
8300: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69  * - 4 bytes: Ini
8310: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  tial database pa
8320: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34  ge count..** - 4
8330: 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73   bytes: Sector s
8340: 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
8350: 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
8360: 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  te this journal.
8370: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44  .** - 4 bytes: D
8380: 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a  atabase page siz
8390: 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77  e..** .** Follow
83a0: 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48  ed by (JOURNAL_H
83b0: 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65  DR_SZ - 28) byte
83c0: 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63  s of unused spac
83d0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
83e0: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
83f0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
8400: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
8410: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
8420: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
8430: 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20   code */.  char 
8440: 2a 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65  *zHeader = pPage
8450: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f  r->pTmpSpace;  /
8460: 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63  * Temporary spac
8470: 65 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  e used to build 
8480: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
8490: 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  nHeader = pPager
84a0: 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20  ->pageSize;     
84b0: 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
84c0: 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  r pointed to by 
84d0: 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32  zHeader */.  u32
84e0: 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   nWrite;        
84f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8500: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61   /* Bytes of hea
8510: 64 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74  der sector writt
8520: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20  en */.  int ii; 
8530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
8550: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
8560: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
8570: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
8580: 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c        /* Journal
8590: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
85a0: 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48  en. */..  if( nH
85b0: 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44  eader>JOURNAL_HD
85c0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
85d0: 20 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f      nHeader = JO
85e0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
85f0: 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
8600: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74  If there are act
8610: 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
8620: 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77  nd any of them w
8630: 65 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a  ere created .  *
8640: 2a 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74  * since the most
8650: 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20   recent journal 
8660: 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74  header was writt
8670: 65 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a  en, update the .
8680: 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f    ** PagerSavepo
8690: 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66  int.iHdrOffset f
86a0: 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  ields now..  */.
86b0: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
86c0: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
86d0: 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66  t; ii++){.    if
86e0: 28 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70  ( pPager->aSavep
86f0: 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66  oint[ii].iHdrOff
8700: 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  set==0 ){.      
8710: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
8720: 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65  nt[ii].iHdrOffse
8730: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
8740: 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20  nalOff;.    }.  
8750: 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
8760: 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
8770: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
8780: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
8790: 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a  pPager);..  /* .
87a0: 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e    ** Write the n
87b0: 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20  Rec Field - the 
87c0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
87d0: 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c  ecords that foll
87e0: 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75  ow this.  ** jou
87f0: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72  rnal header. Nor
8800: 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77  mally, zero is w
8810: 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76  ritten to this v
8820: 61 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d  alue at this tim
8830: 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68  e..  ** After th
8840: 65 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64  e records are ad
8850: 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ded to the journ
8860: 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72  al (and the jour
8870: 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a  nal synced, .  *
8880: 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * if in full-syn
8890: 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72  c mode), the zer
88a0: 6f 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e  o is overwritten
88b0: 20 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e   with the true n
88c0: 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65  umber.  ** of re
88d0: 63 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a  cords (see syncJ
88e0: 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a  ournal())..  **.
88f0: 20 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c    ** A faster al
8900: 74 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20  ternative is to 
8910: 77 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46  write 0xFFFFFFFF
8920: 20 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65   to the nRec fie
8930: 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65  ld. When.  ** re
8940: 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ading the journa
8950: 6c 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c  l this value tel
8960: 6c 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73  ls SQLite to ass
8970: 75 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a  ume that the.  *
8980: 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  * rest of the jo
8990: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61  urnal file conta
89a0: 69 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72  ins valid page r
89b0: 65 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73  ecords. This ass
89c0: 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  umption.  ** is 
89d0: 64 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66  dangerous, as if
89e0: 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
89f0: 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69  red whilst writi
8a00: 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
8a10: 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d  l.  ** file it m
8a20: 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20  ay contain some 
8a30: 67 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68  garbage data. Th
8a40: 65 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e  ere are two scen
8a50: 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65  arios.  ** where
8a60: 20 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62   this risk can b
8a70: 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a  e ignored:.  **.
8a80: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
8a90: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f  e pager is in no
8aa0: 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72  -sync mode. Corr
8ab0: 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f  uption can follo
8ac0: 77 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77  w a.  **     pow
8ad0: 65 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68  er failure in th
8ae0: 69 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a  is case anyway..
8af0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68    **.  **   * Wh
8b00: 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  en the SQLITE_IO
8b10: 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20  CAP_SAFE_APPEND 
8b20: 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69  flag is set. Thi
8b30: 73 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a  s guarantees.  *
8b40: 2a 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61  *     that garba
8b50: 67 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72  ge data is never
8b60: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
8b70: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
8b80: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
8b90: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
8ba0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79   || pPager->noSy
8bb0: 6e 63 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61  nc );.  if( (pPa
8bc0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 7c 7c 20  ger->noSync) || 
8bd0: 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
8be0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
8bf0: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a  NALMODE_MEMORY).
8c00: 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73     || (sqlite3Os
8c10: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
8c20: 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
8c30: 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
8c40: 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29  AFE_APPEND) .  )
8c50: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65  {.    memcpy(zHe
8c60: 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  ader, aJournalMa
8c70: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
8c80: 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20  rnalMagic));.   
8c90: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
8ca0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
8cb0: 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66  nalMagic)], 0xff
8cc0: 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65  ffffff);.  }else
8cd0: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48 65  {.    memset(zHe
8ce0: 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ader, 0, sizeof(
8cf0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
8d00: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
8d10: 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61   random check-ha
8d20: 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a  sh initialiser *
8d30: 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  / .  sqlite3_ran
8d40: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
8d50: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
8d60: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
8d70: 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62  mInit);.  put32b
8d80: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
8d90: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
8da0: 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63  c)+4], pPager->c
8db0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20  ksumInit);.  /* 
8dc0: 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61  The initial data
8dd0: 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  base size */.  p
8de0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
8df0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
8e00: 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67  lMagic)+8], pPag
8e10: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b  er->dbOrigSize);
8e20: 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65  .  /* The assume
8e30: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f  d sector size fo
8e40: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a  r this process *
8e50: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
8e60: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
8e70: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d  ournalMagic)+12]
8e80: 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  , pPager->sector
8e90: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  Size);..  /* The
8ea0: 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
8eb0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
8ec0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
8ed0: 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50  alMagic)+16], pP
8ee0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
8ef0: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
8f00: 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20  ing the tail of 
8f10: 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f  the buffer is no
8f20: 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76  t necessary.  Ev
8f30: 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f  erything.  ** wo
8f40: 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20  rks find if the 
8f50: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74  following memset
8f60: 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20  () is omitted.  
8f70: 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  But initializing
8f80: 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79  .  ** the memory
8f90: 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69   prevents valgri
8fa0: 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e  nd from complain
8fb0: 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77  ing, so we are w
8fc0: 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74  illing to.  ** t
8fd0: 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ake the performa
8fe0: 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20  nce hit..  */.  
8ff0: 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b  memset(&zHeader[
9000: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
9010: 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20  agic)+20], 0,.  
9020: 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28         nHeader-(
9030: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
9040: 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f  agic)+20));..  /
9050: 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74 20  * In theory, it 
9060: 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72  is only necessar
9070: 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 32  y to write the 2
9080: 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68 65  8 bytes that the
9090: 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68   .  ** journal h
90a0: 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20 74  eader consumes t
90b0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
90c0: 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69 6e  le here. Then in
90d0: 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a  crement the .  *
90e0: 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  * Pager.journalO
90f0: 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20 4a  ff variable by J
9100: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f  OURNAL_HDR_SZ so
9110: 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 0a   that the next .
9120: 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 77    ** record is w
9130: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 6f  ritten to the fo
9140: 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20 28  llowing sector (
9150: 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69 6e  leaving a gap in
9160: 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74   the file.  ** t
9170: 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c  hat will be impl
9180: 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e  icitly filled in
9190: 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a   by the OS)..  *
91a0: 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 69  *.  ** However i
91b0: 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63 6f  t has been disco
91c0: 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73 6f  vered that on so
91d0: 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73 20  me systems this 
91e0: 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a  pattern can .  *
91f0: 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74  * be significant
9200: 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 63  ly slower than c
9210: 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69 74  ontiguously writ
9220: 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20  ing data to the 
9230: 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20  file,.  ** even 
9240: 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65 78  if that means ex
9250: 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e 67  plicitly writing
9260: 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c 6f   data to the blo
9270: 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55  ck of .  ** (JOU
9280: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
9290: 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69 6c  ) bytes that wil
92a0: 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 53  l not be used. S
92b0: 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a 20  o that is what. 
92c0: 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20   ** is done. .  
92d0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70  **.  ** The loop
92e0: 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65 72   is required her
92f0: 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 65  e in case the se
9300: 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72  ctor-size is lar
9310: 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ger than the .  
9320: 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ** database page
9330: 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68 65   size. Since the
9340: 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72 20   zHeader buffer 
9350: 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61  is only Pager.pa
9360: 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65  geSize.  ** byte
9370: 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20  s in size, more 
9380: 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f  than one call to
9390: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
93a0: 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72 65  ) may be require
93b0: 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61  d.  ** to popula
93c0: 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  te the entire jo
93d0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63  urnal header sec
93e0: 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  tor..  */ .  for
93f0: 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53  (nWrite=0; rc==S
9400: 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65  QLITE_OK&&nWrite
9410: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
9420: 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b  pPager); nWrite+
9430: 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49  =nHeader){.    I
9440: 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
9450: 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
9460: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
9470: 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72  rnalHdr, nHeader
9480: 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
9490: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
94a0: 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
94b0: 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65 72   nHeader, pPager
94c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
94d0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
94e0: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d  r->journalHdr <=
94f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9500: 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67 65  Off );.    pPage
9510: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
9520: 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20   nHeader;.  }.. 
9530: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
9540: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
9550: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
9560: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
9570: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
9580: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
9590: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
95a0: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
95b0: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
95c0: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
95d0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
95e0: 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  . The current lo
95f0: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
9600: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69  urnal file is gi
9610: 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72  ven by.** pPager
9620: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65  ->journalOff. Se
9630: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
9640: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a   function writeJ
9650: 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a  ournalHdr() for.
9660: 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  ** a description
9670: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
9680: 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a  header format..*
9690: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64  *.** If the head
96a0: 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65  er is read succe
96b0: 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20  ssfully, *pNRec 
96c0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
96d0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20  mber of.** page 
96e0: 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e  records followin
96f0: 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e  g this header an
9700: 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65  d *pDbSize is se
9710: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
9720: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
9730: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
9740: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
9750: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
9760: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
9770: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
9780: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
9790: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
97a0: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
97b0: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
97c0: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
97d0: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
97e0: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
97f0: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
9800: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
9810: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
9820: 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64  d and *pNRec and
9830: 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e   *PDbSize are un
9840: 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55  defined.  If JOU
9850: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
9860: 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72  s.** cannot be r
9870: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
9880: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72  rnal file an err
9890: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
98a0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
98b0: 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  nt readJournalHd
98c0: 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
98d0: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
98e0: 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
98f0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74  t */.  int isHot
9900: 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  ,.  i64 journalS
9910: 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
9920: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
9930: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
9940: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
9950: 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20  u32 *pNRec,     
9960: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9970: 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20  OUT: Value read 
9980: 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69  from the nRec fi
9990: 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44  eld */.  u32 *pD
99a0: 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  bSize           
99b0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
99c0: 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20  lue of original 
99d0: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 69  database size fi
99e0: 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  eld */.){.  int 
99f0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
9a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
9a10: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73  rn code */.  uns
9a20: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
9a30: 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62  c[8];     /* A b
9a40: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
9a50: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
9a60: 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a80: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f   /* Offset of jo
9a90: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69  urnal header bei
9aa0: 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73  ng read */..  as
9ab0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
9ac0: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20  ger->jfd) );    
9ad0: 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c    /* Journal fil
9ae0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20  e must be open. 
9af0: 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65  */..  /* Advance
9b00: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
9b10: 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  f to the start o
9b20: 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  f the next secto
9b30: 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a  r. If the.  ** j
9b40: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
9b50: 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65  oo small for the
9b60: 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64 65  re to be a heade
9b70: 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69 73  r stored at this
9b80: 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74  .  ** point, ret
9b90: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
9ba0: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
9bb0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
9bc0: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
9bd0: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
9be0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
9bf0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
9c00: 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
9c10: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
9c20: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
9c30: 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
9c40: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9c50: 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69  ff;..  /* Read i
9c60: 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62 79  n the first 8 by
9c70: 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
9c80: 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74 68  al header. If th
9c90: 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a  ey do not match.
9ca0: 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20    ** the  magic 
9cb0: 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20  string found at 
9cc0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
9cd0: 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  h journal header
9ce0: 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  , return.  ** SQ
9cf0: 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e  LITE_DONE. If an
9d00: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
9d10: 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
9d20: 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
9d30: 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e  e,.  ** proceed.
9d40: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f  .  */.  if( isHo
9d50: 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70 50  t || iHdrOff!=pP
9d60: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
9d70: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
9d80: 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
9d90: 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
9da0: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20  sizeof(aMagic), 
9db0: 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69 66  iHdrOff);.    if
9dc0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
9dd0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
9de0: 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d     if( memcmp(aM
9df0: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
9e00: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
9e10: 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ic))!=0 ){.     
9e20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
9e30: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
9e40: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69    /* Read the fi
9e50: 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69 74  rst three 32-bit
9e60: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a   fields of the j
9e70: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54  ournal header: T
9e80: 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65  he nRec.  ** fie
9e90: 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ld, the checksum
9ea0: 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64  -initializer and
9eb0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
9ec0: 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74 0a  ze at the start.
9ed0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e    ** of the tran
9ee0: 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20  saction. Return 
9ef0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
9f00: 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
9f10: 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rong..  */.  if(
9f20: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
9f30: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
9f40: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
9f50: 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20  f+8, pNRec)).   
9f60: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
9f70: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
9f80: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
9f90: 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d  Off+12, &pPager-
9fa0: 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20  >cksumInit)).   
9fb0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
9fc0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
9fd0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
9fe0: 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29  Off+16, pDbSize)
9ff0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
a000: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
a010: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
a020: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33  Off==0 ){.    u3
a030: 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20  2 iPageSize;    
a040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
a050: 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  ge-size field of
a060: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
a070: 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63 74  */.    u32 iSect
a080: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
a090: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69      /* Sector-si
a0a0: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
a0b0: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
a0c0: 20 20 75 31 36 20 69 50 61 67 65 53 69 7a 65 31    u16 iPageSize1
a0d0: 36 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  6;             /
a0e0: 2a 20 43 6f 70 79 20 6f 66 20 69 50 61 67 65 53  * Copy of iPageS
a0f0: 69 7a 65 20 69 6e 20 31 36 2d 62 69 74 20 76 61  ize in 16-bit va
a100: 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f  riable */..    /
a110: 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d  * Read the page-
a120: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
a130: 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  size journal hea
a140: 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20  der fields. */. 
a150: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
a160: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
a170: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
a180: 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65  iHdrOff+20, &iSe
a190: 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20  ctorSize)).     
a1a0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
a1b0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
a1c0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
a1d0: 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69  Off+24, &iPageSi
a1e0: 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ze)).    ){.    
a1f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
a200: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
a210: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
a220: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
a230: 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
a240: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a  tor-size fields.
a250: 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69      ** are withi
a260: 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27  n range. To be '
a270: 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20  in range', both 
a280: 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62  values need to b
a290: 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a  e a power.    **
a2a0: 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20   of two greater 
a2b0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
a2c0: 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20   512 or 32, and 
a2d0: 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e  not greater than
a2e0: 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72   their .    ** r
a2f0: 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c  espective compil
a300: 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c  e time maximum l
a310: 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  imits..    */.  
a320: 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c    if( iPageSize<
a330: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
a340: 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53       || iSectorS
a350: 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69  ize<32.     || i
a360: 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  PageSize>SQLITE_
a370: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c  MAX_PAGE_SIZE ||
a380: 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58   iSectorSize>MAX
a390: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20  _SECTOR_SIZE.   
a3a0: 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65    || ((iPageSize
a3b0: 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d  -1)&iPageSize)!=
a3c0: 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72  0   || ((iSector
a3d0: 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53  Size-1)&iSectorS
a3e0: 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  ize)!=0 .    ){.
a3f0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
a400: 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65 2d  either the page-
a410: 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73  size or sector-s
a420: 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ize in the journ
a430: 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20  al-header is .  
a440: 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20      ** invalid, 
a450: 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
a460: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65 20   that wrote the 
a470: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d  journal-header m
a480: 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20 20  ust have .      
a490: 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f 72  ** crashed befor
a4a0: 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61 73  e the header was
a4b0: 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73   synced. In this
a4c0: 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64 69   case stop readi
a4d0: 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ng .      ** the
a4e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
a4f0: 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  re..      */.   
a500: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a510: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
a520: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
a530: 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74  page-size to mat
a540: 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ch the value rea
a550: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
a560: 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20  al. .    ** Use 
a570: 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63  a testcase() mac
a580: 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ro to make sure 
a590: 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  that malloc fail
a5a0: 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20  ure within .    
a5b0: 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65 73  ** PagerSetPages
a5c0: 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64 2e  ize() is tested.
a5d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 50 61 67  .    */.    iPag
a5e0: 65 53 69 7a 65 31 36 20 3d 20 28 75 31 36 29 69  eSize16 = (u16)i
a5f0: 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  PageSize;.    rc
a600: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
a610: 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
a620: 72 2c 20 26 69 50 61 67 65 53 69 7a 65 31 36 2c  r, &iPageSize16,
a630: 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
a640: 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
a650: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
a660: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
a670: 7c 20 69 50 61 67 65 53 69 7a 65 31 36 3d 3d 28  | iPageSize16==(
a680: 75 31 36 29 69 50 61 67 65 53 69 7a 65 20 29 3b  u16)iPageSize );
a690: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
a6a0: 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  the assumed sect
a6b0: 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68  or-size to match
a6c0: 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20   the value used 
a6d0: 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  by .    ** the p
a6e0: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
a6f0: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
a700: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
a710: 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65  l was.    ** cre
a720: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
a730: 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69  s other than thi
a740: 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73  s one, then this
a750: 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20   routine.    ** 
a760: 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
a770: 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
a780: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68  r_playback(). Th
a790: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20  e local value.  
a7a0: 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65    ** of Pager.se
a7b0: 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74  ctorSize is rest
a7c0: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ored at the end 
a7d0: 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e  of that routine.
a7e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
a7f0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
a800: 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20   iSectorSize;.  
a810: 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
a820: 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
a830: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
a840: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
a850: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
a860: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
a870: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
a880: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
a890: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
a8a0: 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
a8b0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
a8c0: 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
a8d0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
a8e0: 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
a8f0: 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
a900: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
a910: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
a920: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
a930: 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
a940: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
a950: 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
a960: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
a970: 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
a980: 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
a990: 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
a9a0: 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  rmat is:.**.**  
a9b0: 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45   + 4 bytes: PAGE
a9c0: 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20  R_MJ_PGNO..**   
a9d0: 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + N bytes: Maste
a9e0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
a9f0: 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20  me in utf-8..** 
aa00: 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28    + 4 bytes: N (
aa10: 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72  length of master
aa20: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
aa30: 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74   bytes, no nul-t
aa40: 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20  erminator)..**  
aa50: 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74   + 4 bytes: Mast
aa60: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
aa70: 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b  checksum..**   +
aa80: 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
aa90: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
aaa0: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
aab0: 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
aac0: 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
aad0: 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
aae0: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
aaf0: 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65  al name, where e
ab00: 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65  ach byte is inte
ab10: 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67  rpreted as a sig
ab20: 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65  ned 8-bit intege
ab30: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73  r..**.** If zMas
ab40: 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ter is a NULL po
ab50: 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f  inter (occurs fo
ab60: 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
ab70: 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
ab80: 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  , .** this call 
ab90: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
aba0: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d  tatic int writeM
abb0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67  asterJournal(Pag
abc0: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
abd0: 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
abe0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
abf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac00: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
ac10: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ode */.  int nMa
ac20: 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ster;           
ac30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
ac40: 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  gth of string zM
ac50: 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  aster */.  i64 i
ac60: 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
ac70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
ac80: 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20  ffset of header 
ac90: 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
aca0: 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a  */.  i64 jrnlSiz
acb0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
acc0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
acd0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e   journal file on
ace0: 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63   disk */.  u32 c
acf0: 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20  ksum = 0;       
ad00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
ad10: 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e  hecksum of strin
ad20: 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20  g zMaster */..  
ad30: 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20  if( !zMaster || 
ad40: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
ad50: 72 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e  r.   || pPager->
ad60: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
ad70: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
ad80: 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50 61  EMORY .   || pPa
ad90: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
ada0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
adb0: 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20 20  ODE_OFF .  ){.  
adc0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
add0: 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  OK;.  }.  pPager
ade0: 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b  ->setMaster = 1;
adf0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
ae00: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
ae10: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
ae20: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
ae30: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
ae40: 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61  lOff );..  /* Ca
ae50: 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e 67  lculate the leng
ae60: 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64 20  th in bytes and 
ae70: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  the checksum of 
ae80: 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72  zMaster */.  for
ae90: 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73  (nMaster=0; zMas
aea0: 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d  ter[nMaster]; nM
aeb0: 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b  aster++){.    ck
aec0: 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e  sum += zMaster[n
aed0: 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20  Master];.  }..  
aee0: 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79  /* If in full-sy
aef0: 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65  nc mode, advance
af00: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73   to the next dis
af10: 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20  k sector before 
af20: 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  writing.  ** the
af30: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
af40: 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e  name. This is in
af50: 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f   case the previo
af60: 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20  us page written 
af70: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  to.  ** the jour
af80: 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20  nal has already 
af90: 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a  been synced..  *
afa0: 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
afb0: 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
afc0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
afd0: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
afe0: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
aff0: 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70   }.  iHdrOff = p
b000: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
b010: 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  f;..  /* Write t
b020: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
b030: 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65 6e  l data to the en
b040: 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d of the journal
b050: 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61   file. If.  ** a
b060: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
b070: 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
b080: 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
b090: 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ler..  */.  if( 
b0a0: 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
b0b0: 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
b0c0: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50 41  jfd, iHdrOff, PA
b0d0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
b0e0: 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  er)))).   || (0 
b0f0: 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
b100: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
b110: 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d  jfd, zMaster, nM
b120: 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b 34  aster, iHdrOff+4
b130: 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
b140: 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
b150: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
b160: 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
b170: 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20 20  , nMaster))).   
b180: 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77  || (0 != (rc = w
b190: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
b1a0: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
b1b0: 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73  4+nMaster+4, cks
b1c0: 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  um))).   || (0 !
b1d0: 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  = (rc = sqlite3O
b1e0: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
b1f0: 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  fd, aJournalMagi
b200: 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b  c, 8, iHdrOff+4+
b210: 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29  nMaster+8))).  )
b220: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
b230: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
b240: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d  ournalOff += (nM
b250: 61 73 74 65 72 2b 32 30 29 3b 0a 20 20 70 50 61  aster+20);.  pPa
b260: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
b270: 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b  !pPager->noSync;
b280: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
b290: 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74  ger is in perist
b2a0: 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ent-journal mode
b2b0: 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69  , then the physi
b2c0: 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  cal .  ** journa
b2d0: 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e  l-file may exten
b2e0: 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  d past the end o
b2f0: 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  f the master-jou
b300: 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61  rnal name.  ** a
b310: 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61  nd 8 bytes of ma
b320: 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72  gic data just wr
b330: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c  itten to the fil
b340: 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a  e. This is .  **
b350: 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75   dangerous becau
b360: 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72  se the code to r
b370: 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f  ollback a hot-jo
b380: 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20  urnal file.  ** 
b390: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65  will not be able
b3a0: 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73   to find the mas
b3b0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
b3c0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20   to determine . 
b3d0: 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e   ** whether or n
b3e0: 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ot the journal i
b3f0: 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a  s hot. .  **.  *
b400: 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20  * Easiest thing 
b410: 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63  to do in this sc
b420: 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75  enario is to tru
b430: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
b440: 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20  l .  ** file to 
b450: 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a  the required siz
b460: 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53  e..  */ .  if( S
b470: 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
b480: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
b490: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
b4a0: 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26  jrnlSize)).   &&
b4b0: 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72   jrnlSize>pPager
b4c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29  ->journalOff.  )
b4d0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
b4e0: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
b4f0: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
b500: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
b510: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
b520: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
b530: 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68  page in the hash
b540: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73   table given its
b550: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52 65   page number. Re
b560: 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
b570: 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72  r to the page or
b580: 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65 71   NULL if the req
b590: 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
b5a0: 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  ot .** already i
b5b0: 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  n memory..*/.sta
b5c0: 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
b5d0: 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  _lookup(Pager *p
b5e0: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
b5f0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20  ){.  PgHdr *p;  
b600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b610: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
b620: 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20   value */..  /* 
b630: 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
b640: 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74 6f  le for a call to
b650: 20 50 63 61 63 68 65 46 65 74 63 68 28 29 20 77   PcacheFetch() w
b660: 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d  ith createFlag==
b670: 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c 20  0 to.  ** fail, 
b680: 73 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70 74  since no attempt
b690: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79 6e   to allocate dyn
b6a0: 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c 6c  amic memory will
b6b0: 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20   be made..  */. 
b6c0: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50 63   (void)sqlite3Pc
b6d0: 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72  acheFetch(pPager
b6e0: 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
b6f0: 20 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75 72   0, &p);.  retur
b700: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  n p;.}../*.** Un
b710: 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69  less the pager i
b720: 73 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74 65  s in error-state
b730: 2c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e  , discard all in
b740: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2e 20 49  -memory pages. I
b750: 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 69  f.** the pager i
b760: 73 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74 65  s in error-state
b770: 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c  , then this call
b780: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
b790: 2a 2a 20 54 4f 44 4f 3a 20 57 68 79 20 63 61 6e  ** TODO: Why can
b7a0: 20 77 65 20 6e 6f 74 20 72 65 73 65 74 20 74 68   we not reset th
b7b0: 65 20 70 61 67 65 72 20 77 68 69 6c 65 20 69 6e  e pager while in
b7c0: 20 65 72 72 6f 72 20 73 74 61 74 65 3f 0a 2a 2f   error state?.*/
b7d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
b7e0: 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a  er_reset(Pager *
b7f0: 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 53  pPager){.  if( S
b800: 51 4c 49 54 45 5f 4f 4b 3d 3d 70 50 61 67 65 72  QLITE_OK==pPager
b810: 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
b820: 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
b830: 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
b840: 61 63 6b 75 70 29 3b 0a 20 20 20 20 73 71 6c 69  ackup);.    sqli
b850: 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70  te3PcacheClear(p
b860: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
b870: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
b880: 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  izeValid = 0;.  
b890: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
b8a0: 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69  all structures i
b8b0: 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  n the Pager.aSav
b8c0: 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61  epoint[] array a
b8d0: 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50  nd set both.** P
b8e0: 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20  ager.aSavepoint 
b8f0: 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70  and Pager.nSavep
b900: 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c  oint to zero. Cl
b910: 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  ose the sub-jour
b920: 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  nal.** if it is 
b930: 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
b940: 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63  er is not in exc
b950: 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a  lusive mode..*/.
b960: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
b970: 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
b980: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
b990: 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
b9a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
b9b0: 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67  ator for looping
b9c0: 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61   through Pager.a
b9d0: 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66  Savepoint */.  f
b9e0: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
b9f0: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
ba00: 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  ii++){.    sqlit
ba10: 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
ba20: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
ba30: 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f  nt[ii].pInSavepo
ba40: 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  int);.  }.  if( 
ba50: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
ba60: 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65  veMode || sqlite
ba70: 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50  3IsMemJournal(pP
ba80: 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
ba90: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
baa0: 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b  e(pPager->sjfd);
bab0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
bac0: 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76  ree(pPager->aSav
bad0: 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65  epoint);.  pPage
bae0: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->aSavepoint = 
baf0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61  0;.  pPager->nSa
bb00: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70  vepoint = 0;.  p
bb10: 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d  Pager->nSubRec =
bb20: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
bb30: 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20   the bit number 
bb40: 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65  pgno in the Page
bb50: 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
bb60: 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76  vepoint .** bitv
bb70: 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20  ecs of all open 
bb80: 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75  savepoints. Retu
bb90: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
bba0: 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72  successful.** or
bbb0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
bbc0: 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72   a malloc failur
bbd0: 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61  e occurs..*/.sta
bbe0: 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76  tic int addToSav
bbf0: 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61  epointBitvecs(Pa
bc00: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
bc10: 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69  o pgno){.  int i
bc20: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
bc30: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
bc40: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
bc50: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
bc60: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
bc70: 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d  de */..  for(ii=
bc80: 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
bc90: 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
bca0: 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f  .    PagerSavepo
bcb0: 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72  int *p = &pPager
bcc0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
bcd0: 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d  ;.    if( pgno<=
bce0: 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20  p->nOrig ){.    
bcf0: 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42    rc |= sqlite3B
bd00: 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53  itvecSet(p->pInS
bd10: 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b  avepoint, pgno);
bd20: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
bd30: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
bd40: 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  M );.      asser
bd50: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
bd60: 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
bd70: 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20  OMEM );.    }.  
bd80: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
bd90: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
bda0: 72 75 65 20 69 66 20 74 68 69 73 20 70 61 67 65  rue if this page
bdb0: 72 20 75 73 65 73 20 61 20 77 72 69 74 65 2d 61  r uses a write-a
bdc0: 68 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64  head log instead
bdd0: 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a   of the usual.**
bde0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
bdf0: 6c 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c  l. Otherwise fal
be00: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  se..*/.#ifndef S
be10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73  QLITE_OMIT_WAL.s
be20: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
be30: 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61  seWal(Pager *pPa
be40: 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  ger){.  return (
be50: 70 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29  pPager->pWal!=0)
be60: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
be70: 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78  ne pagerUseWal(x
be80: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
be90: 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29  erRollbackWal(x)
bea0: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
beb0: 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78  rWalFrames(v,w,x
bec0: 2c 79 2c 7a 29 20 30 0a 23 20 64 65 66 69 6e 65  ,y,z) 0.# define
bed0: 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
bee0: 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45  resent(z) SQLITE
bef0: 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67  _OK.# define pag
bf00: 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
bf10: 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45  action(z) SQLITE
bf20: 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  _OK.#endif../*.*
bf30: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
bf40: 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73  abase file. This
bf50: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
bf60: 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65  o-op if the page
bf70: 72 0a 2a 2a 20 69 73 20 69 6e 20 65 78 63 6c 75  r.** is in exclu
bf80: 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sive mode..**.**
bf90: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
bfa0: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65 72   currently in er
bfb0: 72 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63 61  ror state, disca
bfc0: 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  rd the contents 
bfd0: 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  of .** the cache
bfe0: 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50   and reset the P
bff0: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 69  ager structure i
c000: 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20 49  nternal state. I
c010: 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e  f there is.** an
c020: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69   open journal-fi
c030: 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78  le, then the nex
c040: 74 20 74 69 6d 65 20 61 20 73 68 61 72 65 64 2d  t time a shared-
c050: 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
c060: 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65 72  .** on the pager
c070: 20 66 69 6c 65 20 28 62 79 20 74 68 69 73 20 6f   file (by this o
c080: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
c090: 65 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62 65  ess), it will be
c0a0: 0a 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 61  .** treated as a
c0b0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
c0c0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
c0d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
c0e0: 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
c0f0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
c100: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
c110: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  veMode ){.    in
c120: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c130: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
c140: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 20  turn code */.   
c150: 20 69 6e 74 20 69 44 63 20 3d 20 69 73 4f 70 65   int iDc = isOpe
c160: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 3f 73 71  n(pPager->fd)?sq
c170: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
c180: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
c190: 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20 20  ger->fd):0;..   
c1a0: 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61   /* If the opera
c1b0: 74 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70  ting system supp
c1c0: 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20  ort deletion of 
c1d0: 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74 68 65 6e  open files, then
c1e0: 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74 68  .    ** close th
c1f0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
c200: 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65  hen dropping the
c210: 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 20   database lock. 
c220: 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a   Otherwise.    *
c230: 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63  * another connec
c240: 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61  tion with journa
c250: 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69  l_mode=delete mi
c260: 67 68 74 20 64 65 6c 65 74 65 20 74 68 65 20 66  ght delete the f
c270: 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20 66  ile.    ** out f
c280: 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20  rom under us..  
c290: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
c2a0: 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
c2b0: 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20 35  ODE_MEMORY   & 5
c2c0: 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
c2d0: 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
c2e0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20  ALMODE_OFF      
c2f0: 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
c300: 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
c310: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20  URNALMODE_WAL   
c320: 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20     & 5)!=1 );.  
c330: 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
c340: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
c350: 45 54 45 20 20 20 26 20 35 29 21 3d 31 20 29 3b  ETE   & 5)!=1 );
c360: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
c370: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
c380: 54 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31  TRUNCATE & 5)==1
c390: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
c3a0: 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
c3b0: 44 45 5f 50 45 52 53 49 53 54 20 20 26 20 35 29  DE_PERSIST  & 5)
c3c0: 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 30  ==1 );.    if( 0
c3d0: 3d 3d 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f  ==(iDc & SQLITE_
c3e0: 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c  IOCAP_UNDELETABL
c3f0: 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20 20  E_WHEN_OPEN).   
c400: 20 20 7c 7c 20 31 21 3d 28 70 50 61 67 65 72 2d    || 1!=(pPager-
c410: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 35  >journalMode & 5
c420: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  ).    ){.      s
c430: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
c440: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
c450: 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  }..    sqlite3Bi
c460: 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
c470: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
c480: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
c490: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
c4a0: 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
c4b0: 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a  oints(pPager);..
c4c0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
c4d0: 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20  le is unlocked, 
c4e0: 73 6f 6d 65 62 6f 64 79 20 65 6c 73 65 20 6d 69  somebody else mi
c4f0: 67 68 74 20 63 68 61 6e 67 65 20 69 74 2e 20 54  ght change it. T
c500: 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  he.    ** values
c510: 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72   stored in Pager
c520: 2e 64 62 53 69 7a 65 20 65 74 63 2e 20 6d 69 67  .dbSize etc. mig
c530: 68 74 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69  ht become invali
c540: 64 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 69 73  d if.    ** this
c550: 20 68 61 70 70 65 6e 73 2e 20 20 4f 6e 65 20 63   happens.  One c
c560: 61 6e 20 61 72 67 75 65 20 74 68 61 74 20 74 68  an argue that th
c570: 69 73 20 64 6f 65 73 6e 27 74 20 6e 65 65 64 20  is doesn't need 
c580: 74 6f 20 62 65 20 63 6c 65 61 72 65 64 0a 20 20  to be cleared.  
c590: 20 20 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 63    ** until the c
c5a0: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63 68  hange-counter ch
c5b0: 65 63 6b 20 66 61 69 6c 73 20 69 6e 20 50 61 67  eck fails in Pag
c5c0: 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 2e 0a  erSharedLock()..
c5d0: 20 20 20 20 2a 2a 20 43 6c 65 61 72 69 6e 67 20      ** Clearing 
c5e0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 63 61  the page size ca
c5f0: 63 68 65 20 68 65 72 65 20 69 73 20 62 65 69 6e  che here is bein
c600: 67 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 0a  g conservative..
c610: 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
c620: 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
c630: 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67   0;..    if( pag
c640: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
c650: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c660: 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73  3WalEndReadTrans
c670: 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
c680: 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Wal);.    }else{
c690: 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73 55 6e  .      rc = osUn
c6a0: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
c6b0: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d   NO_LOCK);.    }
c6c0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
c6d0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
c6e0: 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 7d  Code = rc;.    }
c6f0: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55  .    IOTRACE(("U
c700: 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61  NLOCK %p\n", pPa
c710: 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20 49 66  ger))..    /* If
c720: 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69   Pager.errCode i
c730: 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65  s set, the conte
c740: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
c750: 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65   cache cannot be
c760: 0a 20 20 20 20 2a 2a 20 74 72 75 73 74 65 64 2e  .    ** trusted.
c770: 20 4e 6f 77 20 74 68 61 74 20 74 68 65 20 70 61   Now that the pa
c780: 67 65 72 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  ger file is unlo
c790: 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e  cked, the conten
c7a0: 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ts of the.    **
c7b0: 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64 69   cache can be di
c7c0: 73 63 61 72 64 65 64 20 61 6e 64 20 74 68 65 20  scarded and the 
c7d0: 65 72 72 6f 72 20 63 6f 64 65 20 73 61 66 65 6c  error code safel
c7e0: 79 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a  y cleared..    *
c7f0: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
c800: 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
c810: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
c820: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
c830: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
c840: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
c850: 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65 72     }.      pager
c860: 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
c870: 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65      }..    pPage
c880: 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
c890: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ne = 0;.    pPag
c8a0: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
c8b0: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70 50  R_UNLOCK;.    pP
c8c0: 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
c8d0: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
c8e0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
c8f0: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
c900: 64 20 77 68 65 6e 20 61 6e 20 49 4f 45 52 52 2c  d when an IOERR,
c910: 20 43 4f 52 52 55 50 54 20 6f 72 20 46 55 4c 4c   CORRUPT or FULL
c920: 20 65 72 72 6f 72 0a 2a 2a 20 6d 61 79 20 68 61   error.** may ha
c930: 76 65 20 6f 63 63 75 72 72 65 64 2e 20 54 68 65  ve occurred. The
c940: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
c950: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
c960: 74 68 65 20 70 61 67 65 72 20 0a 2a 2a 20 73 74  the pager .** st
c970: 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65 63  ructure, the sec
c980: 6f 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f  ond the error-co
c990: 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72  de about to be r
c9a0: 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67  eturned by a pag
c9b0: 65 72 20 0a 2a 2a 20 41 50 49 20 66 75 6e 63 74  er .** API funct
c9c0: 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72  ion. The value r
c9d0: 65 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70  eturned is a cop
c9e0: 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  y of the second 
c9f0: 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20  argument .** to 
ca00: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a  this function. .
ca10: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63  **.** If the sec
ca20: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
ca30: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
ca40: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72  LITE_CORRUPT, or
ca50: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20   SQLITE_FULL.** 
ca60: 74 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65  the error become
ca70: 73 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55 6e  s persistent. Un
ca80: 74 69 6c 20 74 68 65 20 70 65 72 73 69 73 74 65  til the persiste
ca90: 6e 74 20 65 72 72 6f 72 20 69 73 20 63 6c 65 61  nt error is clea
caa0: 72 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65  red,.** subseque
cab0: 6e 74 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20  nt API calls on 
cac0: 74 68 69 73 20 50 61 67 65 72 20 77 69 6c 6c 20  this Pager will 
cad0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75  immediately retu
cae0: 72 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20  rn the same .** 
caf0: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
cb00: 2a 20 41 20 70 65 72 73 69 73 74 65 6e 74 20 65  * A persistent e
cb10: 72 72 6f 72 20 69 6e 64 69 63 61 74 65 73 20 74  rror indicates t
cb20: 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
cb30: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
cb40: 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  che .** cannot b
cb50: 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20  e trusted. This 
cb60: 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65  state can be cle
cb70: 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65  ared by complete
cb80: 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a  ly discarding .*
cb90: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * the contents o
cba0: 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
cbb0: 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  e. If a transact
cbc0: 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77  ion was active w
cbd0: 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69  hen.** the persi
cbe0: 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75  stent error occu
cbf0: 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72  rred, then the r
cc00: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
cc10: 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62  may need.** to b
cc20: 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65  e replayed to re
cc30: 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  store the conten
cc40: 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ts of the databa
cc50: 73 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a  se file (as if.*
cc60: 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d  * it were a hot-
cc70: 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61  journal)..*/.sta
cc80: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72  tic int pager_er
cc90: 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ror(Pager *pPage
cca0: 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e  r, int rc){.  in
ccb0: 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66  t rc2 = rc & 0xf
ccc0: 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  f;.  assert( rc=
ccd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d  =SQLITE_OK || !M
cce0: 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
ccf0: 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  (.       pPager-
cd00: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
cd10: 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20  _FULL ||.       
cd20: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
cd30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20  =SQLITE_OK ||.  
cd40: 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72       (pPager->er
cd50: 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53  rCode & 0xff)==S
cd60: 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b  QLITE_IOERR.  );
cd70: 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49  .  if( rc2==SQLI
cd80: 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d  TE_FULL || rc2==
cd90: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
cda0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
cdb0: 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20  ode = rc;.  }.  
cdc0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
cdd0: 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f  .** Execute a ro
cde0: 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e  llback if a tran
cdf0: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
ce00: 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  e and unlock the
ce10: 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69   .** database fi
ce20: 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  le. .**.** If th
ce30: 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65  e pager has alre
ce40: 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
ce50: 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20  error state, do 
ce60: 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  not attempt .** 
ce70: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20  the rollback at 
ce80: 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65  this time. Inste
ce90: 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  ad, pager_unlock
cea0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68  () is called. Th
ceb0: 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67  e.** call to pag
cec0: 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c  er_unlock() will
ced0: 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d   discard all in-
cee0: 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e  memory pages, un
cef0: 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61  lock.** the data
cf00: 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 63 6c  base file and cl
cf10: 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ear the error st
cf20: 61 74 65 2e 20 49 66 20 74 68 69 73 20 6d 65 61  ate. If this mea
cf30: 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 72 65  ns that.** there
cf40: 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   is a hot-journa
cf50: 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  l left in the fi
cf60: 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e  le-system, the n
cf70: 65 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ext connection.*
cf80: 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68  * to obtain a sh
cf90: 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
cfa0: 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d 61   pager (which ma
cfb0: 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20 77  y be this one) w
cfc0: 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74 20 62  ill.** roll it b
cfd0: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
cfe0: 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20  e pager has not 
cff0: 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20  already entered 
d000: 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
d010: 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a   but an IO or.**
d020: 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63   malloc error oc
d030: 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f  curs during a ro
d040: 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69  llback, then thi
d050: 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61  s will itself ca
d060: 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65  use .** the page
d070: 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65  r to enter the e
d080: 72 72 6f 72 20 73 74 61 74 65 2e 20 57 68 69 63  rror state. Whic
d090: 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65  h will be cleare
d0a0: 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  d by the.** call
d0b0: 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
d0c0: 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65 64  (), as described
d0d0: 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69   above..*/.stati
d0e0: 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
d0f0: 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61  ckAndRollback(Pa
d100: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
d110: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
d120: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  ode==SQLITE_OK &
d130: 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  & pPager->state>
d140: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
d150: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
d160: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
d170: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
d180: 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
d190: 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
d1a0: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
d1b0: 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75  );.  }.  pager_u
d1c0: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d  nlock(pPager);.}
d1d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
d1e0: 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e  tine ends a tran
d1f0: 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73  saction. A trans
d200: 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c  action is usuall
d210: 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65  y ended by .** e
d220: 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f  ither a COMMIT o
d230: 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65  r a ROLLBACK ope
d240: 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75  ration. This rou
d250: 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c 6c  tine may be call
d260: 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c  ed .** after rol
d270: 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a  lback of a hot-j
d280: 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e  ournal, or if an
d290: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
d2a0: 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74  ile opening.** t
d2b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d2c0: 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 76  or writing the v
d2d0: 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  ery first journa
d2e0: 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a  l-header of a.**
d2f0: 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
d300: 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49 66  ction..** .** If
d310: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
d320: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6f 72   PAGER_SHARED or
d330: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74   PAGER_UNLOCK st
d340: 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a  ate when this.**
d350: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
d360: 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
d370: 70 20 28 72 65 74 75 72 6e 73 20 53 51 4c 49 54  p (returns SQLIT
d380: 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  E_OK)..**.** Oth
d390: 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69  erwise, any acti
d3a0: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  ve savepoints ar
d3b0: 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  e released..**.*
d3c0: 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
d3d0: 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74   file is open, t
d3e0: 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c  hen it is "final
d3f0: 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f  ized". Once a jo
d400: 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68  urnal .** file h
d410: 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  as been finalize
d420: 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  d it is not poss
d430: 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74  ible to use it t
d440: 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a  o roll back a .*
d450: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e  * transaction. N
d460: 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f  or will it be co
d470: 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61  nsidered to be a
d480: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20   hot-journal by 
d490: 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f  this.** or any o
d4a0: 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
d4b0: 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c  nnection. Exactl
d4c0: 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20  y how a journal 
d4d0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20  is finalized.** 
d4e0: 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68  depends on wheth
d4f0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61  er or not the pa
d500: 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
d510: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
d520: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72   and.** the curr
d530: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  ent journal-mode
d540: 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d   (Pager.journalM
d550: 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66  ode value), as f
d560: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
d570: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d  journalMode==MEM
d580: 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ORY.**     Journ
d590: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
d5a0: 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f  or is simply clo
d5b0: 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f  sed. This destro
d5c0: 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e  ys an .**     in
d5d0: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
d5e0: 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
d5f0: 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a  Mode==TRUNCATE.*
d600: 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
d610: 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
d620: 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
d630: 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   size..**.**   j
d640: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53  ournalMode==PERS
d650: 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66  IST.**     The f
d660: 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66  irst 28 bytes of
d670: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d680: 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68  e are zeroed. Th
d690: 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a  is invalidates.*
d6a0: 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20  *     the first 
d6b0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
d6c0: 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  n the file, and 
d6d0: 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65  hence the entire
d6e0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
d6f0: 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64  file. An invalid
d700: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
d710: 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  nnot be rolled b
d720: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ack..**.**   jou
d730: 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45  rnalMode==DELETE
d740: 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72  .**     The jour
d750: 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  nal file is clos
d760: 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75  ed and deleted u
d770: 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65  sing sqlite3OsDe
d780: 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  lete()..**.**   
d790: 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69    If the pager i
d7a0: 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
d7b0: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69  lusive mode, thi
d7c0: 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61  s method of fina
d7d0: 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68  lizing.**     th
d7e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
d7f0: 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e  s never used. In
d800: 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f  stead, if the jo
d810: 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20  urnalMode is.** 
d820: 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74      DELETE and t
d830: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
d840: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
d850: 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69  he method descri
d860: 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20  bed under.**    
d870: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
d880: 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e  RSIST is used in
d890: 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74  stead..**.** Aft
d8a0: 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  er the journal i
d8b0: 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 69 66 20  s finalized, if 
d8c0: 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65  running in non-e
d8d0: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
d8e0: 68 65 0a 2a 2a 20 70 61 67 65 72 20 6d 6f 76 65  he.** pager move
d8f0: 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  s to PAGER_SHARE
d900: 44 20 73 74 61 74 65 20 28 61 6e 64 20 64 6f 77  D state (and dow
d910: 6e 67 72 61 64 65 73 20 74 68 65 20 6c 6f 63 6b  ngrades the lock
d920: 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
d930: 61 73 65 20 66 69 6c 65 20 61 63 63 6f 72 64 69  ase file accordi
d940: 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ngly)..**.** If 
d950: 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
d960: 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
d970: 65 20 6d 6f 64 65 20 61 6e 64 20 69 73 20 69 6e  e mode and is in
d980: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 73 74   PAGER_SYNCED st
d990: 61 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76 65 73  ate,.** it moves
d9a0: 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53   to PAGER_EXCLUS
d9b0: 49 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20 61 72  IVE. No locks ar
d9c0: 65 20 64 6f 77 6e 67 72 61 64 65 64 20 77 68 65  e downgraded whe
d9d0: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a 2a 20  n running in.** 
d9e0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
d9f0: 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
da00: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
da10: 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  o error occurs. 
da20: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
da30: 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79  rs during.** any
da40: 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61   of the IO opera
da50: 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a  tions to finaliz
da60: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
da70: 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65  le or unlock the
da80: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68 65  .** database the
da90: 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
daa0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
dab0: 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66 20  to the user. If 
dac0: 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  the .** operatio
dad0: 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  n to finalize th
dae0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
daf0: 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ails, then the c
db00: 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69  ode still.** tri
db10: 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65  es to unlock the
db20: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
db30: 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  f not in exclusi
db40: 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a  ve mode. If the.
db50: 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74  ** unlock operat
db60: 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c  ion fails as wel
db70: 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  l, then the firs
db80: 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c  t error code rel
db90: 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66  ated.** to the f
dba0: 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75  irst error encou
dbb0: 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72  ntered (the jour
dbc0: 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e  nal finalization
dbd0: 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75   one) is.** retu
dbe0: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
dbf0: 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  int pager_end_tr
dc00: 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
dc10: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73  *pPager, int has
dc20: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
dc30: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
dc40: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
dc50: 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66  e from journal f
dc60: 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72  inalization oper
dc70: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ation */.  int r
dc80: 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  c2 = SQLITE_OK; 
dc90: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
dca0: 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75  e from db file u
dcb0: 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
dcc0: 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  */..  if( pPager
dcd0: 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
dce0: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
dcf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
dd00: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c    }.  releaseAll
dd10: 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65  Savepoints(pPage
dd20: 72 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  r);..  assert( i
dd30: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
dd40: 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49  d) || pPager->pI
dd50: 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
dd60: 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
dd70: 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
dd80: 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
dd90: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
dda0: 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65  .    /* Finalize
ddb0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
ddc0: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  e. */.    if( sq
ddd0: 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61  lite3IsMemJourna
dde0: 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  l(pPager->jfd) )
ddf0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
de00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
de10: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
de20: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b  ALMODE_MEMORY );
de30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
de40: 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
de50: 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  d);.    }else if
de60: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
de70: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
de80: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
de90: 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E ){.      if( p
dea0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
deb0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
dec0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
ded0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
dee0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
def0: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
df00: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
df10: 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
df20: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
df30: 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
df40: 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
df50: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
df60: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
df70: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
df80: 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
df90: 54 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  T.      || (pPag
dfa0: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
dfb0: 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e && pPager->jou
dfc0: 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
dfd0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29  JOURNALMODE_WAL)
dfe0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
dff0: 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64   = zeroJournalHd
e000: 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73  r(pPager, hasMas
e010: 74 65 72 29 3b 0a 20 20 20 20 20 20 70 61 67 65  ter);.      page
e020: 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
e030: 72 63 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  rc);.      pPage
e040: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
e050: 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
e060: 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
e070: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
e080: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
e090: 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65 63  anch may be exec
e0a0: 75 74 65 64 20 77 69 74 68 20 50 61 67 65 72 2e  uted with Pager.
e0b0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d  journalMode==MEM
e0c0: 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ORY if.      ** 
e0d0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61  a hot-journal wa
e0e0: 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61  s just rolled ba
e0f0: 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ck. In this case
e100: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
e110: 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c     ** file shoul
e120: 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20  d be closed and 
e130: 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73  deleted. If this
e140: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74   connection writ
e150: 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  es to.      ** t
e160: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
e170: 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20  , it will do so 
e180: 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f  using an in-memo
e190: 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  ry journal. .   
e1a0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
e1b0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
e1c0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
e1d0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
e1e0: 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  E .           ||
e1f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e200: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
e210: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
e220: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
e230: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
e240: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
e250: 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
e260: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e270: 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
e280: 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  jfd);.      if( 
e290: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
e2a0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
e2b0: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
e2c0: 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
e2d0: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
e2e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
e2f0: 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
e300: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
e310: 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
e320: 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
e330: 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
e340: 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
e350: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
e360: 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
e370: 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
e380: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67  Journal);.  pPag
e390: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
e3a0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52   0;.  pPager->nR
e3b0: 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ec = 0;.  sqlite
e3c0: 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28  3PcacheCleanAll(
e3d0: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
e3e0: 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  ;..  if( pagerUs
e3f0: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
e400: 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
e410: 33 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e  3WalEndWriteTran
e420: 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
e430: 70 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72  pWal);.    asser
e440: 74 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  t( rc2==SQLITE_O
e450: 4b 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  K );.    pPager-
e460: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
e470: 48 41 52 45 44 3b 0a 0a 20 20 20 20 2f 2a 20 49  HARED;..    /* I
e480: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
e490: 20 77 61 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f   was in locking_
e4a0: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d  mode=exclusive m
e4b0: 6f 64 65 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f  ode but is no lo
e4c0: 6e 67 65 72 2c 0a 20 20 20 20 2a 2a 20 64 72 6f  nger,.    ** dro
e4d0: 70 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  p the EXCLUSIVE 
e4e0: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
e4f0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
e500: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
e510: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
e520: 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33  eMode && sqlite3
e530: 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
e540: 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30  (pPager->pWal, 0
e550: 29 20 29 7b 0a 20 20 20 20 20 20 72 63 32 20 3d  ) ){.      rc2 =
e560: 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72   osUnlock(pPager
e570: 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
e580: 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  K);.    }.  }els
e590: 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65  e if( !pPager->e
e5a0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
e5b0: 20 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c 6f      rc2 = osUnlo
e5c0: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
e5d0: 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
e5e0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
e5f0: 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
e600: 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
e610: 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
e620: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
e630: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
e640: 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20 70  _SYNCED ){.    p
e650: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
e660: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
e670: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65    }.  pPager->se
e680: 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70  tMaster = 0;.  p
e690: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
e6a0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  = 0;.  pPager->d
e6b0: 62 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b 0a 0a  bModified = 0;..
e6c0: 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 74 68    /* TODO: Is th
e6d0: 69 73 20 6f 70 74 69 6d 61 6c 3f 20 57 68 79 20  is optimal? Why 
e6e0: 69 73 20 74 68 65 20 64 62 20 73 69 7a 65 20 69  is the db size i
e6f0: 6e 76 61 6c 69 64 61 74 65 64 20 68 65 72 65 20  nvalidated here 
e700: 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 64  .  ** when the d
e710: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
e720: 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64 3f 20 2a 2f  not unlocked? */
e730: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  .  pPager->dbOri
e740: 67 53 69 7a 65 20 3d 20 30 3b 0a 20 20 73 71 6c  gSize = 0;.  sql
e750: 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63 61  ite3PcacheTrunca
e760: 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  te(pPager->pPCac
e770: 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  he, pPager->dbSi
e780: 7a 65 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44  ze);.  if( !MEMD
e790: 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
e7a0: 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30  >dbSizeValid = 0
e7b0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
e7c0: 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72  (rc==SQLITE_OK?r
e7d0: 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  c2:rc);.}../*.**
e7e0: 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74 61   Parameter aData
e7f0: 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
e800: 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67 65   buffer of pPage
e810: 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
e820: 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f  s.** of data. Co
e830: 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e  mpute and return
e840: 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65   a checksum base
e850: 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e  d ont the conten
e860: 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61  ts of the .** pa
e870: 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74  ge of data and t
e880: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
e890: 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75   of pPager->cksu
e8a0: 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  mInit..**.** Thi
e8b0: 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20  s is not a real 
e8c0: 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20  checksum. It is 
e8d0: 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
e8e0: 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
e8f0: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
e900: 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73  lue (pPager->cks
e910: 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72  umInit) and ever
e920: 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20  y 200th byte.** 
e930: 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61  of the page data
e940: 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  , starting with 
e950: 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50 61  byte offset (pPa
e960: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30  ger->pageSize%20
e970: 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65  0)..** Each byte
e980: 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
e990: 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69  as an 8-bit unsi
e9a0: 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  gned integer..**
e9b0: 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65  .** Changing the
e9c0: 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f   formula used to
e9d0: 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68   compute this ch
e9e0: 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69  ecksum results i
e9f0: 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74  n an.** incompat
ea00: 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ible journal fil
ea10: 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  e format..**.** 
ea20: 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75  If journal corru
ea30: 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65  ption occurs due
ea40: 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c   to a power fail
ea50: 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69  ure, the most li
ea60: 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69  kely .** scenari
ea70: 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e  o is that one en
ea80: 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  d or the other o
ea90: 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c  f the record wil
eaa0: 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a  l be changed. .*
eab0: 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73  * It is much les
eac0: 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68  s likely that th
ead0: 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68  e two ends of th
eae0: 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
eaf0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72   will be.** corr
eb00: 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64  ect and the midd
eb10: 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20  le be corrupt.  
eb20: 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63  Thus, this "chec
eb30: 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a  ksum" scheme,.**
eb40: 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64   though fast and
eb50: 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73   simple, catches
eb60: 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65   the mostly like
eb70: 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75  ly kind of corru
eb80: 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
eb90: 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d   u32 pager_cksum
eba0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
ebb0: 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29  const u8 *aData)
ebc0: 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  {.  u32 cksum = 
ebd0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
ebe0: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68  t;         /* Ch
ebf0: 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20  ecksum value to 
ec00: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
ec10: 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  i = pPager->page
ec20: 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20  Size-200;       
ec30: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
ec40: 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69  er */.  while( i
ec50: 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  >0 ){.    cksum 
ec60: 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20  += aData[i];.   
ec70: 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20   i -= 200;.  }. 
ec80: 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d   return cksum;.}
ec90: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73  ../*.** Read a s
eca0: 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20  ingle page from 
ecb0: 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e  either the journ
ecc0: 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d 61  al file (if isMa
ecd0: 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a  inJrnl==1) or.**
ece0: 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
ecf0: 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69 6e  urnal (if isMain
ed00: 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61  Jrnl==0) and pla
ed10: 79 62 61 63 6b 20 74 68 61 74 20 70 61 67 65 2e  yback that page.
ed20: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65 67  .** The page beg
ed30: 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a 70  ins at offset *p
ed40: 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20  Offset into the 
ed50: 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66 73  file. The *pOffs
ed60: 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 69  et.** value is i
ed70: 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20  ncreased to the 
ed80: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78  start of the nex
ed90: 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f  t page in the jo
eda0: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urnal..**.** The
edb0: 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 66 6c 61 67   isMainJrnl flag
edc0: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 69 73   is true if this
edd0: 20 69 73 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c   is the main rol
ede0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
edf0: 64 0a 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 74  d.** false for t
ee00: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
ee10: 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 69 6e 20  rnal.  The main 
ee20: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
ee30: 20 75 73 65 73 0a 2a 2a 20 63 68 65 63 6b 73 75   uses.** checksu
ee40: 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65  ms - the stateme
ee50: 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  nt journal does 
ee60: 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  not..**.** If th
ee70: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
ee80: 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64   the page record
ee90: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
eea0: 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
eeb0: 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  e.** is greater 
eec0: 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
eed0: 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
eee0: 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61  dbSize, then pla
eef0: 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70  yback is.** skip
ef00: 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ped and SQLITE_O
ef10: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
ef20: 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73  *.** If pDone is
ef30: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
ef40: 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f  it is a record o
ef50: 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  f pages that hav
ef60: 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  e already.** bee
ef70: 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20  n played back.  
ef80: 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20 2a  If the page at *
ef90: 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72 65  pOffset has alre
efa0: 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
efb0: 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20  back.** (if the 
efc0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44  corresponding pD
efd0: 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29 20  one bit is set) 
efe0: 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c  then skip the pl
eff0: 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20  ayback..** Make 
f000: 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62  sure the pDone b
f010: 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
f020: 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74   to the *pOffset
f030: 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20   page is set.** 
f040: 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69  prior to returni
f050: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ng..**.** If the
f060: 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73 20   page record is 
f070: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61  successfully rea
f080: 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
f090: 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
f0a0: 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b   and played back
f0b0: 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
f0c0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
f0d0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
f0e0: 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61  urs.** while rea
f0f0: 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20  ding the record 
f100: 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
f110: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
f120: 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20  hile writing.** 
f130: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
f140: 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49  file, then the I
f150: 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
f160: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74  returned. If dat
f170: 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66  a.** is successf
f180: 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74  ully read from t
f190: 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
f1a0: 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61 72   file but appear
f1b0: 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75  s to be.** corru
f1c0: 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  pted, SQLITE_DON
f1d0: 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44  E is returned. D
f1e0: 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ata is considere
f1f0: 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a  d corrupted in.*
f200: 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e  * two circumstan
f210: 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20  ces:.** .**   * 
f220: 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70 61  If the record pa
f230: 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c  ge-number is ill
f240: 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52  egal (0 or PAGER
f250: 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a  _MJ_PGNO), or.**
f260: 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f     * If the reco
f270: 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  rd is being roll
f280: 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
f290: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
f2a0: 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68  le.**     and th
f2b0: 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64  e checksum field
f2c0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
f2d0: 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65  the record conte
f2e0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65  nt..**.** Neithe
f2f0: 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73  r of these two s
f300: 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73  cenarios are pos
f310: 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73  sible during a s
f320: 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
f330: 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  k..**.** If this
f340: 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
f350: 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d  rollback, then m
f360: 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74  emory may have t
f370: 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
f380: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
f390: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
f3a0: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
f3b0: 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63  ase and an alloc
f3c0: 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20  ation fails,.** 
f3d0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
f3e0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
f3f0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
f400: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
f410: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
f420: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f430: 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62 65   /* The pager be
f440: 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ing played back 
f450: 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65  */.  i64 *pOffse
f460: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
f470: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
f480: 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61  record to playba
f490: 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ck */.  Bitvec *
f4a0: 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20  pDone,          
f4b0: 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
f4c0: 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79  of pages already
f4d0: 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a   played back */.
f4e0: 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c    int isMainJrnl
f4f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f500: 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75  /* 1 -> main jou
f510: 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a  rnal. 0 -> sub-j
f520: 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74  ournal. */.  int
f530: 20 69 73 53 61 76 65 70 6e 74 20 20 20 20 20 20   isSavepnt      
f540: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
f550: 75 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69  ue for a savepoi
f560: 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29  nt rollback */.)
f570: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
f580: 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20  Hdr *pPg;       
f590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
f5a0: 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
f5b0: 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  in the cache */.
f5c0: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
f5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5e0: 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
f5f0: 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  er of a page in 
f600: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
f610: 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
f620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
f630: 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20  ecksum used for 
f640: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
f650: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61  */.  char *aData
f660: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f670: 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
f680: 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20  storage for the 
f690: 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  page */.  sqlite
f6a0: 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20  3_file *jfd;    
f6b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
f6c0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
f6d0: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  or the journal f
f6e0: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  ile */.  int isS
f6f0: 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20 20  ynced;          
f700: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
f710: 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69  f journal page i
f720: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61  s synced */..  a
f730: 73 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72  ssert( (isMainJr
f740: 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20  nl&~1)==0 );    
f750: 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20    /* isMainJrnl 
f760: 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61  is 0 or 1 */.  a
f770: 73 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e  ssert( (isSavepn
f780: 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  t&~1)==0 );     
f790: 20 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69    /* isSavepnt i
f7a0: 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
f7b0: 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c  sert( isMainJrnl
f7c0: 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20   || pDone );    
f7d0: 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73   /* pDone always
f7e0: 20 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75   used on sub-jou
f7f0: 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72  rnals */.  asser
f800: 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20  t( isSavepnt || 
f810: 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a  pDone==0 );   /*
f820: 20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65   pDone never use
f830: 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69  d on non-savepoi
f840: 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d  nt */..  aData =
f850: 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
f860: 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44  ce;.  assert( aD
f870: 61 74 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f  ata );         /
f880: 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d  * Temp storage m
f890: 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
f8a0: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
f8b0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  */.  assert( pag
f8c0: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
f8d0: 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a  ==0 || (!isMainJ
f8e0: 72 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74  rnl && isSavepnt
f8f0: 29 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  ) );..  /* Read 
f900: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
f910: 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66 72  and page data fr
f920: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f  om the journal o
f930: 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20  r sub-journal.  
f940: 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20  ** file. Return 
f950: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  an error code to
f960: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61   the caller if a
f970: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
f980: 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20  s..  */.  jfd = 
f990: 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61  isMainJrnl ? pPa
f9a0: 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65  ger->jfd : pPage
f9b0: 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20  r->sjfd;.  rc = 
f9c0: 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
f9d0: 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29  *pOffset, &pgno)
f9e0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
f9f0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
fa00: 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
fa10: 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38  3OsRead(jfd, (u8
fa20: 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  *)aData, pPager-
fa30: 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66  >pageSize, (*pOf
fa40: 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20  fset)+4);.  if( 
fa50: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
fa60: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f  return rc;.  *pO
fa70: 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d  ffset += pPager-
fa80: 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20  >pageSize + 4 + 
fa90: 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20  isMainJrnl*4;.. 
faa0: 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
fab0: 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  ing on the page.
fac0: 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69    This is more i
fad0: 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20  mportant that I 
fae0: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
faf0: 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70  thought.  If a p
fb00: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
fb10: 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  urs while the jo
fb20: 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77  urnal is being w
fb30: 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20  ritten,.  ** it 
fb40: 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61  could cause inva
fb50: 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77  lid data to be w
fb60: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
fb70: 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65  journal.  We nee
fb80: 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74  d to.  ** detect
fb90: 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61   this invalid da
fba0: 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72  ta (with high pr
fbb0: 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69  obability) and i
fbc0: 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  gnore it..  */. 
fbd0: 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20   if( pgno==0 || 
fbe0: 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
fbf0: 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
fc00: 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53 61     assert( !isSa
fc10: 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74  vepnt );.    ret
fc20: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
fc30: 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e  .  }.  if( pgno>
fc40: 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62  (Pgno)pPager->db
fc50: 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42  Size || sqlite3B
fc60: 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c  itvecTest(pDone,
fc70: 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65   pgno) ){.    re
fc80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
fc90: 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e    }.  if( isMain
fca0: 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d  Jrnl ){.    rc =
fcb0: 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
fcc0: 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26   (*pOffset)-4, &
fcd0: 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  cksum);.    if( 
fce0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
fcf0: 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65 70      if( !isSavep
fd00: 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75  nt && pager_cksu
fd10: 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61  m(pPager, (u8*)a
fd20: 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a  Data)!=cksum ){.
fd30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
fd40: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
fd50: 20 20 7d 0a 0a 20 20 69 66 28 20 70 44 6f 6e 65    }..  if( pDone
fd60: 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65   && (rc = sqlite
fd70: 33 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65  3BitvecSet(pDone
fd80: 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45  , pgno))!=SQLITE
fd90: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
fda0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  n rc;.  }..  ass
fdb0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
fdc0: 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
fdd0: 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  ED || pPager->st
fde0: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
fdf0: 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  SIVE );..  /* If
fe00: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
fe10: 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
fe20: 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
fe30: 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68   be a copy of th
fe40: 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20  is.  ** page in 
fe50: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
fe60: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75   In this case ju
fe70: 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61  st update the pa
fe80: 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20  ger cache,.  ** 
fe90: 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65  not the database
fea0: 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
feb0: 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64  is left marked d
fec0: 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73  irty in this cas
fed0: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  e..  **.  ** An 
fee0: 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65  exception to the
fef0: 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20   above rule: If 
ff00: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
ff10: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a  in no-sync mode.
ff20: 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20    ** and a page 
ff30: 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20  is moved during 
ff40: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
ff50: 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70  acuum then the p
ff60: 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74  age may.  ** not
ff70: 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65 72   be in the pager
ff80: 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69   cache. Later: i
ff90: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20  f a malloc() or 
ffa0: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
ffb0: 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f    ** during a Mo
ffc0: 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74  vepage() call, t
ffd0: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
ffe0: 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63   not be in the c
fff0: 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72  ache.  ** either
10000 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69  . So the conditi
10010 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  on described in 
10020 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67 72  the above paragr
10030 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  aph is not.  ** 
10040 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20  assert()able..  
10050 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58  **.  ** If in EX
10060 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74  CLUSIVE state, t
10070 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68  hen we update th
10080 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66  e pager cache if
10090 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20   it exists.  ** 
100a0 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  and the main fil
100b0 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74  e. The page is t
100c0 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64  hen marked not d
100d0 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  irty..  **.  ** 
100e0 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54  Ticket #1171:  T
100f0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
10100 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
10110 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  in page content 
10120 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66  that is.  ** dif
10130 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
10140 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20  page content at 
10150 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
10160 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
10170 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77  ** This occurs w
10180 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68  hen a page is ch
10190 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74  anged prior to t
101a0 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74  he start of a st
101b0 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65  atement.  ** the
101c0 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20  n changed again 
101d0 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
101e0 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c  ment.  When roll
101f0 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a  ing back such a.
10200 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77    ** statement w
10210 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65  e must not write
10220 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
10230 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73   database unless
10240 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f   we know.  ** fo
10250 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f  r certain that o
10260 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
10270 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64  tents are synced
10280 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72   into the main r
10290 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
102a0 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  rnal.  Otherwise
102b0 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d  , a power loss m
102c0 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66  ight leave modif
102d0 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a  ied data in the.
102e0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
102f0 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e  le without an en
10300 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  try in the rollb
10310 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ack journal that
10320 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72   can.  ** restor
10330 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
10340 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66  o its original f
10350 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74  orm.  Two condit
10360 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a  ions must be.  *
10370 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69  * met before wri
10380 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
10390 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20  base files. (1) 
103a0 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
103b0 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64  t be.  ** locked
103c0 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74  .  (2) we know t
103d0 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
103e0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
103f0 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20   fully synced.  
10400 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ** in the main j
10410 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65  ournal either be
10420 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69  cause the page i
10430 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
10440 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20  r else.  ** the 
10450 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
10460 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20  s needSync==0.. 
10470 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34   **.  ** 2008-04
10480 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d  -14:  When attem
10490 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20  pting to vacuum 
104a0 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
104b0 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a  se file, it.  **
104c0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
104d0 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74  fail a statement
104e0 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74   on a database t
104f0 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74  hat does not yet
10500 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20   exist..  ** Do 
10510 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77  not attempt to w
10520 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65  rite if database
10530 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20   file has never 
10540 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a  been opened..  *
10550 2f 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  /.  if( pagerUse
10560 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
10570 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65     pPg = 0;.  }e
10580 6c 73 65 7b 0a 20 20 20 20 70 50 67 20 3d 20 70  lse{.    pPg = p
10590 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
105a0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  er, pgno);.  }. 
105b0 20 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20   assert( pPg || 
105c0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 50 41 47 45  !MEMDB );.  PAGE
105d0 52 54 52 41 43 45 28 28 22 50 4c 41 59 42 41 43  RTRACE(("PLAYBAC
105e0 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  K %d page %d has
105f0 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20  h(%08x) %s\n",. 
10600 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
10610 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c  D(pPager), pgno,
10620 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
10630 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
10640 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20  , (u8*)aData),. 
10650 20 20 20 20 20 20 20 20 20 20 28 69 73 4d 61 69            (isMai
10660 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72  nJrnl?"main-jour
10670 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61  nal":"sub-journa
10680 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20  l").  ));.  if( 
10690 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20  isMainJrnl ){.  
106a0 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61    isSynced = pPa
106b0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28  ger->noSync || (
106c0 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67  *pOffset <= pPag
106d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b  er->journalHdr);
106e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73  .  }else{.    is
106f0 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30  Synced = (pPg==0
10700 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61   || 0==(pPg->fla
10710 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f  gs & PGHDR_NEED_
10720 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66  SYNC));.  }.  if
10730 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  ( (pPager->state
10740 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
10750 45 29 0a 20 20 20 26 26 20 69 73 4f 70 65 6e 28  E).   && isOpen(
10760 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20 26  pPager->fd).   &
10770 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a  & isSynced.  ){.
10780 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28      i64 ofst = (
10790 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
107a0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
107b0 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73     testcase( !is
107c0 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d  Savepnt && pPg!=
107d0 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73  0 && (pPg->flags
107e0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
107f0 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=0 );.    asse
10800 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
10810 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
10820 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
10830 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
10840 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67  (u8*)aData, pPag
10850 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
10860 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  st);.    if( pgn
10870 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
10880 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Size ){.      pP
10890 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
108a0 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20   = pgno;.    }. 
108b0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
108c0 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20  Backup ){.      
108d0 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61  CODEC1(pPager, a
108e0 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
108f0 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  c=SQLITE_NOMEM);
10900 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
10910 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
10920 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
10930 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20  , (u8*)aData);. 
10940 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
10950 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c  er, aData, pgno,
10960 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   7, rc=SQLITE_NO
10970 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20  MEM, aData);.   
10980 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
10990 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50  isMainJrnl && pP
109a0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  g==0 ){.    /* I
109b0 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c  f this is a roll
109c0 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f  back of a savepo
109d0 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73  int and data was
109e0 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a   not written to.
109f0 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
10a00 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  ase and the page
10a10 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72   is not in-memor
10a20 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f  y, there is a po
10a30 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70  tential.    ** p
10a40 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65  roblem. When the
10a50 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65   page is next fe
10a60 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74  tched by the b-t
10a70 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20  ree layer, it . 
10a80 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
10a90 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
10aa0 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68  base file, which
10ab0 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
10ac0 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  be .    ** curre
10ad0 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nt. .    **.    
10ae0 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63  ** There are a c
10af0 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65  ouple of differe
10b00 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e  nt ways this can
10b10 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65   happen. All are
10b20 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62   quite.    ** ob
10b30 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e  scure. When runn
10b40 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f  ing in synchrono
10b50 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61  us mode, this ca
10b60 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20  n only happen . 
10b70 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67     ** if the pag
10b80 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65  e is on the free
10b90 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61  -list at the sta
10ba0 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
10bb0 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ction, then.    
10bc0 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68  ** populated, th
10bd0 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73  en moved using s
10be0 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
10bf0 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  age()..    **.  
10c00 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f    ** The solutio
10c10 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69  n is to add an i
10c20 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f  n-memory page to
10c30 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
10c40 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ining.    ** the
10c50 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20   data just read 
10c60 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
10c70 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70  rnal. Mark the p
10c80 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20  age as dirty .  
10c90 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20    ** and if the 
10ca0 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61  pager requires a
10cb0 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74   journal-sync, t
10cc0 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  hen mark the pag
10cd0 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71  e as .    ** req
10ce0 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  uiring a journal
10cf0 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20  -sync before it 
10d00 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  is written..    
10d10 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
10d20 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20  sSavepnt );.    
10d30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
10d40 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30 20 29 3b  doNotSpill==0 );
10d50 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
10d60 6f 74 53 70 69 6c 6c 2b 2b 3b 0a 20 20 20 20 72  otSpill++;.    r
10d70 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
10d80 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20  Acquire(pPager, 
10d90 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a  pgno, &pPg, 1);.
10da0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
10db0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d  er->doNotSpill==
10dc0 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 );.    pPager-
10dd0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20  >doNotSpill--;. 
10de0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10df0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
10e00 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73  ;.    pPg->flags
10e10 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f   &= ~PGHDR_NEED_
10e20 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65  READ;.    sqlite
10e30 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
10e40 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28  (pPg);.  }.  if(
10e50 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e   pPg ){.    /* N
10e60 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76  o page should ev
10e70 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79  er be explicitly
10e80 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
10e90 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
10ea0 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70  ept.    ** for p
10eb0 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68  age 1 which is h
10ec0 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
10ed0 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
10ee0 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
10ef0 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69  ** database acti
10f00 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68  ve. However such
10f10 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72   a page may be r
10f20 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
10f30 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66  result.    ** of
10f40 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72   an internal err
10f50 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  or resulting in 
10f60 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c  an automatic cal
10f70 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
10f80 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
10f90 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76  ()..    */.    v
10fa0 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
10fb0 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
10fc0 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  ta;.    memcpy(p
10fd0 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61  Data, (u8*)aData
10fe0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
10ff0 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ze);.    pPager-
11000 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b  >xReiniter(pPg);
11010 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a  .    if( isMainJ
11020 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70  rnl && (!isSavep
11030 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d  nt || *pOffset<=
11040 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
11050 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  dr) ){.      /* 
11060 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  If the contents 
11070 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72  of this page wer
11080 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20  e just restored 
11090 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20  from the main . 
110a0 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
110b0 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63  file, then its c
110c0 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61  ontent must be a
110d0 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e  s they were when
110e0 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74   the .      ** t
110f0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66  ransaction was f
11100 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20  irst opened. In 
11110 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e  this case we can
11120 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20   mark the page. 
11130 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e       ** as clean
11140 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69  , since there wi
11150 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f  ll be no need to
11160 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f   write it out to
11170 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
11180 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a  tabase..      **
11190 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
111a0 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e  is one exception
111b0 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49   to this rule. I
111c0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  f the page is be
111d0 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20  ing rolled.     
111e0 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74   ** back as part
111f0 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
11200 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72  (or statement) r
11210 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20  ollback from an 
11220 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63  .      ** unsync
11230 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ed portion of th
11240 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
11250 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ile, then it is 
11260 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a  not safe.      *
11270 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61  * to mark the pa
11280 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69  ge as clean. Thi
11290 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72  s is because mar
112a0 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73  king the page as
112b0 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20  .      ** clean 
112c0 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50  will clear the P
112d0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
112e0 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70  lag. Since the p
112f0 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  age is.      ** 
11300 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a  already in the j
11310 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63  ournal file (rec
11320 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70  orded in Pager.p
11330 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20  InJournal) and. 
11340 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
11350 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
11360 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20   is cleared, if 
11370 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
11380 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ten to.      ** 
11390 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69  again within thi
113a0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  s transaction, i
113b0 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64  t will be marked
113c0 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20   as dirty but.  
113d0 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
113e0 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
113f0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e  will not be set.
11400 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70   It could then p
11410 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20  otentially.     
11420 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f   ** be written o
11430 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ut into the data
11440 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
11450 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
11460 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65  e.      ** segme
11470 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66  nt is synced. If
11480 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20   a crash occurs 
11490 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77  during or follow
114a0 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20  ing this,.      
114b0 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  ** database corr
114c0 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65  uption may ensue
114d0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
114e0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
114f0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
11500 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
11510 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
11520 67 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  g);.    }.#ifdef
11530 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
11540 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
11550 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
11560 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
11570 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  dif.    /* If th
11580 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74  is was page 1, t
11590 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20  hen restore the 
115a0 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
115b0 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a  bFileVers..    *
115c0 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65  * Do this before
115d0 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a   any decoding. *
115e0 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d  /.    if( pgno==
115f0 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  1 ){.      memcp
11600 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
11610 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44  eVers, &((u8*)pD
11620 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28  ata)[24],sizeof(
11630 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
11640 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rs));.    }..   
11650 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70   /* Decode the p
11660 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72  age just read fr
11670 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43  om disk */.    C
11680 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44  ODEC1(pPager, pD
11690 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
116a0 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  3, rc=SQLITE_NOM
116b0 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EM);.    sqlite3
116c0 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
116d0 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
116e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
116f0 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
11700 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
11710 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11720 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
11730 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
11740 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
11750 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
11760 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
11770 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
11780 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
11790 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
117a0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
117b0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
117c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
117d0 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
117e0 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72   it is..**.** Ar
117f0 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d  gument zMaster m
11800 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65  ay point to Page
11810 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20  r.pTmpSpace. So 
11820 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e  that buffer is n
11830 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ot .** available
11840 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20   for use within 
11850 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
11860 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74  *.** When a mast
11870 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
11880 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69  is created, it i
11890 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
118a0 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f   the names .** o
118b0 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  f all of its chi
118c0 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65  ld journals, one
118d0 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20   after another, 
118e0 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66  formatted as utf
118f0 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74  -8 .** encoded t
11900 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20  ext. The end of 
11910 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
11920 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65  al file is marke
11930 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c  d with a .** nul
11940 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
11950 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68   (0x00). i.e. th
11960 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
11970 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  s of a master jo
11980 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f  urnal.** file fo
11990 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
119a0 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61  involving two da
119b0 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65  tabases might be
119c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65  :.**.**   "/home
119d0 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e  /bill/a.db-journ
119e0 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c  al\x00/home/bill
119f0 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30  /b.db-journal\x0
11a00 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65  0".**.** A maste
11a10 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  r journal file m
11a20 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74  ay only be delet
11a30 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69  ed once all of i
11a40 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75  ts child .** jou
11a50 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20  rnals have been 
11a60 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
11a70 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11a80 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65   reads the conte
11a90 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  nts of the maste
11aa0 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r-journal file i
11ab0 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  nto .** memory a
11ac0 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  nd loops through
11ad0 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69   each of the chi
11ae0 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73  ld journal names
11af0 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68  . For.** each ch
11b00 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ild journal, it 
11b10 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a  checks if:.**.**
11b20 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c     * if the chil
11b30 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  d journal exists
11b40 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20  , and if so.**  
11b50 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20   * if the child 
11b60 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
11b70 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
11b80 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a  master journal .
11b90 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73  **     file zMas
11ba0 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63  ter.**.** If a c
11bb0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  hild journal can
11bc0 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d   be found that m
11bd0 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74  atches both of t
11be0 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61  he criteria.** a
11bf0 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74  bove, this funct
11c00 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68  ion returns with
11c10 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
11c20 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ng. Otherwise, i
11c30 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69  f.** no such chi
11c40 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  ld journal can b
11c50 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d  e found, file zM
11c60 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64  aster is deleted
11c70 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c   from.** the fil
11c80 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73  e-system using s
11c90 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
11ca0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
11cb0 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68   error within th
11cc0 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20  is function, an 
11cd0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
11ce0 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20  turned. This.** 
11cf0 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
11d00 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c  es memory by cal
11d10 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ling sqlite3Mall
11d20 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f  oc(). If an allo
11d30 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c  cation.** fails,
11d40 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
11d50 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
11d60 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f  wise, if no IO o
11d70 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
11d80 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54  .** occur, SQLIT
11d90 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
11da0 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68  ..**.** TODO: Th
11db0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
11dc0 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62  cates a single b
11dd0 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74  lock of memory t
11de0 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e  o load.** the en
11df0 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
11e00 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11e10 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
11e20 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75  ould be.** a cou
11e30 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73  ple of kilobytes
11e40 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69   or so - potenti
11e50 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ally larger than
11e60 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69   the page .** si
11e70 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
11e80 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  t pager_delmaste
11e90 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
11ea0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
11eb0 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ster){.  sqlite3
11ec0 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
11ed0 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
11ee0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
11ef0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
11f00 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
11f10 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
11f20 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64  ;    /* Malloc'd
11f30 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
11f40 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
11f50 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
11f60 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f  e *pJournal;   /
11f70 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64  * Malloc'd child
11f80 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
11f90 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68  scriptor */.  ch
11fa0 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
11fb0 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
11fc0 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
11fd0 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
11fe0 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
11ff0 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
12000 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
12010 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nal file */.  ch
12020 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
12030 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
12040 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61  er to one journa
12050 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65  l within MJ file
12060 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
12070 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20  terPtr;         
12080 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  /* Space to hold
12090 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f   MJ filename fro
120a0 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  m a journal file
120b0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65   */.  int nMaste
120c0 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  rPtr;           
120d0 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61  /* Amount of spa
120e0 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  ce allocated to 
120f0 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a  zMasterPtr[] */.
12100 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
12110 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68  pace for both th
12120 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70  e pJournal and p
12130 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73 63  Master file desc
12140 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66  riptors..  ** If
12150 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65   successful, ope
12160 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
12170 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65  rnal file for re
12180 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d  ading..  */.  pM
12190 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33  aster = (sqlite3
121a0 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d  _file *)sqlite3M
121b0 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e  allocZero(pVfs->
121c0 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20  szOsFile * 2);. 
121d0 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c   pJournal = (sql
121e0 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75  ite3_file *)(((u
121f0 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70  8 *)pMaster) + p
12200 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a  Vfs->szOsFile);.
12210 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29    if( !pMaster )
12220 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
12230 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
12240 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
12250 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
12260 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
12270 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
12280 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72  _JOURNAL);.    r
12290 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
122a0 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  n(pVfs, zMaster,
122b0 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c   pMaster, flags,
122c0 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
122d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
122e0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
122f0 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68  t;..  /* Load th
12300 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
12310 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
12320 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
12330 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74   from.  ** sqlit
12340 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  e3_malloc() and 
12350 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
12360 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20  asterJournal.   
12370 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a  Also obtain.  **
12380 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
12390 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72  e (in zMasterPtr
123a0 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61  ) to hold the na
123b0 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20  mes of master.  
123c0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** journal files
123d0 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
123e0 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b  regular rollback
123f0 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a  -journals..  */.
12400 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
12410 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72  FileSize(pMaster
12420 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  , &nMasterJourna
12430 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  l);.  if( rc!=SQ
12440 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
12450 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
12460 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66  nMasterPtr = pVf
12470 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
12480 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  .  zMasterJourna
12490 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  l = sqlite3Mallo
124a0 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f  c((int)nMasterJo
124b0 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50  urnal + nMasterP
124c0 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21  tr + 1);.  if( !
124d0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
124e0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
124f0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
12500 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
12510 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74  .  }.  zMasterPt
12520 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
12530 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
12540 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71  al+1];.  rc = sq
12550 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
12560 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
12570 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65  nal, (int)nMaste
12580 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  rJournal, 0);.  
12590 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
125a0 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
125b0 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65  er_out;.  zMaste
125c0 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
125d0 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20  Journal] = 0;.. 
125e0 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
125f0 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68  terJournal;.  wh
12600 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
12610 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
12620 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
12630 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b  .    int exists;
12640 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12650 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
12660 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
12670 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
12680 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66  &exists);.    if
12690 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
126a0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  ){.      goto de
126b0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
126c0 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74   }.    if( exist
126d0 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  s ){.      /* On
126e0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
126f0 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
12700 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
12710 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20  al exists..     
12720 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20   ** Open it and 
12730 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e  check if it poin
12740 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72  ts at the master
12750 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
12760 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
12770 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
12780 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
12790 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
127a0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b   */.      int c;
127b0 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73  .      int flags
127c0 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
127d0 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
127e0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
127f0 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  L);.      rc = s
12800 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
12810 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f  s, zJournal, pJo
12820 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29  urnal, flags, 0)
12830 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
12840 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12850 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
12860 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
12870 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ..      rc = rea
12880 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
12890 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72  Journal, zMaster
128a0 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29  Ptr, nMasterPtr)
128b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
128c0 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29  sClose(pJournal)
128d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
128e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
128f0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
12900 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
12910 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73  ..      c = zMas
12920 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
12930 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
12940 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
12950 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
12960 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
12970 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
12980 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
12990 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
129a0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74  . */.        got
129b0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
129c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
129d0 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
129e0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
129f0 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
12a00 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  }. .  sqlite3OsC
12a10 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
12a20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
12a30 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
12a40 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73  ter, 0);..delmas
12a50 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ter_out:.  sqlit
12a60 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a  e3_free(zMasterJ
12a70 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70  ournal);.  if( p
12a80 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Master ){.    sq
12a90 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
12aa0 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
12ab0 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72  t( !isOpen(pJour
12ac0 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  nal) );.    sqli
12ad0 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72  te3_free(pMaster
12ae0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
12af0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
12b00 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
12b10 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68  sed to change th
12b20 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  e actual size of
12b30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
12b40 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  * file in the fi
12b50 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20  le-system. This 
12b60 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
12b70 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
12b80 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f  ransaction,.** o
12b90 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
12ba0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e   transaction (in
12bb0 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20  cluding rolling 
12bc0 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
12bd0 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
12be0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
12bf0 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e  file is not open
12c00 2c 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76  , or an exclusiv
12c10 65 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a 2a 2a  e lock is not.**
12c20 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63   held, this func
12c30 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
12c40 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
12c50 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
12c60 20 69 73 0a 2a 2a 20 63 68 61 6e 67 65 64 20 74   is.** changed t
12c70 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e  o nPage pages (n
12c80 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67  Page*pPager->pag
12c90 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20 49 66  eSize bytes). If
12ca0 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 6f 6e 20   the file.** on 
12cb0 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  disk is currentl
12cc0 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50  y larger than nP
12cd0 61 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20  age pages, then 
12ce0 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78  use the VFS.** x
12cf0 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f  Truncate() metho
12d00 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74  d to truncate it
12d10 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d  ..**.** Or, it m
12d20 69 67 68 74 20 6d 69 67 68 74 20 62 65 20 74 68  ight might be th
12d30 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  e case that the 
12d40 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
12d50 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a  smaller than .**
12d60 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f   nPage pages. So
12d70 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  me operating sys
12d80 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tem implementati
12d90 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66  ons can get conf
12da0 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20  used if .** you 
12db0 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20  try to truncate 
12dc0 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73  a file to some s
12dd0 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67  ize that is larg
12de0 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63  er than it .** c
12df0 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20  urrently is, so 
12e00 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65  detect this case
12e10 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e   and write a sin
12e20 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f  gle zero byte to
12e30 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20   .** the end of 
12e40 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73  the new file ins
12e50 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  tead..**.** If s
12e60 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
12e70 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  n SQLITE_OK. If 
12e80 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
12e90 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69  rs while modifyi
12ea0 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  ng.** the databa
12eb0 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20  se file, return 
12ec0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
12ed0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
12ee0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
12ef0 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
12f00 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
12f10 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
12f20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
12f30 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
12f40 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
12f50 45 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  E && isOpen(pPag
12f60 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 69  er->fd) ){.    i
12f70 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20  64 currentSize, 
12f80 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 2f 2a 20  newSize;.    /* 
12f90 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65  TODO: Is it safe
12fa0 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62   to use Pager.db
12fb0 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a  FileSize here? *
12fc0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
12fd0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
12fe0 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e  ger->fd, &curren
12ff0 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53  tSize);.    newS
13000 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
13010 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67  geSize*(i64)nPag
13020 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  e;.    if( rc==S
13030 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72  QLITE_OK && curr
13040 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65  entSize!=newSize
13050 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75   ){.      if( cu
13060 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a  rrentSize>newSiz
13070 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
13080 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
13090 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ate(pPager->fd, 
130a0 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  newSize);.      
130b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
130c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
130d0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 22  te(pPager->fd, "
130e0 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29  ", 1, newSize-1)
130f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13100 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13110 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
13120 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
13130 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  = nPage;.      }
13140 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
13150 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13160 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Set the value o
13170 66 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74  f the Pager.sect
13180 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
13190 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
131a0 20 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20   pager based on 
131b0 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
131c0 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
131d0 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20  rSize method.** 
131e0 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  of the open data
131f0 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73  base file. The s
13200 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20  ector size will 
13210 62 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a  be used used .**
13220 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
13230 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e  e size and align
13240 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ment of journal 
13250 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d  header and .** m
13260 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
13270 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72  inters within cr
13280 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69  eated journal fi
13290 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
132a0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74  emporary files t
132b0 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
132c0 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61  tor size is alwa
132d0 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a  ys 512 bytes..**
132e0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66  .** Otherwise, f
132f0 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79  or non-temporary
13300 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65   files, the effe
13310 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
13320 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75  e is.** the valu
13330 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
13340 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20  e xSectorSize() 
13350 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75  method rounded u
13360 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74  p to 32 if.** it
13370 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32   is less than 32
13380 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77  , or rounded dow
13390 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f  n to MAX_SECTOR_
133a0 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73  SIZE if it.** is
133b0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41   greater than MA
133c0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a  X_SECTOR_SIZE..*
133d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
133e0 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65  tSectorSize(Page
133f0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
13400 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
13410 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
13420 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
13430 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
13440 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
13450 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64  /* Sector size d
13460 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f  oesn't matter fo
13470 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
13480 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c  s. Also, the fil
13490 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74  e.    ** may not
134a0 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
134b0 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20  d yet, in which 
134c0 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f  case the OsSecto
134d0 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63  rSize().    ** c
134e0 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c  all will segfaul
134f0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  t..    */.    pP
13500 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
13510 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74   = sqlite3OsSect
13520 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  orSize(pPager->f
13530 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  d);.  }.  if( pP
13540 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
13550 3c 33 32 20 29 7b 0a 20 20 20 20 70 50 61 67 65  <32 ){.    pPage
13560 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
13570 35 31 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  512;.  }.  if( p
13580 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
13590 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  e>MAX_SECTOR_SIZ
135a0 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  E ){.    assert(
135b0 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
135c0 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 70 50 61  >=512 );.    pPa
135d0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
135e0 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  = MAX_SECTOR_SIZ
135f0 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  E;.  }.}../*.** 
13600 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75  Playback the jou
13610 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65  rnal and thus re
13620 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
13630 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68  se file to.** th
13640 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
13650 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72  n before we star
13660 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  ted making chang
13670 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es.  .**.** The 
13680 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
13690 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  mat is as follow
136a0 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20  s: .**.**  (1)  
136b0 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20  8 byte prefix.  
136c0 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e  A copy of aJourn
136d0 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28  alMagic[]..**  (
136e0 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  2)  4 byte big-e
136f0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
13700 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
13710 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20  r of valid page 
13720 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20  records.**      
13730 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
13740 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
13750 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
13760 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  hen compute the.
13770 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20  **       number 
13780 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
13790 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
137a0 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20   size..**  (3)  
137b0 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
137c0 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
137d0 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
137e0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  alue for the .**
137f0 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68         sanity ch
13800 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20  ecksum..**  (4) 
13810 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
13820 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
13830 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
13840 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
13850 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74        database t
13860 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  o during a rollb
13870 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20  ack..**  (5)  4 
13880 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
13890 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
138a0 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
138b0 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a  .  The header.**
138c0 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d         is this m
138d0 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a  any bytes in siz
138e0 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79  e..**  (6)  4 by
138f0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
13900 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
13910 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
13920 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64    (7)  zero padd
13930 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e  ing out to the n
13940 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  ext sector size.
13950 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f  .**  (8)  Zero o
13960 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73  r more pages ins
13970 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20  tances, each as 
13980 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20  follows:.**     
13990 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67     +  4 byte pag
139a0 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20  e number..**    
139b0 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70      +  pPager->p
139c0 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
139d0 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20   data..**       
139e0 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b   +  4 byte check
139f0 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77  sum.**.** When w
13a00 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a  e speak of the j
13a10 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77  ournal header, w
13a20 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74  e mean the first
13a30 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a   7 items above..
13a40 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e  ** Each entry in
13a50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
13a60 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
13a70 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a  he 8th item..**.
13a80 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75  ** Call the valu
13a90 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  e from the secon
13aa0 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e  d bullet "nRec".
13ab0 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75    nRec is the nu
13ac0 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64  mber of.** valid
13ad0 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e   page entries in
13ae0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
13af0 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f  n most cases, yo
13b00 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  u can compute th
13b10 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52  e.** value of nR
13b20 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ec from the size
13b30 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
13b40 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20  file.  But if a 
13b50 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
13b60 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
13b70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
13b80 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69  being written, i
13b90 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a  t could be the.*
13ba0 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  * case that the 
13bb0 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
13bc0 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72  nal file had alr
13bd0 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61  eady been increa
13be0 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65  sed but.** the e
13bf0 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64  xtra entries had
13c00 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74   not yet made it
13c10 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e   safely to disk.
13c20 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65    In such a case
13c30 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
13c40 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  f nRec computed 
13c50 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
13c60 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20  ze would be too 
13c70 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  large.  For.** t
13c80 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61  hat reason, we a
13c90 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52  lways use the nR
13ca0 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
13cb0 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  header..**.** If
13cc0 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
13cd0 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74  is 0xffffffff it
13ce0 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63   means that nRec
13cf0 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
13d00 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
13d10 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73  file size.  This
13d20 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77   value is used w
13d30 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c  hen the user sel
13d40 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73  ects the.** no-s
13d50 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74  ync option for t
13d60 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70  he journal.  A p
13d70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
13d80 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75  ld lead to corru
13d90 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73  ption.** in this
13da0 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20   case.  But for 
13db0 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70  things like temp
13dc0 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69  orary table (whi
13dd0 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  ch will be.** de
13de0 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  leted when the p
13df0 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
13e00 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e  ) we don't care.
13e10 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
13e20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74  file opened as t
13e30 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13e40 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
13e50 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  rmed.** journal 
13e60 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61  file then all pa
13e70 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69  ges up to the fi
13e80 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61  rst corrupted pa
13e90 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a  ge are rolled.**
13ea0 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67   back (or no pag
13eb0 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  es if the journa
13ec0 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72  l header is corr
13ed0 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72  upted). The jour
13ee0 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74  nal file.** is t
13ef0 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20  hen deleted and 
13f00 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
13f10 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e  ed, just as if n
13f20 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64  o corruption had
13f30 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  .** been encount
13f40 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ered..**.** If a
13f50 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  n I/O or malloc(
13f60 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
13f70 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  the journal-file
13f80 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a   is not deleted.
13f90 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
13fa0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
13fb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f  ..**.** The isHo
13fc0 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69  t parameter indi
13fd0 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72  cates that we ar
13fe0 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c  e trying to roll
13ff0 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a  back a journal.*
14000 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  * that might be 
14010 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  a hot journal.  
14020 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  Or, it could be 
14030 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
14040 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65   is .** preserve
14050 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55  d because of JOU
14060 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
14070 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f   or JOURNALMODE_
14080 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20  TRUNCATE..** If 
14090 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c  the journal real
140a0 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74  ly is hot, reset
140b0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
140c0 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a   prior rolling.*
140d0 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65  * back any conte
140e0 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72  nt.  If the jour
140f0 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65  nal is merely pe
14100 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73  rsistent, no res
14110 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e  et is.** needed.
14120 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
14130 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
14140 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
14150 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74   isHot){.  sqlit
14160 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
14170 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
14180 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
14190 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
141a0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
141b0 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
141c0 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
141d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
141e0 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
141f0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
14200 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
14210 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14220 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
14230 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
14240 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
14250 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
14260 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
14270 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
14280 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
14290 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
142a0 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
142b0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
142c0 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  res = 1;        
142d0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
142e0 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
142f0 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20  3OsAccess() */. 
14300 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
14310 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
14320 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
14330 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
14340 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67  */.  int needPag
14350 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  erReset;      /*
14360 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70   True to reset p
14370 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72  age prior to fir
14380 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b  st page rollback
14390 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
143a0 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
143b0 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
143c0 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74   journal.  Abort
143d0 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74   early if.  ** t
143e0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d  he journal is em
143f0 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pty..  */.  asse
14400 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
14410 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20  r->jfd) );.  rc 
14420 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
14430 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
14440 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
14450 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
14460 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74  zJ==0 ){.    got
14470 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
14480 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
14490 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
144a0 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  l name from the 
144b0 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
144c0 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20  s present..  ** 
144d0 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
144e0 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
144f0 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20   specified, but 
14500 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  the file is not.
14510 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20    ** present on 
14520 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a  disk, then the j
14530 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f  ournal is not ho
14540 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e  t and does not n
14550 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70  eed to be.  ** p
14560 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a  layed back..  **
14570 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68  .  ** TODO: Tech
14580 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c  nically the foll
14590 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f  owing is an erro
145a0 72 20 62 65 63 61 75 73 65 20 69 74 20 61 73 73  r because it ass
145b0 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62  umes that.  ** b
145c0 75 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70  uffer Pager.pTmp
145d0 53 70 61 63 65 20 69 73 20 28 6d 78 50 61 74 68  Space is (mxPath
145e0 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72  name+1) bytes or
145f0 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68   larger. i.e. th
14600 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d  at.  ** (pPager-
14610 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61  >pageSize >= pPa
14620 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
14630 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20  hname+1). Using 
14640 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20  os_unix.c,.  ** 
14650 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35   mxPathname is 5
14660 31 32 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  12, which is the
14670 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e   same as the min
14680 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76  imum allowable v
14690 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61  alue.  ** for pa
146a0 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a  geSize..  */.  z
146b0 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
146c0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63  >pTmpSpace;.  rc
146d0 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
146e0 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
146f0 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
14700 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
14710 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63  ame+1);.  if( rc
14720 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
14730 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20  Master[0] ){.   
14740 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
14750 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
14760 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
14770 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29  SS_EXISTS, &res)
14780 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20  ;.  }.  zMaster 
14790 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  = 0;.  if( rc!=S
147a0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73  QLITE_OK || !res
147b0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
147c0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
147d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
147e0 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50  Off = 0;.  needP
147f0 61 67 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f  agerReset = isHo
14800 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  t;..  /* This lo
14810 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
14820 74 68 65 72 20 77 68 65 6e 20 61 20 72 65 61 64  ther when a read
14830 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20  JournalHdr() or 
14840 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79  .  ** pager_play
14850 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20  back_one_page() 
14860 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c  call returns SQL
14870 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49  ITE_DONE or an I
14880 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63  O error .  ** oc
14890 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68  curs. .  */.  wh
148a0 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a  ile( 1 ){.    /*
148b0 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
148c0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
148d0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
148e0 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
148f0 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
14900 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
14910 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
14920 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
14930 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
14940 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
14950 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
14960 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69  cess must of fai
14970 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
14980 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
14990 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
149a0 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
149b0 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
149c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
149d0 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
149e0 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20  (pPager, isHot, 
149f0 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
14a00 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
14a10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
14a20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
14a30 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
14a40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
14a50 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
14a60 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
14a70 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
14a80 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
14a90 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
14aa0 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
14ab0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
14ac0 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
14ad0 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
14ae0 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
14af0 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
14b00 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
14b10 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
14b20 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
14b30 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
14b40 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
14b50 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
14b60 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
14b70 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
14b80 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
14b90 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
14ba0 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
14bb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
14bc0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
14bd0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
14be0 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
14bf0 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
14c00 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
14c10 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
14c20 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
14c30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
14c40 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
14c50 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
14c60 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
14c70 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
14c80 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
14c90 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
14ca0 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
14cb0 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
14cc0 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
14cd0 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
14ce0 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
14cf0 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
14d00 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
14d10 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
14d20 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
14d30 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
14d40 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
14d50 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
14d60 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
14d70 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
14d80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
14d90 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
14da0 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
14db0 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
14dc0 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68  #2565..    ** Wh
14dd0 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
14de0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e  a hot journal, n
14df0 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65  Rec==0 always me
14e00 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ans that the nex
14e10 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f  t.    ** chunk o
14e20 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f  f the journal co
14e30 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65  ntains zero page
14e40 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
14e50 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a  ack.  But.    **
14e60 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f   when doing a RO
14e70 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e  LLBACK and the n
14e80 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20  Rec==0 chunk is 
14e90 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69  the last chunk i
14ea0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
14eb0 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  rnal, it means t
14ec0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
14ed0 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64  might contain ad
14ee0 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20  ditional.    ** 
14ef0 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20  pages that need 
14f00 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
14f10 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e  k and that the n
14f20 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a  umber of pages .
14f30 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
14f40 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20   computed based 
14f50 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
14f60 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  ile size..    */
14f70 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
14f80 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20   && !isHot &&.  
14f90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
14fa0 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
14fb0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
14fc0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
14fd0 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Off ){.      nRe
14fe0 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
14ff0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15000 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
15010 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
15020 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
15030 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
15040 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
15050 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
15060 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
15070 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
15080 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
15090 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
150a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
150b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
150c0 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
150d0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
150e0 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
150f0 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
15100 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
15110 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15120 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
15130 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
15140 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
15150 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
15160 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
15170 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
15180 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
15190 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
151a0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
151b0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f  abase file and/o
151c0 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20  r page cache..  
151d0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
151e0 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
151f0 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61        if( needPa
15200 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  gerReset ){.    
15210 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
15220 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
15230 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
15240 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
15250 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
15260 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
15270 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e  pPager,&pPager->
15280 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30  journalOff,0,1,0
15290 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
152a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
152b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
152c0 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
152d0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
152e0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
152f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15300 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20  Off = szJ;.     
15310 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15320 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
15330 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
15340 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
15350 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
15360 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
15370 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d  n truncated, sim
15380 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67  ply stop reading
15390 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
153a0 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65  * processing the
153b0 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d   journal. This m
153c0 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20 74  ight happen if t
153d0 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  he journal was. 
153e0 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20           ** not 
153f0 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74  completely writt
15400 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72  en and synced pr
15410 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20  ior to a crash. 
15420 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20   In that.       
15430 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20     ** case, the 
15440 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20  database should 
15450 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20  have never been 
15460 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20  written in the. 
15470 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73           ** firs
15480 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73  t place so it is
15490 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62   OK to simply ab
154a0 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61  andon the rollba
154b0 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ck. */.         
154c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
154d0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
154e0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
154f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15500 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
15510 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f  are unable to ro
15520 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64  llback, quit and
15530 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
15540 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  r.          ** c
15550 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ode.  This will 
15560 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72 20  cause the pager 
15570 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  to enter the err
15580 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20 20  or state.       
15590 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f     ** so that no
155a0 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77 69   further harm wi
155b0 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72  ll be done.  Per
155c0 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20  haps the next.  
155d0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
155e0 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67  ss to come along
155f0 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
15600 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61   rollback the da
15610 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20  tabase..        
15620 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67    */.          g
15630 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
15640 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15650 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
15660 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
15670 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65   assert( 0 );..e
15680 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f  nd_playback:.  /
15690 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f  * Following a ro
156a0 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  llback, the data
156b0 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
156c0 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20   be back in its 
156d0 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74  original.  ** st
156e0 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ate prior to the
156f0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
15700 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e  ansaction, so in
15710 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51  voke the.  ** SQ
15720 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
15730 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e  CHANGED file-con
15740 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64  trol method to d
15750 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20  isable the.  ** 
15760 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74  assertion that t
15770 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
15780 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66  ounter was modif
15790 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ied..  */.  asse
157a0 72 74 28 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rt(.    pPager->
157b0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20  fd->pMethods==0 
157c0 7c 7c 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ||.    sqlite3Os
157d0 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67  FileControl(pPag
157e0 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43  er->fd,SQLITE_FC
157f0 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
15800 2c 30 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  ,0)>=SQLITE_OK. 
15810 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   );..  /* If thi
15820 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61  s playback is ha
15830 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69  ppening automati
15840 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c  cally as a resul
15850 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20  t of an IO or . 
15860 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72   ** malloc error
15870 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 20 61   that occurred a
15880 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d  fter the change-
15890 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
158a0 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65  ted but .  ** be
158b0 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
158c0 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74  tion was committ
158d0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61  ed, then the cha
158e0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a  nge-counter .  *
158f0 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d  * modification m
15900 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65 65  ay just have bee
15910 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20 74  n reverted. If t
15920 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65  his happens in e
15930 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d  xclusive .  ** m
15940 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71  ode, then subseq
15950 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  uent transaction
15960 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74  s performed by t
15970 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  he connection wi
15980 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61  ll not.  ** upda
15990 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  te the change-co
159a0 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68  unter at all. Th
159b0 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63  is may lead to c
159c0 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e  ache inconsisten
159d0 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73  cy.  ** problems
159e0 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65   for other proce
159f0 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69  sses at some poi
15a00 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
15a10 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20  . So, just.  ** 
15a20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61 73  in case this has
15a30 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72   happened, clear
15a40 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   the changeCount
15a50 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20  Done flag now.. 
15a60 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68   */.  pPager->ch
15a70 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
15a80 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
15a90 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
15aa0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d  ITE_OK ){.    zM
15ab0 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  aster = pPager->
15ac0 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72  pTmpSpace;.    r
15ad0 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
15ae0 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
15af0 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  d, zMaster, pPag
15b00 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
15b10 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73  name+1);.    tes
15b20 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
15b30 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
15b40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15b50 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  && pPager->noSyn
15b60 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  c==0 && pPager->
15b70 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
15b80 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72 63  LUSIVE ){.    rc
15b90 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
15ba0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
15bb0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
15bc0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
15bd0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
15be0 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26  ger->noSync==0 &
15bf0 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  & pPager->state>
15c00 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
15c10 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
15c20 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
15c30 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  r->fd, pPager->s
15c40 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a  ync_flags);.  }.
15c50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15c60 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
15c70 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
15c80 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d  ction(pPager, zM
15c90 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b  aster[0]!='\0');
15ca0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
15cb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
15cc0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
15cd0 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
15ce0 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a  er[0] && res ){.
15cf0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
15d00 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
15d10 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
15d20 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
15d30 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a  n success,.    *
15d40 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
15d50 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
15d60 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
15d70 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rnal..    */.   
15d80 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
15d90 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d  aster(pPager, zM
15da0 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74  aster);.    test
15db0 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
15dc0 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OK );.  }..  /*
15dd0 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
15de0 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
15df0 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
15e00 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
15e10 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
15e20 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
15e30 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
15e40 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63   a different sec
15e50 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61  tor size.  ** va
15e60 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
15e70 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
15e80 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
15e90 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53  ess..  */.  setS
15ea0 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
15eb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
15ec0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  }.../*.** Read t
15ed0 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70  he content for p
15ee0 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74  age pPg out of t
15ef0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15f00 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50   and into .** pP
15f10 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72  g->pData. A shar
15f20 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74  ed lock or great
15f30 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  er must be held 
15f40 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
15f50 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
15f60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
15f70 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
15f80 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c   page 1 is read,
15f90 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
15fa0 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
15fb0 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a  ers[] is set to.
15fc0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ** the value rea
15fd0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
15fe0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
15ff0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
16000 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
16010 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  IO error is retu
16020 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
16030 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  er..** Otherwise
16040 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
16050 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
16060 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67  ic int readDbPag
16070 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
16080 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
16090 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a   pPg->pPager; /*
160a0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73   Pager object as
160b0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
160c0 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f  ge pPg */.  Pgno
160d0 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
160e0 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  o;       /* Page
160f0 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20   number to read 
16100 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
16110 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
16120 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
16130 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 57 61   */.  int isInWa
16140 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
16150 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 61     /* True if pa
16160 67 65 20 69 73 20 69 6e 20 6c 6f 67 20 66 69 6c  ge is in log fil
16170 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20  e */.  int pgsz 
16180 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
16190 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ze; /* Number of
161a0 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
161b0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
161c0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
161d0 52 5f 53 48 41 52 45 44 20 26 26 20 21 4d 45 4d  R_SHARED && !MEM
161e0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
161f0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
16200 64 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56  d) );..  if( NEV
16210 45 52 28 21 69 73 4f 70 65 6e 28 70 50 61 67 65  ER(!isOpen(pPage
16220 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20 61  r->fd)) ){.    a
16230 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
16240 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 6d  empFile );.    m
16250 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61  emset(pPg->pData
16260 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
16270 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 65 74 75  eSize);.    retu
16280 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
16290 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  }..  if( pagerUs
162a0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
162b0 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75      /* Try to pu
162c0 6c 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ll the page from
162d0 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64   the write-ahead
162e0 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20   log. */.    rc 
162f0 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64  = sqlite3WalRead
16300 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
16310 67 6e 6f 2c 20 26 69 73 49 6e 57 61 6c 2c 20 70  gno, &isInWal, p
16320 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61 29  gsz, pPg->pData)
16330 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
16340 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 69 73  SQLITE_OK && !is
16350 49 6e 57 61 6c 20 29 7b 0a 20 20 20 20 69 36 34  InWal ){.    i64
16360 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f   iOffset = (pgno
16370 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
16380 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72  >pageSize;.    r
16390 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
163a0 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  d(pPager->fd, pP
163b0 67 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c 20  g->pData, pgsz, 
163c0 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66  iOffset);.    if
163d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
163e0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
163f0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
16400 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
16410 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20  ..  if( pgno==1 
16420 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  ){.    if( rc ){
16430 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
16440 20 72 65 61 64 20 69 73 20 75 6e 73 75 63 63 65   read is unsucce
16450 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64  ssful, set the d
16460 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73  bFileVers[] to s
16470 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a  omething.      *
16480 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65  * that will neve
16490 72 20 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c  r be a valid fil
164a0 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69  e version.  dbFi
164b0 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f  leVers[] is a co
164c0 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62  py.      ** of b
164d0 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74  ytes 24..39 of t
164e0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 79  he database.  By
164f0 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c  tes 28..31 shoul
16500 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20  d always be.    
16510 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65    ** zero or the
16520 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
16530 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42  abase in page. B
16540 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20  ytes 32..35 and 
16550 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20  35..39.      ** 
16560 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e  should be page n
16570 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65  umbers which are
16580 20 6e 65 76 65 72 20 30 78 66 66 66 66 66 66 66   never 0xfffffff
16590 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20  f.  So filling. 
165a0 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e       ** pPager->
165b0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74  dbFileVers[] wit
165c0 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73  h all 0xff bytes
165d0 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e   should suffice.
165e0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
165f0 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70  ** For an encryp
16600 74 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68  ted database, th
16610 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d  e situation is m
16620 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79  ore complex:  by
16630 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e  tes.      ** 24.
16640 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62  .39 of the datab
16650 61 73 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f  ase are white no
16660 69 73 65 2e 20 20 42 75 74 20 74 68 65 20 70 72  ise.  But the pr
16670 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20  obability of.   
16680 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73     ** white nois
16690 69 6e 67 20 65 71 75 61 6c 69 6e 67 20 31 36 20  ing equaling 16 
166a0 62 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73  bytes of 0xff is
166b0 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
166c0 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77  ll so.      ** w
166d0 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62  e should still b
166e0 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  e ok..      */. 
166f0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67       memset(pPag
16700 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
16710 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61  0xff, sizeof(pPa
16720 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
16730 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
16740 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65      u8 *dbFileVe
16750 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d  rs = &((u8*)pPg-
16760 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20  >pData)[24];.   
16770 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
16780 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64  r->dbFileVers, d
16790 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
167a0 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
167b0 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Vers));.    }.  
167c0 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65  }.  CODEC1(pPage
167d0 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  r, pPg->pData, p
167e0 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c  gno, 3, rc = SQL
167f0 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50  ITE_NOMEM);..  P
16800 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
16810 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
16820 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49  ount);.  PAGER_I
16830 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61  NCR(pPager->nRea
16840 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  d);.  IOTRACE(("
16850 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  PGIN %p %d\n", p
16860 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
16870 20 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45   PAGERTRACE(("FE
16880 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68  TCH %d page %d h
16890 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
168a0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
168b0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
168c0 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
168d0 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65  sh(pPg)));..  re
168e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
168f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16900 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  WAL./*.** This f
16910 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
16920 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
16930 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61   page that has a
16940 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20  lready been .** 
16950 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
16960 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61   log file when a
16970 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   WAL transaction
16980 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
16990 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50  .** Parameter iP
169a0 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  g is the page nu
169b0 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67  mber of said pag
169c0 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75  e. The pCtx argu
169d0 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75  ment .** is actu
169e0 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
169f0 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  o the Pager stru
16a00 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
16a10 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73  page iPg is pres
16a20 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65  ent in the cache
16a30 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74  , and has no out
16a40 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
16a50 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69  ces,.** it is di
16a60 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69  scarded. Otherwi
16a70 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  se, if there are
16a80 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74   one or more out
16a90 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65  standing.** refe
16aa0 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65  rences, the page
16ab0 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f   content is relo
16ac0 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  aded from the da
16ad0 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a  tabase. If the.*
16ae0 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c  * attempt to rel
16af0 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  oad content from
16b00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
16b10 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61   required and fa
16b20 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20  ils, .** return 
16b30 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
16b40 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  code. Otherwise,
16b50 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
16b60 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
16b70 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64  ndoCallback(void
16b80 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67   *pCtx, Pgno iPg
16b90 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
16ba0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
16bb0 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
16bc0 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64  r *)pCtx;.  PgHd
16bd0 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20 3d  r *pPg;..  pPg =
16be0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
16bf0 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67 29  kup(pPager, iPg)
16c00 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  ;.  if( pPg ){. 
16c10 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63     if( sqlite3Pc
16c20 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74  achePageRefcount
16c30 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20  (pPg)==1 ){.    
16c40 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
16c50 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65  rop(pPg);.    }e
16c60 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
16c70 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b  readDbPage(pPg);
16c80 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
16c90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16ca0 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
16cb0 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20  niter(pPg);.    
16cc0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
16cd0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
16ce0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
16cf0 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61  * Normally, if a
16d00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
16d10 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79  rolled back, any
16d20 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65   backup processe
16d30 73 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61 74  s are.  ** updat
16d40 65 64 20 61 73 20 64 61 74 61 20 69 73 20 63 6f  ed as data is co
16d50 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20  pied out of the 
16d60 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
16d70 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20 20   and into the.  
16d80 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ** database. Thi
16d90 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c  s is not general
16da0 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68  ly possible with
16db0 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c   a WAL database,
16dc0 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63   as.  ** rollbac
16dd0 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c  k involves simpl
16de0 79 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65  y truncating the
16df0 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72 65   log file. There
16e00 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a  fore, if one.  *
16e10 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65 73  * or more frames
16e20 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
16e30 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
16e40 65 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72 65  e log (and there
16e50 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20  fore .  ** also 
16e60 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20  copied into the 
16e70 62 61 63 6b 75 70 20 64 61 74 61 62 61 73 65 73  backup databases
16e80 29 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 69  ) as part of thi
16e90 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20  s transaction,. 
16ea0 20 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73 20   ** the backups 
16eb0 6d 75 73 74 20 62 65 20 72 65 73 74 61 72 74 65  must be restarte
16ec0 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  d..  */.  sqlite
16ed0 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
16ee0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
16ef0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
16f00 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
16f10 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
16f20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72  to rollback a tr
16f30 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57  ansaction on a W
16f40 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  AL database..*/.
16f50 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
16f60 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67 65  RollbackWal(Page
16f70 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
16f80 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
16f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16fa0 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
16fb0 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b 20    PgHdr *pList; 
16fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fd0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69 72    /* List of dir
16fe0 74 79 20 70 61 67 65 73 20 74 6f 20 72 65 76 65  ty pages to reve
16ff0 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20  rt */..  /* For 
17000 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65  all pages in the
17010 20 63 61 63 68 65 20 74 68 61 74 20 61 72 65 20   cache that are 
17020 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20  currently dirty 
17030 6f 72 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  or have already.
17040 20 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65    ** been writte
17050 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69  n (but not commi
17060 74 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f 67  tted) to the log
17070 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66   file, do one of
17080 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f   the .  ** follo
17090 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  wing:.  **.  ** 
170a0 20 20 2b 20 44 69 73 63 61 72 64 20 74 68 65 20    + Discard the 
170b0 63 61 63 68 65 64 20 70 61 67 65 20 28 69 66 20  cached page (if 
170c0 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72  refcount==0), or
170d0 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64  .  **   + Reload
170e0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66 72   page content fr
170f0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
17100 28 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e  (if refcount>0).
17110 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
17120 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
17130 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72  >dbOrigSize;.  r
17140 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55 6e  c = sqlite3WalUn
17150 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
17160 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
17170 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  ck, (void *)pPag
17180 65 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73  er);.  pList = s
17190 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
171a0 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
171b0 43 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65 28  Cache);.  while(
171c0 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51   pList && rc==SQ
171d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
171e0 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c  gHdr *pNext = pL
171f0 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  ist->pDirty;.   
17200 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43   rc = pagerUndoC
17210 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29  allback((void *)
17220 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
17230 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  gno);.    pList 
17240 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20  = pNext;.  }..  
17250 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17260 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
17270 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  n is a wrapper a
17280 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c  round sqlite3Wal
17290 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c  Frames(). As wel
172a0 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20  l as logging.** 
172b0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
172c0 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  the list of page
172d0 73 20 68 65 61 64 65 64 20 62 79 20 70 4c 69 73  s headed by pLis
172e0 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  t (connected by 
172f0 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73  pDirty),.** this
17300 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69   function notifi
17310 65 73 20 61 6e 79 20 61 63 74 69 76 65 20 62 61  es any active ba
17320 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 74  ckup processes t
17330 68 61 74 20 74 68 65 20 70 61 67 65 73 20 68 61  hat the pages ha
17340 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a  ve.** changed. .
17350 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70  */ .static int p
17360 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20  agerWalFrames(. 
17370 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
17380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17390 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
173a0 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69   */.  PgHdr *pLi
173b0 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
173c0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
173d0 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a   frames to log *
173e0 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61  /.  Pgno nTrunca
173f0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
17400 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
17410 73 69 7a 65 20 61 66 74 65 72 20 74 68 69 73 20  size after this 
17420 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20  commit */.  int 
17430 69 73 43 6f 6d 6d 69 74 2c 20 20 20 20 20 20 20  isCommit,       
17440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17450 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
17460 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74   commit */.  int
17470 20 73 79 6e 63 5f 66 6c 61 67 73 20 20 20 20 20   sync_flags     
17480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17490 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f  Flags to pass to
174a0 20 4f 73 53 79 6e 63 28 29 20 28 6f 72 20 30 29   OsSync() (or 0)
174b0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
174c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
174e0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73  rn code */..  as
174f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57  sert( pPager->pW
17500 61 6c 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  al );.  rc = sql
17510 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70 50  ite3WalFrames(pP
17520 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20  ager->pWal, .   
17530 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
17540 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75  ize, pList, nTru
17550 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c  ncate, isCommit,
17560 20 73 79 6e 63 5f 66 6c 61 67 73 0a 20 20 29 3b   sync_flags.  );
17570 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
17580 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
17590 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 50  pBackup ){.    P
175a0 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72  gHdr *p;.    for
175b0 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
175c0 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20  ->pDirty){.     
175d0 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
175e0 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
175f0 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28  ckup, p->pgno, (
17600 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a  u8 *)p->pData);.
17610 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
17620 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17630 42 65 67 69 6e 20 61 20 72 65 61 64 20 74 72 61  Begin a read tra
17640 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
17650 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  WAL..**.** This 
17660 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20  routine used to 
17670 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72  be called "pager
17680 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20  OpenSnapshot()" 
17690 62 65 63 61 75 73 65 20 69 74 20 65 73 73 65 6e  because it essen
176a0 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20  tially.** makes 
176b0 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68  a snapshot of th
176c0 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
176d0 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20  e current point 
176e0 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73  in time and pres
176f0 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e  erves.** that sn
17700 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62  apshot for use b
17710 79 20 74 68 65 20 72 65 61 64 65 72 20 69 6e 20  y the reader in 
17720 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72  spite of concurr
17730 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79  ently changes by
17740 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72  .** other writer
17750 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65  s or checkpointe
17760 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
17770 74 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  t pagerBeginRead
17780 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  Transaction(Page
17790 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
177a0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
177b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
177c0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
177d0 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20    int changed = 
177e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
177f0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63    /* True if cac
17800 68 65 20 6d 75 73 74 20 62 65 20 72 65 73 65 74  he must be reset
17810 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
17820 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
17830 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69  r) );..  /* sqli
17840 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
17850 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e  nsaction() was n
17860 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  ot called for th
17870 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20  e previous.  ** 
17880 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c  transaction in l
17890 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
178a0 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20  USIVE.  So call 
178b0 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20  it now.  If we. 
178c0 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69   ** are in locki
178d0 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61  ng_mode=NORMAL a
178e0 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73  nd EndRead() was
178f0 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c   previously call
17900 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70  ed,.  ** the dup
17910 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68  licate call is h
17920 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  armless..  */.  
17930 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
17940 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
17950 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72  ger->pWal);..  r
17960 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65  c = sqlite3WalBe
17970 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
17980 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  on(pPager->pWal,
17990 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66   &changed);.  if
179a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
179b0 29 7b 0a 20 20 20 20 69 6e 74 20 64 75 6d 6d 79  ){.    int dummy
179c0 3b 0a 20 20 20 20 69 66 28 20 63 68 61 6e 67 65  ;.    if( change
179d0 64 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  d ){.      pager
179e0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
179f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
17a00 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c  ager->errCode ||
17a10 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
17a20 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  alid==0 );.    }
17a30 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17a40 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
17a50 70 50 61 67 65 72 2c 20 26 64 75 6d 6d 79 29 3b  pPager, &dummy);
17a60 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
17a70 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
17a80 52 45 44 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  RED;..  return r
17a90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  c;.}../*.** Chec
17aa0 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66  k if the *-wal f
17ab0 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73 70  ile that corresp
17ac0 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74 61  onds to the data
17ad0 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70  base opened by p
17ae0 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 2e  Pager.** exists.
17af0 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   Assuming no err
17b00 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a  or occurs, set *
17b10 70 45 78 69 73 74 73 20 74 6f 20 31 20 69 66 20  pExists to 1 if 
17b20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c  the file exists,
17b30 0a 2a 2a 20 6f 72 20 30 20 6f 74 68 65 72 77 69  .** or 0 otherwi
17b40 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  se and return SQ
17b50 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49  LITE_OK. If an I
17b60 4f 20 6f 72 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  O or OOM error o
17b70 63 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a  ccurs, return.**
17b80 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
17b90 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
17ba0 20 69 6e 74 20 70 61 67 65 72 48 61 73 57 41 4c   int pagerHasWAL
17bb0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
17bc0 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20  int *pExists){. 
17bd0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
17be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bf0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
17c00 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b  */.  char *zWal;
17c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
17c30 74 68 65 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a  the WAL file */.
17c40 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
17c50 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
17c60 20 20 7a 57 61 6c 20 3d 20 73 71 6c 69 74 65 33    zWal = sqlite3
17c70 5f 6d 70 72 69 6e 74 66 28 22 25 73 2d 77 61 6c  _mprintf("%s-wal
17c80 22 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  ", pPager->zFile
17c90 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 7a 57  name);.  if( !zW
17ca0 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  al ){.    rc = S
17cb0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
17cc0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
17cd0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
17ce0 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 7a 57 61  Pager->pVfs, zWa
17cf0 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
17d00 5f 45 58 49 53 54 53 2c 20 70 45 78 69 73 74 73  _EXISTS, pExists
17d10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
17d20 72 65 65 28 7a 57 61 6c 29 3b 0a 20 20 7d 0a 20  ree(zWal);.  }. 
17d30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17d40 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68  *.** Check if th
17d50 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61  e *-wal file tha
17d60 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
17d70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70   the database op
17d80 65 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a  ened by pPager.*
17d90 2a 20 65 78 69 73 74 73 2e 20 49 66 20 69 74 20  * exists. If it 
17da0 64 6f 65 73 2c 20 6f 70 65 6e 20 74 68 65 20 70  does, open the p
17db0 61 67 65 72 20 69 6e 20 57 41 4c 20 6d 6f 64 65  ager in WAL mode
17dc0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
17dd0 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  no error.** occu
17de0 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61  rs, make sure Pa
17df0 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  ger.journalMode 
17e00 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 20 50 41  is not set to PA
17e10 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
17e20 57 41 4c 2e 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  WAL..** If an IO
17e30 20 6f 72 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63   or OOM error oc
17e40 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20  curs, return an 
17e50 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
17e60 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
17e70 57 41 4c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  WAL file is open
17e80 65 64 2c 20 61 6c 73 6f 20 6f 70 65 6e 20 61 20  ed, also open a 
17e90 73 6e 61 70 73 68 6f 74 20 28 72 65 61 64 20 74  snapshot (read t
17ea0 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
17eb0 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
17ec0 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44  st hold a SHARED
17ed0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
17ee0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61  abase file to ca
17ef0 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ll this.** funct
17f00 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20  ion. Because an 
17f10 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
17f20 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73  n the db file is
17f30 20 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c   required to del
17f40 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 2c 20 74  ete .** a WAL, t
17f50 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 65 72  his ensures ther
17f60 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e  e is no race con
17f70 64 69 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 74  dition between t
17f80 68 65 20 78 41 63 63 65 73 73 28 29 20 0a 2a 2a  he xAccess() .**
17f90 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44   below and an xD
17fa0 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65 78  elete() being ex
17fb0 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20 6f  ecuted by some o
17fc0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  ther connection.
17fd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
17fe0 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
17ff0 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  sent(Pager *pPag
18000 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
18010 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
18020 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
18030 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73  le ){.    int is
18040 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Wal;            
18050 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
18060 69 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73  if WAL file exis
18070 74 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  ts */.    rc = p
18080 61 67 65 72 48 61 73 57 41 4c 28 70 50 61 67 65  agerHasWAL(pPage
18090 72 2c 20 26 69 73 57 61 6c 29 3b 0a 20 20 20 20  r, &isWal);.    
180a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
180b0 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
180c0 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  sWal ){.        
180d0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
180e0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  er);.        rc 
180f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
18100 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29  enWal(pPager, 0)
18110 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
18120 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18130 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
18140 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
18150 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
18160 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18170 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
18180 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
18190 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
181a0 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  E_WAL ){.       
181b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
181c0 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
181d0 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b  RNALMODE_DELETE;
181e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
181f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18200 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
18210 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69  Playback savepoi
18220 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f  nt pSavepoint. O
18230 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74  r, if pSavepoint
18240 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61  ==NULL, then pla
18250 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74  yback.** the ent
18260 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
18270 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73  al file. The cas
18280 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  e pSavepoint==NU
18290 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a  LL occurs when .
182a0 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f  ** a ROLLBACK TO
182b0 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f   command is invo
182c0 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49  ked on a SAVEPOI
182d0 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61  NT that is a tra
182e0 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76  nsaction .** sav
182f0 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68  epoint..**.** Wh
18300 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  en pSavepoint is
18310 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69   not NULL (meani
18320 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63  ng a non-transac
18330 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
18340 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c  s .** being roll
18350 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74  ed back), then t
18360 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73  he rollback cons
18370 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68  ists of up to th
18380 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70  ree stages,.** p
18390 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20  erformed in the 
183a0 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a  order specified:
183b0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
183c0 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
183d0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
183e0 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
183f0 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f  at byte.**     o
18400 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70  ffset PagerSavep
18410 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64  oint.iOffset and
18420 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a   continuing to .
18430 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
18440 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
18450 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20  , or to the end 
18460 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
18470 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  nal.**     file 
18480 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  if PagerSavepoin
18490 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
184a0 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  zero..**.**   * 
184b0 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  If PagerSavepoin
184c0 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
184d0 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70  not zero, then p
184e0 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a  ages are played.
184f0 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72  **     back star
18500 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ting from the jo
18510 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d  urnal header imm
18520 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
18530 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  ng .**     Pager
18540 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
18550 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20  fset to the end 
18560 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
18570 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
18580 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68    * Pages are th
18590 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  en played back f
185a0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
185b0 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69  nal file, starti
185c0 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74  ng.**     with t
185d0 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
185e0 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f  t.iSubRec and co
185f0 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
18600 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68  end of.**     th
18610 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
18620 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74  **.** Throughout
18630 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72   the rollback pr
18640 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65  ocess, each time
18650 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65   a page is rolle
18660 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63  d back, the.** c
18670 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
18680 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74   is set in a bit
18690 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76  vec structure (v
186a0 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e  ariable pDone in
186b0 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e   the.** implemen
186c0 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54  tation below). T
186d0 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65  his is used to e
186e0 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67  nsure that a pag
186f0 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c  e is only.** rol
18700 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72  led back the fir
18710 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e  st time it is en
18720 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74  countered in eit
18730 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  her journal..**.
18740 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74  ** If pSavepoint
18750 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70   is NULL, then p
18760 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c  ages are only pl
18770 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
18780 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e  he main.** journ
18790 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69  al file. There i
187a0 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20  s no need for a 
187b0 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63  bitvec in this c
187c0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69  ase..**.** In ei
187d0 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72  ther case, befor
187e0 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65  e playback comme
187f0 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64  nces the Pager.d
18800 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a  bSize variable.*
18810 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68  * is reset to th
18820 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20  e value that it 
18830 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72  held at the star
18840 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69  t of the savepoi
18850 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73  nt .** (or trans
18860 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65  action). No page
18870 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d   with a page-num
18880 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
18890 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69   this value.** i
188a0 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49  s played back. I
188b0 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74  f one is encount
188c0 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c  ered it is simpl
188d0 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74  y skipped..*/.st
188e0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c  atic int pagerPl
188f0 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28  aybackSavepoint(
18900 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
18910 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
18920 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36  Savepoint){.  i6
18930 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
18940 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74         /* Effect
18950 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
18960 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  main journal */.
18970 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
18980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
18990 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65  d of first segme
189a0 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e  nt of main-journ
189b0 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al records */.  
189c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
189d0 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
189e0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74  rn code */.  Bit
189f0 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20  vec *pDone = 0; 
18a00 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
18a10 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20  to ensure pages 
18a20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79  played back only
18a30 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65   once */..  asse
18a40 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
18a50 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
18a60 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
18a70 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73  e a bitvec to us
18a80 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
18a90 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c  et of pages roll
18aa0 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  ed back */.  if(
18ab0 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
18ac0 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74     pDone = sqlit
18ad0 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
18ae0 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
18af0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e  );.    if( !pDon
18b00 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
18b10 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
18b20 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
18b30 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  Set the database
18b40 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68   size back to th
18b50 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62  e value it was b
18b60 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f  efore the savepo
18b70 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20  int .  ** being 
18b80 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65  reverted was ope
18b90 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ned..  */.  pPag
18ba0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61  er->dbSize = pSa
18bb0 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70  vepoint ? pSavep
18bc0 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50  oint->nOrig : pP
18bd0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
18be0 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65 70  ;..  if( !pSavep
18bf0 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 65  oint && pagerUse
18c00 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
18c10 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 52     return pagerR
18c20 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65  ollbackWal(pPage
18c30 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73  r);.  }..  /* Us
18c40 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e pPager->journa
18c50 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65  lOff as the effe
18c60 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
18c70 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
18c80 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54    ** journal.  T
18c90 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d  he actual file m
18ca0 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
18cb0 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a  han this in.  **
18cc0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
18cd0 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50  DE_TRUNCATE or P
18ce0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
18cf0 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61  _PERSIST.  But a
18d00 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73  nything.  ** pas
18d10 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  t pPager->journa
18d20 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69  lOff is off-limi
18d30 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20  ts to us..  */. 
18d40 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a   szJ = pPager->j
18d50 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73  ournalOff;.  ass
18d60 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
18d70 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73  (pPager)==0 || s
18d80 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42  zJ==0 );..  /* B
18d90 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20  egin by rolling 
18da0 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f  back records fro
18db0 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
18dc0 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20  al starting at. 
18dd0 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
18de0 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63  nt.iOffset and c
18df0 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
18e00 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
18e10 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65  ader..  ** There
18e20 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64   might be record
18e30 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  s in the main jo
18e40 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20  urnal that have 
18e50 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  a page number.  
18e60 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
18e70 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
18e80 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65  base size (pPage
18e90 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74  r->dbSize) but t
18ea0 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  hose.  ** will b
18eb0 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61  e skipped automa
18ec0 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20  tically.  Pages 
18ed0 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f  are added to pDo
18ee0 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20  ne as they.  ** 
18ef0 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e  are played back.
18f00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
18f10 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72  epoint && !pager
18f20 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
18f30 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20  {.    iHdrOff = 
18f40 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72  pSavepoint->iHdr
18f50 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f  Offset ? pSavepo
18f60 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
18f70 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65  : szJ;.    pPage
18f80 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
18f90 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66  pSavepoint->iOff
18fa0 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  set;.    while( 
18fb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18fc0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
18fd0 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20  Off<iHdrOff ){. 
18fe0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
18ff0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
19000 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
19010 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
19020 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Done, 1, 1);.   
19030 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
19040 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
19050 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
19060 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
19070 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  f = 0;.  }..  /*
19080 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e   Continue rollin
19090 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f  g back records o
190a0 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ut of the main j
190b0 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
190c0 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  at.  ** the firs
190d0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
190e0 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e   seen and contin
190f0 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65  uing until the e
19100 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a  ffective end.  *
19110 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * of the main jo
19120 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e  urnal file.  Con
19130 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75  tinue to skip ou
19140 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73  t-of-range pages
19150 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e   and.  ** contin
19160 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20  ue adding pages 
19170 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70  rolled back to p
19180 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  Done..  */.  whi
19190 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
191a0 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
191b0 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20  rnalOff<szJ ){. 
191c0 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20     u32 ii;      
191d0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
191e0 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  unter */.    u32
191f0 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20   nJRec = 0;     
19200 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75  /* Number of Jou
19210 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a  rnal Records */.
19220 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
19230 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
19240 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30  nalHdr(pPager, 0
19250 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26  , szJ, &nJRec, &
19260 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65  dummy);.    asse
19270 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
19280 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  ONE );..    /*. 
19290 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65     ** The "pPage
192a0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
192b0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
192c0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
192d0 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a  urnalOff".    **
192e0 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64   test is related
192f0 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35   to ticket #2565
19300 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75  .  See the discu
19310 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20  ssion in the.   
19320 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
19330 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ck() function fo
19340 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
19350 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  ormation..    */
19360 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d  .    if( nJRec==
19370 30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65  0 .     && pPage
19380 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
19390 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
193a0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
193b0 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a  urnalOff.    ){.
193c0 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75        nJRec = (u
193d0 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  32)((szJ - pPage
193e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a  r->journalOff)/J
193f0 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
19400 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ger));.    }.   
19410 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53   for(ii=0; rc==S
19420 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e  QLITE_OK && ii<n
19430 4a 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e  JRec && pPager->
19440 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20  journalOff<szJ; 
19450 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20  ii++){.      rc 
19460 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
19470 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
19480 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
19490 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c  alOff, pDone, 1,
194a0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
194b0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
194c0 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20  E_DONE );.  }.  
194d0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
194e0 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
194f0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a  >journalOff>=szJ
19500 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c   );..  /* Finall
19510 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  y,  rollback pag
19520 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  es from the sub-
19530 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74  journal.  Page t
19540 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72  hat were.  ** pr
19550 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20  eviously rolled 
19560 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  back out of the 
19570 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e  main journal (an
19580 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70  d are hence in p
19590 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20  Done).  ** will 
195a0 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74  be skipped.  Out
195b0 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
195c0 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64  are also skipped
195d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
195e0 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75  vepoint ){.    u
195f0 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
19600 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
19610 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66  r */.    i64 off
19620 73 65 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  set = pSavepoint
19630 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
19640 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
19650 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
19660 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
19670 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19680 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e  e3WalSavepointUn
19690 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
196a0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61   pSavepoint->aWa
196b0 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  lData);.    }.  
196c0 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
196d0 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
196e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
196f0 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  i<pPager->nSubRe
19700 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
19710 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d  assert( offset==
19720 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ii*(4+pPager->pa
19730 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20  geSize) );.     
19740 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
19750 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
19760 61 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70  ager, &offset, p
19770 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20  Done, 0, 1);.   
19780 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
19790 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
197a0 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
197b0 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44  BitvecDestroy(pD
197c0 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  one);.  if( rc==
197d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
197e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
197f0 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a  Off = szJ;.  }..
19800 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19810 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
19820 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
19830 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
19840 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
19850 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wed..*/.void sql
19860 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
19870 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
19880 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
19890 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
198a0 65 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50  eSetCachesize(pP
198b0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d  ager->pPCache, m
198c0 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xPage);.}../*.**
198d0 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75   Adjust the robu
198e0 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61  stness of the da
198f0 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65  tabase to damage
19900 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
19910 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  es.** or power f
19920 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67  ailures by chang
19930 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
19940 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20  f syncs()s when 
19950 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72  writing.** the r
19960 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
19970 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65    There are thre
19980 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20  e levels:.**.** 
19990 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c     OFF       sql
199a0 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20  ite3OsSync() is 
199b0 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54  never called.  T
199c0 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
199d0 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
199e0 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79     for temporary
199f0 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66   and transient f
19a00 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  iles..**.**    N
19a10 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75  ORMAL    The jou
19a20 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f  rnal is synced o
19a30 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  nce before write
19a40 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
19a50 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
19a60 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
19a70 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75  s normally adequ
19a80 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20  ate protection, 
19a90 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  but.**          
19aa0 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65      it is theore
19ab0 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  tically possible
19ac0 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e  , though very un
19ad0 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20  likely,.**      
19ae0 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20          that an 
19af0 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72  inopertune power
19b00 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
19b10 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eave the journal
19b20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
19b30 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63   in a state whic
19b40 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61  h would cause da
19b50 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
19b60 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
19b70 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20       when it is 
19b80 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
19b90 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20  **    FULL      
19ba0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
19bb0 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f  ynced twice befo
19bc0 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
19bd0 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
19be0 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
19bf0 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74  (with some addit
19c00 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
19c10 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65  n - the nRec fie
19c20 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ld.**           
19c30 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61     of the journa
19c40 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67  l header - being
19c50 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77   written in betw
19c60 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20  een the two.**  
19c70 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63              sync
19c80 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d  s).  If we assum
19c90 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61  e that writing a
19ca0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
19cb0 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
19cc0 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74  tor is atomic, t
19cd0 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72  hen this mode pr
19ce0 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20  ovides.**       
19cf0 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65         assurance
19d00 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
19d10 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f  l will not be co
19d20 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a  rrupted to the.*
19d30 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  *              p
19d40 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20  oint of causing 
19d50 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
19d60 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f  tabase during ro
19d70 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75  llback..**.** Nu
19d80 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
19d90 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
19da0 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
19db0 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
19dc0 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
19dd0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
19de0 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
19df0 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
19e00 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
19e10 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  vel(Pager *pPage
19e20 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  r, int level, in
19e30 74 20 62 46 75 6c 6c 46 73 79 6e 63 29 7b 0a 20  t bFullFsync){. 
19e40 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
19e50 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20  =  (level==1 || 
19e60 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
19e70 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72  ) ?1:0;.  pPager
19e80 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65  ->fullSync = (le
19e90 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65  vel==3 && !pPage
19ea0 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a  r->tempFile) ?1:
19eb0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  0;.  pPager->syn
19ec0 63 5f 66 6c 61 67 73 20 3d 20 28 62 46 75 6c 6c  c_flags = (bFull
19ed0 46 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e  Fsync?SQLITE_SYN
19ee0 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59  C_FULL:SQLITE_SY
19ef0 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66  NC_NORMAL);.  if
19f00 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
19f10 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53   ) pPager->needS
19f20 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69  ync = 0;.}.#endi
19f30 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
19f40 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
19f50 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
19f60 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  ented whenever t
19f70 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74  he library.** at
19f80 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61  tempts to open a
19f90 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
19fa0 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
19fb0 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  on is used for.*
19fc0 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  * testing and an
19fd0 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a  alysis only.  .*
19fe0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
19ff0 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
1a000 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20  _opentemp_count 
1a010 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
1a020 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
1a030 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ary file..**.** 
1a040 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
1a050 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
1a060 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51  pFile. Return SQ
1a070 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
1a080 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ss .** or some o
1a090 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
1a0a0 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20  if we fail. The 
1a0b0 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
1a0c0 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65  cally .** delete
1a0d0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
1a0e0 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63  ile when it is c
1a0f0 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  losed..**.** The
1a100 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f   flags passed to
1a110 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78   the VFS layer x
1a120 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20  Open() call are 
1a130 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a  those specified.
1a140 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ** by parameter 
1a150 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69  vfsFlags ORed wi
1a160 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
1a170 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
1a180 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1a190 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
1a1a0 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20  OPEN_CREATE.**  
1a1b0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
1a1c0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20  XCLUSIVE.**     
1a1d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
1a1e0 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61  TEONCLOSE.*/.sta
1a1f0 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65  tic int pagerOpe
1a200 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a  ntemp(.  Pager *
1a210 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f  pPager,        /
1a220 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65  * The pager obje
1a230 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ct */.  sqlite3_
1a240 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a  file *pFile,  /*
1a250 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
1a260 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20  descriptor here 
1a270 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
1a280 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  s          /* Fl
1a290 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
1a2a0 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f  gh to the VFS */
1a2b0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
1a2c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1a2d0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23  eturn code */..#
1a2e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1a2f0 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  T.  sqlite3_open
1a300 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f  temp_count++;  /
1a310 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69  * Used for testi
1a320 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
1a330 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  only */.#endif..
1a340 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53    vfsFlags |=  S
1a350 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1a360 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
1a370 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
1a380 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1a390 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20  PEN_EXCLUSIVE | 
1a3a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
1a3b0 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20  TEONCLOSE;.  rc 
1a3c0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
1a3d0 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c  pPager->pVfs, 0,
1a3e0 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73   pFile, vfsFlags
1a3f0 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
1a400 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
1a410 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29   isOpen(pFile) )
1a420 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1a430 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1a440 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e  busy handler fun
1a450 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
1a460 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74   pager invokes t
1a470 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
1a480 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  if sqlite3OsLock
1a490 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  () returns .** S
1a4a0 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20  QLITE_BUSY when 
1a4b0 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
1a4c0 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74  e from no-lock t
1a4d0 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  o a SHARED lock,
1a4e0 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69  .** or when tryi
1a4f0 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ng to upgrade fr
1a500 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  om a RESERVED lo
1a510 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ck to an EXCLUSI
1a520 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20  VE .** lock. It 
1a530 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b  does *not* invok
1a540 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
1a550 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  er when upgradin
1a560 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44  g from.** SHARED
1a570 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72   to RESERVED, or
1a580 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
1a590 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45  from SHARED to E
1a5a0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69  XCLUSIVE.** (whi
1a5b0 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  ch occurs during
1a5c0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
1a5d0 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a  lback). Summary:
1a5e0 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74  .**.**   Transit
1a5f0 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ion             
1a600 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76             | Inv
1a610 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65  okes xBusyHandle
1a620 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  r.**   ---------
1a630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1a660 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20  **   NO_LOCK    
1a670 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43     -> SHARED_LOC
1a680 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20  K      | Yes.** 
1a690 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
1a6a0 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  -> RESERVED_LOCK
1a6b0 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48      | No.**   SH
1a6c0 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45  ARED_LOCK   -> E
1a6d0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
1a6e0 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56  | No.**   RESERV
1a6f0 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55  ED_LOCK -> EXCLU
1a700 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65  SIVE_LOCK   | Ye
1a710 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  s.**.** If the b
1a720 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
1a730 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e  back returns non
1a740 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
1a750 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20  is .** retried. 
1a760 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  If it returns ze
1a770 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c  ro, then the SQL
1a780 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69  ITE_BUSY error i
1a790 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f  s.** returned to
1a7a0 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74   the caller of t
1a7b0 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e  he pager API fun
1a7c0 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
1a7d0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
1a7e0 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67  syhandler(.  Pag
1a7f0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
1a800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a810 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
1a820 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  t */.  int (*xBu
1a830 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20  syHandler)(void 
1a840 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  *),         /* P
1a850 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68  ointer to busy-h
1a860 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
1a870 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
1a880 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20  HandlerArg      
1a890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
1a8a0 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f  ument to pass to
1a8b0 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f   xBusyHandler */
1a8c0 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72 2d 3e  .){  .  pPager->
1a8d0 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78  xBusyHandler = x
1a8e0 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70  BusyHandler;.  p
1a8f0 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
1a900 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61  lerArg = pBusyHa
1a910 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a  ndlerArg;.}../*.
1a920 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75  ** Report the cu
1a930 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20  rrent page size 
1a940 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  and number of re
1a950 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63  served bytes bac
1a960 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65  k.** to the code
1a970 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  c..*/.#ifdef SQL
1a980 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74  ITE_HAS_CODEC.st
1a990 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52  atic void pagerR
1a9a0 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20  eportSize(Pager 
1a9b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
1a9c0 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
1a9d0 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50  zeChng ){.    pP
1a9e0 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
1a9f0 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f  Chng(pPager->pCo
1aa00 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  dec, pPager->pag
1aa10 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
1aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa30 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e    (int)pPager->n
1aa40 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a  Reserve);.  }.}.
1aa50 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
1aa60 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58  agerReportSize(X
1aa70 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69  )     /* No-op i
1aa80 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  f we do not supp
1aa90 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23  ort a codec */.#
1aaa0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  endif../*.** Cha
1aab0 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a  nge the page siz
1aac0 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61  e used by the Pa
1aad0 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20  ger object. The 
1aae0 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a  new page size .*
1aaf0 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a  * is passed in *
1ab00 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
1ab10 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
1ab20 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
1ab30 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
1ab40 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1ab50 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  , it.** is a no-
1ab60 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  op. The value re
1ab70 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72  turned is the er
1ab80 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
1ab90 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f  code (i.e. .** o
1aba0 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45  ne of SQLITE_IOE
1abb0 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
1abc0 50 54 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  PT or SQLITE_FUL
1abd0 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  L)..**.** Otherw
1abe0 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74  ise, if all of t
1abf0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
1ac00 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   true:.**.**   *
1ac10 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   the new page si
1ac20 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50  ze (value of *pP
1ac30 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69  ageSize) is vali
1ac40 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20  d (a power .**  
1ac50 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65     of two betwee
1ac60 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45  n 512 and SQLITE
1ac70 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20  _MAX_PAGE_SIZE, 
1ac80 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a  inclusive), and.
1ac90 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20  **.**   * there 
1aca0 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
1acb0 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
1acc0 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  es, and.**.**   
1acd0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
1ace0 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20  s either not an 
1acf0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1ad00 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20  se or it is.**  
1ad10 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20     an in-memory 
1ad20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75  database that cu
1ad30 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73  rrently consists
1ad40 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a   of zero pages..
1ad50 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70  **.** then the p
1ad60 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65  ager object page
1ad70 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
1ad80 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
1ad90 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
1ada0 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74  ze is changed, t
1adb0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1adc0 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61  n uses sqlite3Pa
1add0 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20  gerMalloc() .** 
1ade0 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20  to obtain a new 
1adf0 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
1ae00 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20  buffer. If this 
1ae10 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
1ae20 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  pt .** fails, SQ
1ae30 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
1ae40 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70  turned and the p
1ae50 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73  age size remains
1ae60 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20   unchanged. .** 
1ae70 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73  In all other cas
1ae80 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  es, SQLITE_OK is
1ae90 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
1aea0 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
1aeb0 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64  e is not changed
1aec0 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  , either because
1aed0 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d   one of the enum
1aee0 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74  erated.** condit
1aef0 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f  ions above is no
1af00 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65  t true, the page
1af10 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73  r was in error s
1af20 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
1af30 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  * function was c
1af40 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73  alled, or becaus
1af50 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  e the memory all
1af60 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
1af70 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e  failed, .** then
1af80 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73   *pPageSize is s
1af90 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72  et to the old, r
1afa0 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a  etained page siz
1afb0 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
1afc0 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
1afd0 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
1afe0 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
1aff0 2c 20 75 31 36 20 2a 70 50 61 67 65 53 69 7a 65  , u16 *pPageSize
1b000 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b  , int nReserve){
1b010 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67  .  int rc = pPag
1b020 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
1b030 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b040 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67  K ){.    u16 pag
1b050 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69  eSize = *pPageSi
1b060 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ze;.    assert( 
1b070 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28  pageSize==0 || (
1b080 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
1b090 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
1b0a0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
1b0b0 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61   );.    if( (pPa
1b0c0 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c  ger->memDb==0 ||
1b0d0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
1b0e0 3d 30 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69  =0).     && sqli
1b0f0 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
1b100 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
1b110 65 29 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70  e)==0 .     && p
1b120 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53  ageSize && pageS
1b130 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70 61 67  ize!=pPager->pag
1b140 65 53 69 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20  eSize .    ){.  
1b150 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d      char *pNew =
1b160 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1b170 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53  PageMalloc(pageS
1b180 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
1b190 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20  !pNew ){.       
1b1a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1b1b0 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
1b1c0 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
1b1d0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1b1e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
1b1f0 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
1b200 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
1b210 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65  e3PageFree(pPage
1b220 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
1b230 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
1b240 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b  TmpSpace = pNew;
1b250 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b260 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a  PcacheSetPageSiz
1b270 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
1b280 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  e, pageSize);.  
1b290 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1b2a0 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 28 75 31  *pPageSize = (u1
1b2b0 36 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  6)pPager->pageSi
1b2c0 7a 65 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 73  ze;.    if( nRes
1b2d0 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76  erve<0 ) nReserv
1b2e0 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73  e = pPager->nRes
1b2f0 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
1b300 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26  ( nReserve>=0 &&
1b310 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20 29   nReserve<1000 )
1b320 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
1b330 65 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52  eserve = (i16)nR
1b340 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65  eserve;.    page
1b350 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
1b360 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
1b370 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1b380 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1b390 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72  to the "temporar
1b3a0 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68  y page" buffer h
1b3b0 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  eld internally.*
1b3c0 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20  * by the pager. 
1b3d0 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65   This is a buffe
1b3e0 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e  r that is big en
1b3f0 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
1b400 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  .** entire conte
1b410 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  nt of a database
1b420 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66   page.  This buf
1b430 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65  fer is used inte
1b440 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67  rnally.** during
1b450 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69   rollback and wi
1b460 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ll be overwritte
1b470 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c  n whenever a rol
1b480 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e  lback.** occurs.
1b490 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75    But other modu
1b4a0 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20  les are free to 
1b4b0 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c  use it too, as l
1b4c0 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c  ong as.** no rol
1b4d0 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65  lbacks are happe
1b4e0 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ning..*/.void *s
1b4f0 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
1b500 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67  pace(Pager *pPag
1b510 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
1b520 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
1b530 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
1b540 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78  t to set the max
1b550 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61  imum database pa
1b560 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61  ge count if mxPa
1b570 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20  ge is positive. 
1b580 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e  .** Make no chan
1b590 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73  ges if mxPage is
1b5a0 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76   zero or negativ
1b5b0 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65  e.  And never re
1b5c0 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69  duce the.** maxi
1b5d0 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62  mum page count b
1b5e0 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74  elow the current
1b5f0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1b600 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67  abase..**.** Reg
1b610 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67  ardless of mxPag
1b620 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75  e, return the cu
1b630 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61  rrent maximum pa
1b640 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
1b650 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
1b660 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20  PageCount(Pager 
1b670 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
1b680 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67  age){.  int nPag
1b690 65 3b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  e;.  if( mxPage>
1b6a0 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
1b6b0 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65  >mxPgno = mxPage
1b6c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
1b6d0 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
1b6e0 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73  _UNLOCK ){.    s
1b6f0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1b700 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
1b710 61 67 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  age);.    assert
1b720 28 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  ( pPager->mxPgno
1b730 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 7d 0a 20  >=nPage );.  }. 
1b740 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1b750 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
1b760 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
1b770 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
1b780 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
1b790 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
1b7a0 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
1b7b0 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
1b7c0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
1b7d0 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
1b7e0 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
1b7f0 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
1b800 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
1b810 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
1b820 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
1b830 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
1b840 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
1b850 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
1b860 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
1b870 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
1b880 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
1b890 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
1b8a0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
1b8b0 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
1b8c0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
1b8d0 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
1b8e0 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
1b8f0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
1b900 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
1b910 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
1b920 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
1b930 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
1b940 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
1b950 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
1b960 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
1b970 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
1b980 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
1b990 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
1b9a0 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
1b9b0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
1b9c0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
1b9d0 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
1b9e0 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
1b9f0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
1ba00 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1ba10 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
1ba20 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
1ba30 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1ba40 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
1ba50 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
1ba60 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
1ba70 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77  * If the pager w
1ba80 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74  as opened on a t
1ba90 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a  ransient file (z
1baa0 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f  Filename==""), o
1bab0 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r.** opened on a
1bac0 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20   file less than 
1bad0 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  N bytes in size,
1bae0 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
1baf0 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20  er is.** zeroed 
1bb00 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
1bb10 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69  turned. The rati
1bb20 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69  onale for this i
1bb30 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20  s that this .** 
1bb40 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1bb50 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73   to read databas
1bb60 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61  e headers, and a
1bb70 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f   new transient o
1bb80 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20  r.** zero sized 
1bb90 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68  database has a h
1bba0 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69  eader than consi
1bbb0 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
1bbc0 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  zeroes..**.** If
1bbd0 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70   any IO error ap
1bbe0 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  art from SQLITE_
1bbf0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
1bc00 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
1bc10 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f  .** the error co
1bc20 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
1bc30 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64  o the caller and
1bc40 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1bc50 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62   the.** output b
1bc60 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e  uffer undefined.
1bc70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1bc80 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
1bc90 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
1bca0 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
1bcb0 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
1bcc0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1bcd0 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
1bce0 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61  Dest, 0, N);.  a
1bcf0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1bd00 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
1bd10 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
1bd20 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
1bd30 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
1bd40 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65  ed by btree imme
1bd50 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63 72  diately after cr
1bd60 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  eating.  ** the 
1bd70 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54  Pager object.  T
1bd80 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65  here has not bee
1bd90 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  n an opportunity
1bda0 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20   to transition. 
1bdb0 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20   ** to WAL mode 
1bdc0 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  yet..  */.  asse
1bdd0 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
1bde0 28 70 50 61 67 65 72 29 20 29 3b 0a 23 69 66 20  (pPager) );.#if 
1bdf0 30 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  0.  if( pagerUse
1be00 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
1be10 20 20 20 69 6e 74 20 69 73 49 6e 57 61 6c 20 3d     int isInWal =
1be20 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
1be30 69 74 65 33 57 61 6c 52 65 61 64 28 70 50 61 67  ite3WalRead(pPag
1be40 65 72 2d 3e 70 57 61 6c 2c 20 31 2c 20 26 69 73  er->pWal, 1, &is
1be50 49 6e 57 61 6c 2c 20 4e 2c 20 70 44 65 73 74 29  InWal, N, pDest)
1be60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1be70 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 49 6e 57  LITE_OK || isInW
1be80 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  al ){.      retu
1be90 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
1bea0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 69  .#endif..  if( i
1beb0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1bec0 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  ) ){.    IOTRACE
1bed0 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64  (("DBHDR %p 0 %d
1bee0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29  \n", pPager, N))
1bef0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1bf00 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
1bf10 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29  fd, pDest, N, 0)
1bf20 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1bf30 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1bf40 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
1bf50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1bf60 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1bf70 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1bf80 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
1bf90 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1bfa0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1bfb0 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  file associated 
1bfc0 0a 2a 2a 20 77 69 74 68 20 70 50 61 67 65 72 2e  .** with pPager.
1bfd0 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20   Normally, this 
1bfe0 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73  is calculated as
1bff0 20 28 3c 64 62 20 66 69 6c 65 20 73 69 7a 65 3e   (<db file size>
1c000 2f 3c 70 61 67 65 2d 73 69 7a 65 3e 29 2e 0a 2a  /<page-size>)..*
1c010 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  * However, if th
1c020 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65  e file is betwee
1c030 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69  n 1 and <page-si
1c040 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ze> bytes in siz
1c050 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73  e, then .** this
1c060 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
1c070 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2a   1 page file..**
1c080 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
1c090 20 69 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61   is in error sta
1c0a0 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
1c0b0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
1c0c0 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 65 72 72   then the.** err
1c0d0 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
1c0e0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
1c0f0 61 6e 64 20 2a 70 6e 50 61 67 65 20 6c 65 66 74  and *pnPage left
1c100 20 75 6e 63 68 61 6e 67 65 64 2e 20 4f 72 2c 0a   unchanged. Or,.
1c110 2a 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 73  ** if the file s
1c120 79 73 74 65 6d 20 68 61 73 20 74 6f 20 62 65 20  ystem has to be 
1c130 71 75 65 72 69 65 64 20 66 6f 72 20 74 68 65 20  queried for the 
1c140 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1c150 20 61 6e 64 0a 2a 2a 20 74 68 65 20 71 75 65 72   and.** the quer
1c160 79 20 61 74 74 65 6d 70 74 20 72 65 74 75 72 6e  y attempt return
1c170 73 20 61 6e 20 49 4f 20 65 72 72 6f 72 2c 20 74  s an IO error, t
1c180 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
1c190 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
1c1a0 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c  and *pnPage is l
1c1b0 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
1c1c0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1c1d0 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
1c1e0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65   successful, the
1c1f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  n SQLITE_OK is r
1c200 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a  eturned.** and *
1c210 70 6e 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  pnPage is set to
1c220 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1c230 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
1c240 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  base..*/.int sql
1c250 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1c260 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
1c270 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a  , int *pnPage){.
1c280 20 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30    Pgno nPage = 0
1c290 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  ;           /* V
1c2a0 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76  alue to return v
1c2b0 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20  ia *pnPage */.. 
1c2c0 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68   /* Determine th
1c2d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1c2e0 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 53  s in the file. S
1c2f0 74 6f 72 65 20 74 68 69 73 20 69 6e 20 6e 50 61  tore this in nPa
1c300 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ge. */.  if( pPa
1c310 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
1c320 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20   ){.    nPage = 
1c330 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
1c340 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1c350 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1c360 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 72 65       /* Error re
1c370 74 75 72 6e 65 64 20 62 79 20 4f 73 46 69 6c 65  turned by OsFile
1c380 53 69 7a 65 28 29 20 2a 2f 0a 20 20 20 20 69 36  Size() */.    i6
1c390 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  4 n = 0;        
1c3a0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 73 69        /* File si
1c3b0 7a 65 20 69 6e 20 62 79 74 65 73 20 72 65 74 75  ze in bytes retu
1c3c0 72 6e 65 64 20 62 79 20 4f 73 46 69 6c 65 53 69  rned by OsFileSi
1c3d0 7a 65 28 29 20 2a 2f 0a 0a 20 20 20 20 69 66 28  ze() */..    if(
1c3e0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1c3f0 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e  ger) && pPager->
1c400 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
1c410 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  OCK ){.      sql
1c420 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70 50  ite3WalDbsize(pP
1c430 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 6e 50 61  ager->pWal, &nPa
1c440 67 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ge);.    }..    
1c450 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a  if( nPage==0 ){.
1c460 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
1c470 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1c480 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
1c490 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 69 66  File );.      if
1c4a0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1c4b0 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >fd) ){.        
1c4c0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
1c4d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1c4e0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
1c4f0 64 2c 20 26 6e 29 29 20 29 7b 0a 20 20 20 20 20  d, &n)) ){.     
1c500 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
1c510 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
1c520 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1c530 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
1c540 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
1c550 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e  >0 && n<pPager->
1c560 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
1c570 20 20 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20      nPage = 1;. 
1c580 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c590 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e      nPage = (Pgn
1c5a0 6f 29 28 6e 20 2f 20 70 50 61 67 65 72 2d 3e 70  o)(n / pPager->p
1c5b0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1c5c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1c5d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
1c5e0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
1c5f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
1c600 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
1c610 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
1c620 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  eSize = nPage;. 
1c630 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
1c640 69 7a 65 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  izeValid = 1;.  
1c650 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
1c660 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d   the current num
1c670 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1c680 74 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61  the file is grea
1c690 74 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ter than the .  
1c6a0 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61  ** configured ma
1c6b0 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62  ximum pager numb
1c6c0 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  er, increase the
1c6d0 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73   allowed limit s
1c6e0 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  o.  ** that the 
1c6f0 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64  file can be read
1c700 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61  ..  */.  if( nPa
1c710 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  ge>pPager->mxPgn
1c720 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
1c730 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29  >mxPgno = (Pgno)
1c740 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  nPage;.  }..  /*
1c750 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   Set the output 
1c760 76 61 72 69 61 62 6c 65 20 61 6e 64 20 72 65 74  variable and ret
1c770 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 2a 2f  urn SQLITE_OK */
1c780 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61  .  *pnPage = nPa
1c790 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ge;.  return SQL
1c7a0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
1c7b0 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
1c7c0 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c  a lock of type l
1c7d0 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64  ocktype on the d
1c7e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
1c7f0 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72  .** a similar or
1c800 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
1c810 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74   already held, t
1c820 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1c830 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75  a no-op.** (retu
1c840 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20  rning SQLITE_OK 
1c850 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a  immediately)..**
1c860 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
1c870 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e  ttempt to obtain
1c880 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
1c890 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e  sqlite3OsLock().
1c8a0 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20   Invoke .** the 
1c8b0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
1c8c0 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72   the lock is cur
1c8d0 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c  rently not avail
1c8e0 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a  able. Repeat .**
1c8f0 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
1c900 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
1c910 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
1c920 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a  the attempt to .
1c930 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  ** obtain the lo
1c940 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
1c950 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
1c960 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
1c970 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
1c980 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
1c990 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
1c9a0 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  . If the lock is
1c9b0 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73   obtained succes
1c9c0 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20  sfully, set the 
1c9d0 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20  Pager.state .** 
1c9e0 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  variable to lock
1c9f0 74 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75  type before retu
1ca00 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
1ca10 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
1ca20 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
1ca30 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
1ca40 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ype){.  int rc; 
1ca50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ca70 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
1ca80 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b    /* The OS lock
1ca90 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
1caa0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
1cab0 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65  Pager lock value
1cac0 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50  s */.  assert( P
1cad0 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41  AGER_SHARED==SHA
1cae0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
1caf0 73 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45  sert( PAGER_RESE
1cb00 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c  RVED==RESERVED_L
1cb10 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
1cb20 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
1cb30 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
1cb40 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
1cb50 20 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74   file is current
1cb60 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e  ly unlocked then
1cb70 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62   the size must b
1cb80 65 20 75 6e 6b 6e 6f 77 6e 2e 20 49 74 0a 20 20  e unknown. It.  
1cb90 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 68 61 76 65  ** must not have
1cba0 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61   been modified a
1cbb0 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20  t this point..  
1cbc0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
1cbd0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1cbe0 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67  R_SHARED || pPag
1cbf0 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d  er->dbSizeValid=
1cc00 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1cc10 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1cc20 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70  AGER_SHARED || p
1cc30 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
1cc40 64 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  d==0 );..  /* Ch
1cc50 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73  eck that this is
1cc60 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20   either a no-op 
1cc70 28 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71  (because the req
1cc80 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a  uested lock is .
1cc90 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c    ** already hel
1cca0 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  d, or one of the
1ccb0 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68   transistions th
1ccc0 61 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  at the busy-hand
1ccd0 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  ler.  ** may be 
1cce0 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20  invoked during, 
1ccf0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
1cd00 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20   comment above. 
1cd10 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
1cd20 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29  SetBusyhandler()
1cd30 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1cd40 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e   (pPager->state>
1cd50 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20  =locktype).     
1cd60 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73 74    || (pPager->st
1cd70 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
1cd80 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50  K && locktype==P
1cd90 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20  AGER_SHARED).   
1cda0 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
1cdb0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
1cdc0 45 52 56 45 44 20 26 26 20 6c 6f 63 6b 74 79 70  ERVED && locktyp
1cdd0 65 3d 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e==PAGER_EXCLUSI
1cde0 56 45 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20  VE).  );..  if( 
1cdf0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c  pPager->state>=l
1ce00 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
1ce10 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1ce20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b   }else{.    do {
1ce30 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1ce40 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
1ce50 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b  ->fd, locktype);
1ce60 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
1ce70 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
1ce80 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
1ce90 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
1cea0 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b  syHandlerArg) );
1ceb0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1cec0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ced0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1cee0 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  (u8)locktype;.  
1cef0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f      IOTRACE(("LO
1cf00 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
1cf10 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a  ger, locktype)).
1cf20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1cf30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1cf40 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54  Function assertT
1cf50 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
1cf60 74 28 70 50 61 67 65 72 29 20 63 68 65 63 6b 73  t(pPager) checks
1cf70 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
1cf80 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   .** following i
1cf90 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64  s true for all d
1cfa0 69 72 74 79 20 70 61 67 65 73 20 63 75 72 72 65  irty pages curre
1cfb0 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65  ntly in the page
1cfc0 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  -cache:.**.**   
1cfd0 61 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  a) The page numb
1cfe0 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  er is less than 
1cff0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
1d000 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  size of the .** 
1d010 20 20 20 20 20 63 75 72 72 65 6e 74 20 64 61 74       current dat
1d020 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20  abase image, in 
1d030 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20  pages, OR.**.** 
1d040 20 20 62 29 20 69 66 20 74 68 65 20 70 61 67 65    b) if the page
1d050 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72   content were wr
1d060 69 74 74 65 6e 20 61 74 20 74 68 69 73 20 74 69  itten at this ti
1d070 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74  me, it would not
1d080 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65  .**      be nece
1d090 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74  ssary to write t
1d0a0 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
1d0b0 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75  nt out to the su
1d0c0 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  b-journal.**    
1d0d0 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64    (as determined
1d0e0 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62   by function sub
1d0f0 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29 29  jRequiresPage())
1d100 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
1d110 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65  ondition asserte
1d120 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
1d130 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65  on were not true
1d140 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72  , and the.** dir
1d150 74 79 20 70 61 67 65 20 77 65 72 65 20 74 6f 20  ty page were to 
1d160 62 65 20 64 69 73 63 61 72 64 65 64 20 66 72 6f  be discarded fro
1d170 6d 20 74 68 65 20 63 61 63 68 65 20 76 69 61 20  m the cache via 
1d180 74 68 65 20 70 61 67 65 72 53 74 72 65 73 73 28  the pagerStress(
1d190 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61  ).** routine, pa
1d1a0 67 65 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c  gerStress() woul
1d1b0 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20  d not write the 
1d1c0 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
1d1d0 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64  tent to.** the d
1d1e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
1d1f0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61   a savepoint tra
1d200 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f  nsaction were ro
1d210 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a  lled back after.
1d220 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65 64  ** this happened
1d230 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  , the correct be
1d240 68 61 76 69 6f 75 72 20 77 6f 75 6c 64 20 62 65  haviour would be
1d250 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
1d260 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65  current.** conte
1d270 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  nt of the page. 
1d280 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74  However, since t
1d290 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  his content is n
1d2a0 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69  ot present in ei
1d2b0 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61  ther.** the data
1d2c0 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65  base file or the
1d2d0 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
1d2e0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1d2f0 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75   and .** sub-jou
1d300 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b  rnal rolled back
1d310 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75   the content cou
1d320 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72  ld not be restor
1d330 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61  ed and the.** da
1d340 74 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75  tabase image wou
1d350 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70  ld become corrup
1d360 74 2e 20 49 74 20 69 73 20 74 68 65 72 65 66 6f  t. It is therefo
1d370 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61  re fortunate tha
1d380 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75  t .** this circu
1d390 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61  mstance cannot a
1d3a0 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  rise..*/.#if def
1d3b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
1d3c0 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  G).static void a
1d3d0 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
1d3e0 73 74 72 61 69 6e 74 43 62 28 50 67 48 64 72 20  straintCb(PgHdr 
1d3f0 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28  *pPg){.  assert(
1d400 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
1d410 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73  R_DIRTY );.  ass
1d420 65 72 74 28 20 21 73 75 62 6a 52 65 71 75 69 72  ert( !subjRequir
1d430 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70  esPage(pPg) || p
1d440 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70  Pg->pgno<=pPg->p
1d450 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b  Pager->dbSize );
1d460 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  .}.static void a
1d470 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
1d480 73 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70  straint(Pager *p
1d490 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
1d4a0 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69  3PcacheIterateDi
1d4b0 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
1d4c0 63 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63  che, assertTrunc
1d4d0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29  ateConstraintCb)
1d4e0 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
1d4f0 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  ne assertTruncat
1d500 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
1d510 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  er).#endif../*.*
1d520 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 69  * Truncate the i
1d530 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1d540 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20  e file image to 
1d550 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 69  nPage pages. Thi
1d560 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64  s .** function d
1d570 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  oes not actually
1d580 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
1d590 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
1d5a0 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73  k. It .** just s
1d5b0 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ets the internal
1d5c0 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
1d5d0 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68  ger object so th
1d5e0 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63  at the .** trunc
1d5f0 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f  ation will be do
1d600 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ne when the curr
1d610 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1d620 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f  is committed..*/
1d630 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
1d640 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
1d650 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1d660 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73  gno nPage){.  as
1d670 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
1d680 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 61  SizeValid );.  a
1d690 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
1d6a0 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a  bSize>=nPage );.
1d6b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1d6c0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
1d6d0 45 53 45 52 56 45 44 20 29 3b 0a 20 20 70 50 61  ESERVED );.  pPa
1d6e0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
1d6f0 61 67 65 3b 0a 20 20 61 73 73 65 72 74 54 72 75  age;.  assertTru
1d700 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
1d710 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  pPager);.}.../*.
1d720 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1d730 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   is called befor
1d740 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68  e attempting a h
1d750 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1d760 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73  ack. It.** syncs
1d770 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1d780 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20  e to disk, then 
1d790 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75  sets pPager->jou
1d7a0 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a  rnalHdr to the.*
1d7b0 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * size of the jo
1d7c0 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68  urnal file so th
1d7d0 61 74 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61  at the pager_pla
1d7e0 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  yback() routine 
1d7f0 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68  knows.** that th
1d800 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
1d810 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73   file has been s
1d820 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e  ynced..**.** Syn
1d830 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  cing a hot-journ
1d840 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72  al to disk befor
1d850 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  e attempting to 
1d860 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73  roll it back ens
1d870 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66  ures .** that if
1d880 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65   a power-failure
1d890 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
1d8a0 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  he rollback, the
1d8b0 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a   process that.**
1d8c0 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61   attempts rollba
1d8d0 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73  ck following sys
1d8e0 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65  tem recovery see
1d8f0 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e  s the same journ
1d900 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73  al.** content as
1d910 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a   this process..*
1d920 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
1d930 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e  ng goes as plann
1d940 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ed, SQLITE_OK is
1d950 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
1d960 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c  wise, .** an SQL
1d970 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
1d980 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1d990 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
1d9a0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
1d9b0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1d9c0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70  ITE_OK;.  if( !p
1d9d0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
1d9e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1d9f0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
1da00 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
1da10 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20  _NORMAL);.  }.  
1da20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1da30 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1da40 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
1da50 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
1da60 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1da70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1da80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  rc;.}../*.** Shu
1da90 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
1daa0 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
1dab0 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
1dac0 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
1dad0 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
1dae0 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
1daf0 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
1db00 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
1db10 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
1db20 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
1db30 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
1db40 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
1db50 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
1db60 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
1db70 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
1db80 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
1db90 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
1dba0 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
1dbb0 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
1dbc0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1dbd0 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
1dbe0 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
1dbf0 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  redump..**.** Th
1dc00 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
1dc10 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20  ys succeeds. If 
1dc20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1dc30 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d   active an attem
1dc40 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f  pt.** is made to
1dc50 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49   roll it back. I
1dc60 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1dc70 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
1dc80 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20  lback .** a hot 
1dc90 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c  journal may be l
1dca0 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73  eft in the files
1dcb0 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72  ystem but no err
1dcc0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  or is returned.*
1dcd0 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  * to the caller.
1dce0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1dcf0 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20  agerClose(Pager 
1dd00 2a 70 50 61 67 65 72 29 7b 0a 20 20 75 38 20 2a  *pPager){.  u8 *
1dd10 70 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50 61  pTmp = (u8 *)pPa
1dd20 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
1dd30 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
1dd40 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
1dd50 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
1dd60 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
1dd70 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
1dd80 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
1dd90 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
1dda0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
1ddb0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71  TE_OMIT_WAL.  sq
1ddc0 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50  lite3WalClose(pP
1ddd0 61 67 65 72 2d 3e 70 57 61 6c 2c 0a 20 20 20 20  ager->pWal,.    
1dde0 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  (pPager->noSync 
1ddf0 3f 20 30 20 3a 20 70 50 61 67 65 72 2d 3e 73 79  ? 0 : pPager->sy
1de00 6e 63 5f 66 6c 61 67 73 29 2c 20 0a 20 20 20 20  nc_flags), .    
1de10 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1de20 2c 20 70 54 6d 70 0a 20 20 29 3b 0a 20 20 70 50  , pTmp.  );.  pP
1de30 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a  ager->pWal = 0;.
1de40 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72  #endif.  pager_r
1de50 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1de60 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1de70 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
1de80 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
1de90 20 20 20 20 2f 2a 20 53 65 74 20 50 61 67 65 72      /* Set Pager
1dea0 2e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 2d  .journalHdr to -
1deb0 31 20 66 6f 72 20 74 68 65 20 62 65 6e 65 66 69  1 for the benefi
1dec0 74 20 6f 66 20 74 68 65 20 70 61 67 65 72 5f 70  t of the pager_p
1ded0 6c 61 79 62 61 63 6b 28 29 20 0a 20 20 20 20 2a  layback() .    *
1dee0 2a 20 63 61 6c 6c 20 77 68 69 63 68 20 6d 61 79  * call which may
1def0 20 62 65 20 6d 61 64 65 20 66 72 6f 6d 20 77 69   be made from wi
1df00 74 68 69 6e 20 70 61 67 65 72 55 6e 6c 6f 63 6b  thin pagerUnlock
1df10 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 49  AndRollback(). I
1df20 66 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e  f it.    ** is n
1df30 6f 74 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20  ot -1, then the 
1df40 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
1df50 20 6f 66 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72   of an open jour
1df60 6e 61 6c 20 66 69 6c 65 20 6d 61 79 0a 20 20 20  nal file may.   
1df70 20 2a 2a 20 62 65 20 70 6c 61 79 65 64 20 62 61   ** be played ba
1df80 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
1df90 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72  base. If a power
1dfa0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
1dfb0 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69  while.    ** thi
1dfc0 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20  s is happening, 
1dfd0 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79  the database may
1dfe0 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e   become corrupt.
1dff0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1e000 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
1e010 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61  fd) ){.      pPa
1e020 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70  ger->errCode = p
1e030 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
1e040 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
1e050 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  }.    pagerUnloc
1e060 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
1e070 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
1e080 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
1e090 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73  oc();.  enable_s
1e0a0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
1e0b0 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41  rs();.  PAGERTRA
1e0c0 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE(("CLOSE %d\n"
1e0d0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1e0e0 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  )));.  IOTRACE((
1e0f0 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
1e100 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33  ager)).  sqlite3
1e110 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
1e120 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  jfd);.  sqlite3O
1e130 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
1e140 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  d);.  sqlite3Pag
1e150 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73  eFree(pTmp);.  s
1e160 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73  qlite3PcacheClos
1e170 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
1e180 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  e);..#ifdef SQLI
1e190 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
1e1a0 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
1e1b0 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e  cFree ) pPager->
1e1c0 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65  xCodecFree(pPage
1e1d0 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64  r->pCodec);.#end
1e1e0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  if..  assert( !p
1e1f0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
1e200 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49  t && !pPager->pI
1e210 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  nJournal );.  as
1e220 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
1e230 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69  ager->jfd) && !i
1e240 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
1e250 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  fd) );..  sqlite
1e260 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
1e270 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e280 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  OK;.}..#if !defi
1e290 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64  ned(NDEBUG) || d
1e2a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
1e2b0 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
1e2c0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1e2d0 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
1e2e0 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
1e2f0 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62  gerPagenumber(Db
1e300 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
1e310 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  turn pPg->pgno;.
1e320 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1e330 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
1e340 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
1e350 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76  r page pPg..*/.v
1e360 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
1e370 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  Ref(DbPage *pPg)
1e380 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
1e390 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  eRef(pPg);.}../*
1e3a0 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
1e3b0 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77  rnal. In other w
1e3c0 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  ords, make sure 
1e3d0 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68  all the pages th
1e3e0 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  at have.** been 
1e3f0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
1e400 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75  ournal have actu
1e410 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65  ally reached the
1e420 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a   surface of the.
1e430 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20  ** disk and can 
1e440 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74  be restored in t
1e450 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f  he event of a ho
1e460 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
1e470 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
1e480 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
1e490 66 6c 61 67 20 69 73 20 6e 6f 74 20 73 65 74 2c  flag is not set,
1e4a0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
1e4b0 69 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f  ion is a.** no-o
1e4c0 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  p. Otherwise, th
1e4d0 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72  e actions requir
1e4e0 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65  ed depend on the
1e4f0 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 0a 2a 2a   journal-mode.**
1e500 20 61 6e 64 20 74 68 65 20 64 65 76 69 63 65 20   and the device 
1e510 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1e520 6f 66 20 74 68 65 20 74 68 65 20 66 69 6c 65 2d  of the the file-
1e530 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f  system, as follo
1e540 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ws:.**.**   * If
1e550 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1e560 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  e is an in-memor
1e570 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  y journal file, 
1e580 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a  no action need.*
1e590 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a  *     be taken..
1e5a0 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77  **.**   * Otherw
1e5b0 69 73 65 2c 20 69 66 20 74 68 65 20 64 65 76 69  ise, if the devi
1e5c0 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ce does not supp
1e5d0 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41 50 50  ort the SAFE_APP
1e5e0 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a  END property,.**
1e5f0 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52       then the nR
1e600 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ec field of the 
1e610 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72  most recently wr
1e620 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65  itten journal he
1e630 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75  ader.**     is u
1e640 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69  pdated to contai
1e650 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1e660 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20  journal records 
1e670 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20  that have.**    
1e680 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f   been written fo
1e690 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74  llowing it. If t
1e6a0 68 65 20 70 61 67 65 72 20 69 73 20 6f 70 65 72  he pager is oper
1e6b0 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79  ating in full-sy
1e6c0 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20  nc.**     mode, 
1e6d0 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1e6e0 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20   file is synced 
1e6f0 62 65 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c  before this fiel
1e700 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a  d is updated..**
1e710 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64  .**   * If the d
1e720 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73  evice does not s
1e730 75 70 70 6f 72 74 20 74 68 65 20 53 45 51 55 45  upport the SEQUE
1e740 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20  NTIAL property, 
1e750 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75  then .**     jou
1e760 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e  rnal file is syn
1e770 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  ced..**.** Or, i
1e780 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a  n pseudo-code:.*
1e790 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c  *.**   if( NOT <
1e7a0 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
1e7b0 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28  l> ){.**     if(
1e7c0 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44   NOT SAFE_APPEND
1e7d0 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28   ){.**       if(
1e7e0 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65   <full-sync mode
1e7f0 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e  > ) xSync(<journ
1e800 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20  al file>);.**   
1e810 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63      <update nRec
1e820 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d   field>.**     }
1e830 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54   .**     if( NOT
1e840 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53   SEQUENTIAL ) xS
1e850 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c  ync(<journal fil
1e860 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a  e>);.**   }.**.*
1e870 2a 20 54 68 65 20 50 61 67 65 72 2e 6e 65 65 64  * The Pager.need
1e880 53 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 65 76  Sync flag is nev
1e890 65 72 20 62 65 20 73 65 74 20 66 6f 72 20 74 65  er be set for te
1e8a0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 6f  mporary files, o
1e8b0 72 20 61 6e 79 0a 2a 2a 20 66 69 6c 65 20 6f 70  r any.** file op
1e8c0 65 72 61 74 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  erating in no-sy
1e8d0 6e 63 20 6d 6f 64 65 20 28 50 61 67 65 72 2e 6e  nc mode (Pager.n
1e8e0 6f 53 79 6e 63 20 73 65 74 20 74 6f 20 6e 6f 6e  oSync set to non
1e8f0 2d 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  -zero)..**.** If
1e900 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69   successful, thi
1e910 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
1e920 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
1e930 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65  SYNC flag of eve
1e940 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72  ry .** page curr
1e950 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65  ently held in me
1e960 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75  mory before retu
1e970 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e  rning SQLITE_OK.
1e980 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72   If an IO.** err
1e990 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
1e9a0 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  d, then the IO e
1e9b0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1e9c0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
1e9d0 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ler..*/.static i
1e9e0 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
1e9f0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1ea00 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65   if( pPager->nee
1ea10 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73  dSync ){.    ass
1ea20 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
1ea30 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66  mpFile );.    if
1ea40 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1ea50 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
1ea60 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
1ea70 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  ){.      int rc;
1ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eaa0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1eab0 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
1eac0 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
1ead0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1eae0 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
1eaf0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1eb00 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
1eb10 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  fd) );..      if
1eb20 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
1eb30 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
1eb40 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ND) ){.        /
1eb50 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61  * This block dea
1eb60 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75  ls with an obscu
1eb70 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74  re problem. If t
1eb80 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69  he last connecti
1eb90 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  on.        ** th
1eba0 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73  at wrote to this
1ebb0 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70   database was op
1ebc0 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69  erating in persi
1ebd0 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20  stent-journal.  
1ebe0 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74        ** mode, t
1ebf0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1ec00 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73  file may at this
1ec10 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20   point actually 
1ec20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20  be larger.      
1ec30 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
1ec40 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73  journalOff bytes
1ec50 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68  . If the next th
1ec60 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ing in the journ
1ec70 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  al.        ** fi
1ec80 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  le happens to be
1ec90 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65   a journal-heade
1eca0 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61  r (written as pa
1ecb0 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  rt of the.      
1ecc0 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f    ** previous co
1ecd0 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73  nnection's trans
1ece0 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63  action), and a c
1ecf0 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61  rash or power-fa
1ed00 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a  ilure .        *
1ed10 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e  * occurs after n
1ed20 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62  Rec is updated b
1ed30 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63  ut before this c
1ed40 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
1ed50 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79   .        ** any
1ed60 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68  thing else to th
1ed70 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
1ed80 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73  or commits/rolls
1ed90 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20   back its .     
1eda0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
1edb0 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20  n), then SQLite 
1edc0 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75  may become confu
1edd0 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74  sed when doing t
1ede0 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  he .        ** h
1edf0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1ee00 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65  ack following re
1ee10 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72  covery. It may r
1ee20 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20  oll back all.   
1ee30 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20       ** of this 
1ee40 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61  connections data
1ee50 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74  , then proceed t
1ee60 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74  o rolling back t
1ee70 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20  he old,.        
1ee80 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64  ** out-of-date d
1ee90 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ata that follows
1eea0 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f   it. Database co
1eeb0 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
1eec0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1eed0 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
1eee0 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72  his, if the jour
1eef0 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70  nal file does ap
1ef00 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a  pear to contain.
1ef10 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c          ** a val
1ef20 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77  id header follow
1ef30 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ing Pager.journa
1ef40 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65  lOff, then write
1ef50 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20   a 0x00.        
1ef60 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73  ** byte to the s
1ef70 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72  tart of it to pr
1ef80 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65  event it from be
1ef90 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a  ing recognized..
1efa0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1efb0 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69     ** Variable i
1efc0 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73  NextHdrOffset is
1efd0 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
1efe0 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73  et at which this
1eff0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  .        ** prob
1f000 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77  lematic header w
1f010 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74  ill occur, if it
1f020 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20   exists. aMagic 
1f030 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20  is used .       
1f040 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61   ** as a tempora
1f050 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73  ry buffer to ins
1f060 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63  pect the first c
1f070 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f  ouple of bytes o
1f080 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
1f090 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e   potential journ
1f0a0 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20  al header..     
1f0b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36     */.        i6
1f0c0 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  4 iNextHdrOffset
1f0d0 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61  ;.        u8 aMa
1f0e0 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20  gic[8];.        
1f0f0 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  u8 zHeader[sizeo
1f100 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
1f110 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65  +4];..        me
1f120 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
1f130 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
1f140 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
1f150 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  c));.        put
1f160 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
1f170 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
1f180 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e  agic)], pPager->
1f190 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20  nRec);..        
1f1a0 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d  iNextHdrOffset =
1f1b0 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
1f1c0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
1f1d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1f1e0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
1f1f0 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e  d, aMagic, 8, iN
1f200 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20  extHdrOffset);. 
1f210 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1f220 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d  QLITE_OK && 0==m
1f230 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
1f240 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
1f250 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
1f260 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72  tic const u8 zer
1f270 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  obyte = 0;.     
1f280 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f290 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
1f2a0 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c  >jfd, &zerobyte,
1f2b0 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73   1, iNextHdrOffs
1f2c0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
1f2d0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1f2e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
1f2f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1f300 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
1f310 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1f320 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1f330 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
1f340 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
1f350 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1f360 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
1f370 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
1f380 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
1f390 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
1f3a0 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
1f3b0 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
1f3c0 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
1f3d0 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
1f3e0 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
1f3f0 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
1f400 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
1f410 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
1f420 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
1f430 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1f440 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
1f450 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74  ot required if t
1f460 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
1f470 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65  dia supports the
1f480 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45  .        ** SAFE
1f490 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
1f4a0 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69  . Because in thi
1f4b0 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
1f4c0 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20   possible .     
1f4d0 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67     ** for garbag
1f4e0 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70  e data to be app
1f4f0 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c  ended to the fil
1f500 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  e, the nRec fiel
1f510 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  d.        ** is 
1f520 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30  populated with 0
1f530 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74  xFFFFFFFF when t
1f540 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
1f550 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20  r is written.   
1f560 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65       ** and neve
1f570 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  r needs to be up
1f580 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  dated..        *
1f590 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
1f5a0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
1f5b0 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
1f5c0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
1f5d0 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
1f5e0 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
1f5f0 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
1f600 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1f610 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  er)));.         
1f620 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
1f630 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
1f640 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1f650 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
1f660 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
1f670 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
1f680 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1f690 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1f6a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1f6b0 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41   }.        IOTRA
1f6c0 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
1f6d0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
1f6e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1f6f0 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
1f700 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
1f710 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
1f720 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65  ger->jfd, zHeade
1f730 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65  r, sizeof(zHeade
1f740 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r), pPager->jour
1f750 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29  nalHdr.        )
1f760 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1f770 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1f780 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1f790 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
1f7a0 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
1f7b0 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
1f7c0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
1f7d0 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E(("SYNC journal
1f7e0 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
1f7f0 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
1f800 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1f810 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
1f820 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63  ger)).        rc
1f830 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
1f840 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
1f850 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
1f860 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  | .          (pP
1f870 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
1f880 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
1f890 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44  LL?SQLITE_SYNC_D
1f8a0 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20  ATAONLY:0).     
1f8b0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
1f8c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f8d0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1f8e0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1f8f0 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  /* The journal f
1f900 69 6c 65 20 77 61 73 20 6a 75 73 74 20 73 75 63  ile was just suc
1f910 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64  cessfully synced
1f920 2e 20 53 65 74 20 50 61 67 65 72 2e 6e 65 65 64  . Set Pager.need
1f930 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 74 6f 20  Sync .    ** to 
1f940 7a 65 72 6f 20 61 6e 64 20 63 6c 65 61 72 20 74  zero and clear t
1f950 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
1f960 4e 43 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20 70  NC flag on all p
1f970 61 67 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  agess..    */.  
1f980 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
1f990 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  nc = 0;.    pPag
1f9a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
1f9b0 65 64 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  ed = 1;.    pPag
1f9c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
1f9d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1f9e0 4f 66 66 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Off;.    sqlite3
1f9f0 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46  PcacheClearSyncF
1fa00 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43  lags(pPager->pPC
1fa10 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  ache);.  }..  re
1fa20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1fa30 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67  }../*.** The arg
1fa40 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72  ument is the fir
1fa50 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c  st in a linked l
1fa60 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67  ist of dirty pag
1fa70 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20  es connected.** 
1fa80 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69  by the PgHdr.pDi
1fa90 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69  rty pointer. Thi
1faa0 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  s function write
1fab0 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68  s each one of th
1fac0 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  e.** in-memory p
1fad0 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ages in the list
1fae0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1faf0 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d   file. The argum
1fb00 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55  ent may.** be NU
1fb10 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67  LL, representing
1fb20 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20   an empty list. 
1fb30 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69  In this case thi
1fb40 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
1fb50 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
1fb60 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 68  The pager must h
1fb70 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20 52  old at least a R
1fb80 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65  ESERVED lock whe
1fb90 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  n this function.
1fba0 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65  ** is called. Be
1fbb0 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79  fore writing any
1fbc0 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  thing to the dat
1fbd0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73  abase file, this
1fbe0 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72   lock.** is upgr
1fbf0 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55  aded to an EXCLU
1fc00 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68  SIVE lock. If th
1fc10 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65  e lock cannot be
1fc20 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51   obtained,.** SQ
1fc30 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
1fc40 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74  urned and no dat
1fc50 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
1fc60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1fc70 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  e..** .** If the
1fc80 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d 70   pager is a temp
1fc90 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20  -file pager and 
1fca0 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d  the actual file-
1fcb0 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69  system file.** i
1fcc0 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20  s not yet open, 
1fcd0 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  it is created an
1fce0 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  d opened before 
1fcf0 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20  any data is .** 
1fd00 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a  written out..**.
1fd10 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b  ** Once the lock
1fd20 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61 64   has been upgrad
1fd30 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73  ed and, if neces
1fd40 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f  sary, the file o
1fd50 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61  pened,.** the pa
1fd60 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  ges are written 
1fd70 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
1fd80 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74  ase file in list
1fd90 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a   order. Writing.
1fda0 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b 69  ** a page is ski
1fdb0 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74 73  pped if it meets
1fdc0 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66   either of the f
1fdd0 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69  ollowing criteri
1fde0 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  a:.**.**   * The
1fdf0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
1fe00 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61 67  greater than Pag
1fe10 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a  er.dbSize, or.**
1fe20 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44     * The PGHDR_D
1fe30 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69  ONT_WRITE flag i
1fe40 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67  s set on the pag
1fe50 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74  e..**.** If writ
1fe60 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20 63  ing out a page c
1fe70 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62 61  auses the databa
1fe80 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c  se file to grow,
1fe90 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a   Pager.dbFileSiz
1fea0 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20  e.** is updated 
1feb0 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20  accordingly. If 
1fec0 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74 65  page 1 is writte
1fed0 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20  n out, then the 
1fee0 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20  value cached.** 
1fef0 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  in Pager.dbFileV
1ff00 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64  ers[] is updated
1ff10 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65   to match the ne
1ff20 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  w value stored i
1ff30 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
1ff40 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
1ff50 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
1ff60 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
1ff70 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1ff80 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
1ff90 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20   .** occurs, an 
1ffa0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
1ffb0 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69   returned. Or, i
1ffc0 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  f the EXCLUSIVE 
1ffd0 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62  lock cannot.** b
1ffe0 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49  e obtained, SQLI
1fff0 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
20000 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
20010 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  nt pager_write_p
20020 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70  agelist(PgHdr *p
20030 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a  List){.  Pager *
20040 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20  pPager;         
20050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20060 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
20070 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
20080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20090 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
200a0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28  n code */..  if(
200b0 20 4e 45 56 45 52 28 70 4c 69 73 74 3d 3d 30 29   NEVER(pList==0)
200c0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
200d0 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  _OK;.  pPager = 
200e0 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a  pList->pPager;..
200f0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
20100 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
20110 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45  either a RESERVE
20120 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
20130 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
20140 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
20150 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
20160 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  dy an EXCLUSIVE 
20170 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  lock, the follow
20180 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 20 69 73  ing.  ** call is
20190 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20   a no-op..  **. 
201a0 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c   ** Moving the l
201b0 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45  ock from RESERVE
201c0 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61  D to EXCLUSIVE a
201d0 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73  ctually involves
201e0 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f   going.  ** thro
201f0 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69  ugh an intermedi
20200 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e  ate state PENDIN
20210 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c  G.   A PENDING l
20220 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77  ock prevents new
20230 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72  .  ** readers fr
20240 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20  om attaching to 
20250 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74  the database but
20260 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74   is unsufficient
20270 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20   for us to.  ** 
20280 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65 61  write.  The idea
20290 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f   of a PENDING lo
202a0 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74  ck is to prevent
202b0 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72 6f   new readers fro
202c0 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e  m.  ** coming in
202d0 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20 66   while we wait f
202e0 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61 64  or existing read
202f0 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20  ers to clear..  
20300 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68  **.  ** While th
20310 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
20320 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  e RESERVED state
20330 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  , the original d
20340 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a  atabase file.  *
20350 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61  * is unchanged a
20360 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61  nd we can rollba
20370 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
20380 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68  g to playback th
20390 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69  e.  ** journal i
203a0 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nto the original
203b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
203c0 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74   Once we transit
203d0 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c  ion to.  ** EXCL
203e0 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20  USIVE, it means 
203f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20400 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67  e has been chang
20410 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62  ed and any rollb
20420 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65  ack.  ** will re
20430 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20  quire a journal 
20440 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  playback..  */. 
20450 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
20460 73 65 57 61 6c 28 70 4c 69 73 74 2d 3e 70 50 61  seWal(pList->pPa
20470 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
20480 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
20490 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
204a0 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  );.  rc = pager_
204b0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
204c0 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
204d0 4f 43 4b 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  OCK);..  /* If t
204e0 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d  he file is a tem
204f0 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  p-file has not y
20500 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
20510 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a  open it now. It.
20520 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73    ** is not poss
20530 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62  ible for rc to b
20540 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
20550 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62  ITE_OK if this b
20560 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61  ranch.  ** is ta
20570 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61  ken, as pager_wa
20580 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20  it_on_lock() is 
20590 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70  a no-op for temp
205a0 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  -files..  */.  i
205b0 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
205c0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73  r->fd) ){.    as
205d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
205e0 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51  mpFile && rc==SQ
205f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72  LITE_OK );.    r
20600 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d  c = pagerOpentem
20610 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  p(pPager, pPager
20620 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66  ->fd, pPager->vf
20630 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20  sFlags);.  }..  
20640 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66 69  /* Before the fi
20650 72 73 74 20 77 72 69 74 65 2c 20 67 69 76 65 20  rst write, give 
20660 74 68 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f  the VFS a hint o
20670 66 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c  f what the final
20680 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20  .  ** file size 
20690 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20  will be..  */.  
206a0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
206b0 7a 65 20 3e 20 28 70 50 61 67 65 72 2d 3e 64 62  ze > (pPager->db
206c0 4f 72 69 67 53 69 7a 65 2b 31 29 20 26 26 20 69  OrigSize+1) && i
206d0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
206e0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
206f0 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20  _int64 szFile = 
20700 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
20710 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   * (sqlite3_int6
20720 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  4)pPager->dbSize
20730 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  ;.    sqlite3OsF
20740 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65  ileControl(pPage
20750 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
20760 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26  NTL_SIZE_HINT, &
20770 73 7a 46 69 6c 65 29 3b 0a 20 20 7d 0a 0a 20 20  szFile);.  }..  
20780 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
20790 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b  E_OK && pList ){
207a0 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  .    Pgno pgno =
207b0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20   pList->pgno;.. 
207c0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
207d0 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69  re dirty pages i
207e0 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
207f0 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
20800 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a  rs greater.    *
20810 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  * than Pager.dbS
20820 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  ize, this means 
20830 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
20840 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20  cateImage() was 
20850 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a  called to.    **
20860 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73   make the file s
20870 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62  maller (presumab
20880 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ly by auto-vacuu
20890 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20  m code). Do not 
208a0 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79  write.    ** any
208b0 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74   such pages to t
208c0 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
208d0 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20      ** Also, do 
208e0 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e  not write out an
208f0 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  y page that has 
20900 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57  the PGHDR_DONT_W
20910 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a  RITE flag.    **
20920 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c   set (set by sql
20930 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
20940 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  te())..    */.  
20950 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
20960 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d  er->dbSize && 0=
20970 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50  =(pList->flags&P
20980 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29  GHDR_DONT_WRITE)
20990 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
209a0 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
209b0 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
209c0 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73  eSize;   /* Offs
209d0 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  et to write */. 
209e0 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
209f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a10 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77      /* Data to w
20a20 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20  rite */    ..   
20a30 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65     /* Encode the
20a40 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
20a50 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
20a60 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20  , pList->pData, 
20a70 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20  pgno, 6, return 
20a80 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44  SQLITE_NOMEM, pD
20a90 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ata);..      /* 
20aa0 57 72 69 74 65 20 6f 75 74 20 74 68 65 20 70 61  Write out the pa
20ab0 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20  ge data. */.    
20ac0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
20ad0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
20ae0 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
20af0 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
20b00 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  t);..      /* If
20b10 20 70 61 67 65 20 31 20 77 61 73 20 6a 75 73 74   page 1 was just
20b20 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65   written, update
20b30 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
20b40 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20  s to match.     
20b50 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f   ** the value no
20b60 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  w stored in the 
20b70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
20b80 66 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a  f writing this .
20b90 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61        ** page ca
20ba0 75 73 65 64 20 74 68 65 20 64 61 74 61 62 61 73  used the databas
20bb0 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20  e file to grow, 
20bc0 75 70 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a  update dbFileSiz
20bd0 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  e. .      */.   
20be0 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29     if( pgno==1 )
20bf0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
20c00 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
20c10 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d  Vers, &pData[24]
20c20 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
20c30 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
20c40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
20c50 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62   pgno>pPager->db
20c60 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  FileSize ){.    
20c70 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
20c80 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
20c90 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
20ca0 20 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b   Update any back
20cb0 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69  up objects copyi
20cc0 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
20cd0 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a  of this pager. *
20ce0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
20cf0 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
20d00 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
20d10 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70  o, (u8*)pList->p
20d20 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41  Data);..      PA
20d30 47 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45  GERTRACE(("STORE
20d40 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
20d50 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
20d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
20d70 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
20d80 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
20d90 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20  ash(pList)));.  
20da0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
20db0 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OUT %p %d\n", pP
20dc0 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
20dd0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
20de0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
20df0 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  tedb_count);.   
20e00 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
20e10 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20  ager->nWrite);. 
20e20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20e30 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53  PAGERTRACE(("NOS
20e40 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c  TORE %d page %d\
20e50 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
20e60 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  er), pgno));.   
20e70 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
20e80 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
20e90 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68   pList->pageHash
20ea0 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
20eb0 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66  h(pList);.#endif
20ec0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69  .    pList = pLi
20ed0 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a  st->pDirty;.  }.
20ee0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20ef0 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68  ./*.** Ensure th
20f00 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  at the sub-journ
20f10 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e  al file is open.
20f20 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   If it is alread
20f30 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a  y open, this .**
20f40 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
20f50 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  o-op..**.** SQLI
20f60 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
20f70 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  d if everything 
20f80 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74  goes according t
20f90 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53  o plan. An .** S
20fa0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
20fb0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
20fc0 74 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c  turned if a call
20fd0 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65   to sqlite3OsOpe
20fe0 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a  n() .** fails..*
20ff0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
21000 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65  nSubJournal(Page
21010 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
21020 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
21030 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  ;.  if( !isOpen(
21040 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b  pPager->sjfd) ){
21050 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
21060 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
21070 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
21080 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72  MEMORY || pPager
21090 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29  ->subjInMemory )
210a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d  {.      sqlite3M
210b0 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50  emJournalOpen(pP
210c0 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20  ager->sjfd);.   
210d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
210e0 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70   = pagerOpentemp
210f0 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
21100 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50  >sjfd, SQLITE_OP
21110 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a  EN_SUBJOURNAL);.
21120 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
21130 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21140 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20  Append a record 
21150 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
21160 74 61 74 65 20 6f 66 20 70 61 67 65 20 70 50 67  tate of page pPg
21170 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
21180 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74  nal. .** It is t
21190 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f  he callers respo
211a0 6e 73 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65  nsibility to use
211b0 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
211c0 65 28 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a  e() to check .**
211d0 20 74 68 61 74 20 69 74 20 69 73 20 72 65 61 6c   that it is real
211e0 6c 79 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  ly required befo
211f0 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  re calling this 
21200 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
21210 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
21220 65 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65  et the bit corre
21230 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d  sponding to pPg-
21240 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74  >pgno in the bit
21250 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20  vecs.** for all 
21260 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
21270 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
21280 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
21290 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
212a0 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
212b0 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
212c0 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  ful, an IO.** er
212d0 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20  ror code if the 
212e0 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
212f0 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
21300 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a  nal fails, or .*
21310 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
21320 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  f a malloc fails
21330 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61   while setting a
21340 20 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f   bit in a savepo
21350 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a  int.** bitvec..*
21360 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  /.static int sub
21370 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64  journalPage(PgHd
21380 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72  r *pPg){.  int r
21390 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
213a0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
213b0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
213c0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
213d0 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
213e0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
213f0 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74  {..    /* Open t
21400 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20  he sub-journal, 
21410 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c  if it has not al
21420 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65  ready been opene
21430 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  d */.    assert(
21440 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
21450 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  nal );.    asser
21460 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
21470 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55  ->jfd) || pagerU
21480 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
21490 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
214a0 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
214b0 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75  ) || pPager->nSu
214c0 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  bRec==0 );.    a
214d0 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
214e0 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20 20  al(pPager) .    
214f0 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f       || pageInJo
21500 75 72 6e 61 6c 28 70 50 67 29 20 0a 20 20 20 20  urnal(pPg) .    
21510 20 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e       || pPg->pgn
21520 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  o>pPager->dbOrig
21530 53 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20  Size .    );.   
21540 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75   rc = openSubJou
21550 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20  rnal(pPager);.. 
21560 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62     /* If the sub
21570 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65  -journal was ope
21580 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ned successfully
21590 20 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79   (or was already
215a0 20 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77   open),.    ** w
215b0 72 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  rite the journal
215c0 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
215d0 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69   file.  */.    i
215e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
215f0 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a   ){.      void *
21600 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
21610 74 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66  ta;.      i64 of
21620 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e  fset = pPager->n
21630 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72  SubRec*(4+pPager
21640 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
21650 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b     char *pData2;
21660 0a 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32  .  .      CODEC2
21670 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
21680 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65  pPg->pgno, 7, re
21690 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
216a0 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20  M, pData2);.    
216b0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
216c0 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
216d0 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
216e0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
216f0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72  >pgno));.      r
21700 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
21710 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66  pPager->sjfd, of
21720 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  fset, pPg->pgno)
21730 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
21740 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21750 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
21760 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
21770 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70  >sjfd, pData2, p
21780 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
21790 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20   offset+4);.    
217a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
217b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
217c0 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
217d0 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20  >nSubRec++;.    
217e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
217f0 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a  nSavepoint>0 );.
21800 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61      rc = addToSa
21810 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
21820 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
21830 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
21840 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
21850 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
21860 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63  lled by the pcac
21870 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74  he layer when it
21880 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d   has reached som
21890 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79  e.** soft memory
218a0 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73   limit. The firs
218b0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
218c0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67  pointer to a Pag
218d0 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61  er object.** (ca
218e0 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20  st as a void*). 
218f0 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77  The pager is alw
21900 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20  ays 'purgeable' 
21910 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  (not an in-memor
21920 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20  y.** database). 
21930 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
21940 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e  ent is a referen
21950 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61  ce to a page tha
21960 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74  t is .** current
21970 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73  ly dirty but has
21980 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
21990 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20  references. The 
219a0 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79  page.** is alway
219b0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
219c0 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  h the Pager obje
219d0 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
219e0 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d   first .** argum
219f0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ent..**.** The j
21a00 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ob of this funct
21a10 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70  ion is to make p
21a20 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74  Pg clean by writ
21a30 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  ing its contents
21a40 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64  .** out to the d
21a50 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66  atabase file, if
21a60 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20   possible. This 
21a70 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63  may involve sync
21a80 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ing the.** journ
21a90 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  al file. .**.** 
21aa0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
21ab0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
21ac0 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65  Clean() is calle
21ad0 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e  d on the page an
21ae0 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72  d.** SQLITE_OK r
21af0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
21b00 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
21b10 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d  hile trying to m
21b20 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ake the.** page 
21b30 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72  clean, the IO er
21b40 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
21b50 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  rned. If the pag
21b60 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d  e cannot be.** m
21b70 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f  ade clean for so
21b80 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c  me other reason,
21b90 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
21ba0 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54  curs, then SQLIT
21bb0 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
21bc0 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63  ned by sqlite3Pc
21bd0 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
21be0 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a  is not called..*
21bf0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
21c00 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70  erStress(void *p
21c10 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
21c20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
21c30 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69   (Pager *)p;.  i
21c40 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
21c50 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  K;..  assert( pP
21c60 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
21c70 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
21c80 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
21c90 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54  DIRTY );..  /* T
21ca0 68 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c  he doNotSyncSpil
21cb0 6c 20 66 6c 61 67 20 69 73 20 73 65 74 20 64 75  l flag is set du
21cc0 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20  ring times when 
21cd0 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a  doing a sync of.
21ce0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e    ** journal (an
21cf0 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68  d adding a new h
21d00 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c  eader) is not al
21d10 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63  lowed.  This occ
21d20 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20  urs.  ** during 
21d30 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
21d40 50 61 67 65 72 57 72 69 74 65 28 29 20 77 68 69  PagerWrite() whi
21d50 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75  le trying to jou
21d60 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20  rnal multiple.  
21d70 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69  ** pages belongi
21d80 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73  ng to the same s
21d90 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ector..  **.  **
21da0 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20   The doNotSpill 
21db0 66 6c 61 67 20 69 6e 68 69 62 69 74 73 20 61 6c  flag inhibits al
21dc0 6c 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67  l cache spilling
21dd0 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
21de0 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e  hether.  ** or n
21df0 6f 74 20 61 20 73 79 6e 63 20 69 73 20 72 65 71  ot a sync is req
21e00 75 69 72 65 64 2e 20 20 54 68 69 73 20 69 73 20  uired.  This is 
21e10 73 65 74 20 64 75 72 69 6e 67 20 61 20 72 6f 6c  set during a rol
21e20 6c 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lback..  **.  **
21e30 20 53 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73   Spilling is als
21e40 6f 20 69 6e 68 69 62 69 74 65 64 20 77 68 65 6e  o inhibited when
21e50 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
21e60 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  te..  */.  if( p
21e70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
21e80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21e90 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
21ea0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 29 20 72 65  >doNotSpill ) re
21eb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21ec0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f    if( pPager->do
21ed0 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 26 26 20  NotSyncSpill && 
21ee0 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47  (pPg->flags & PG
21ef0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d  HDR_NEED_SYNC)!=
21f00 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
21f10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
21f20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
21f30 30 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  0;.  if( pagerUs
21f40 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
21f50 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73      /* Write a s
21f60 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20  ingle frame for 
21f70 74 68 69 73 20 70 61 67 65 20 74 6f 20 74 68 65  this page to the
21f80 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28   log. */.    if(
21f90 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
21fa0 65 28 70 50 67 29 20 29 7b 20 0a 20 20 20 20 20  e(pPg) ){ .     
21fb0 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c   rc = subjournal
21fc0 50 61 67 65 28 70 50 67 29 3b 20 0a 20 20 20 20  Page(pPg); .    
21fd0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
21fe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21ff0 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72   rc = pagerWalFr
22000 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50 67  ames(pPager, pPg
22010 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
22020 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20  }.  }else{.  .  
22030 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f    /* Sync the jo
22040 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65  urnal file if re
22050 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  quired. */.    i
22060 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  f( pPg->flags&PG
22070 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
22080 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63  .      rc = sync
22090 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
220a0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
220b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
220c0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20  er->fullSync && 
220d0 0a 20 20 20 20 20 20 20 20 21 28 70 50 61 67 65  .        !(pPage
220e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
220f0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
22100 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a 20 20 20  E_MEMORY) &&.   
22110 20 20 20 20 20 21 28 73 71 6c 69 74 65 33 4f 73       !(sqlite3Os
22120 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
22130 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
22140 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
22150 41 46 45 5f 41 50 50 45 4e 44 29 0a 20 20 20 20  AFE_APPEND).    
22160 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61    ){.        pPa
22170 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
22180 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
22190 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
221a0 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
221b0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
221c0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
221d0 6f 66 20 74 68 69 73 20 70 61 67 65 20 69 73 20  of this page is 
221e0 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
221f0 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a  current size of.
22200 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
22210 61 73 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61  ase image, it ma
22220 79 20 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69  y need to be wri
22230 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d  tten to the sub-
22240 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 20  journal..    ** 
22250 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
22260 74 68 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  the call to page
22270 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
22280 28 29 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f  () below will no
22290 74 0a 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c  t.    ** actuall
222a0 79 20 77 72 69 74 65 20 64 61 74 61 20 74 6f 20  y write data to 
222b0 74 68 65 20 66 69 6c 65 20 69 6e 20 74 68 69 73  the file in this
222c0 20 63 61 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   case..    **.  
222d0 20 20 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68    ** Consider th
222e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75  e following sequ
222f0 65 6e 63 65 20 6f 66 20 65 76 65 6e 74 73 3a 0a  ence of events:.
22300 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
22310 42 45 47 49 4e 3b 0a 20 20 20 20 2a 2a 20 20 20  BEGIN;.    **   
22320 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20    <journal page 
22330 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6d  X>.    **     <m
22340 6f 64 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20  odify page X>.  
22350 20 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49    **     SAVEPOI
22360 4e 54 20 73 70 3b 0a 20 20 20 20 2a 2a 20 20 20  NT sp;.    **   
22370 20 20 20 20 3c 73 68 72 69 6e 6b 20 64 61 74 61      <shrink data
22380 62 61 73 65 20 66 69 6c 65 20 74 6f 20 59 20 70  base file to Y p
22390 61 67 65 73 3e 0a 20 20 20 20 2a 2a 20 20 20 20  ages>.    **    
223a0 20 20 20 70 61 67 65 72 53 74 72 65 73 73 28 70     pagerStress(p
223b0 61 67 65 20 58 29 0a 20 20 20 20 2a 2a 20 20 20  age X).    **   
223c0 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70    ROLLBACK TO sp
223d0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
223e0 49 66 20 28 58 3e 59 29 2c 20 74 68 65 6e 20 77  If (X>Y), then w
223f0 68 65 6e 20 70 61 67 65 72 53 74 72 65 73 73 20  hen pagerStress 
22400 69 73 20 63 61 6c 6c 65 64 20 70 61 67 65 20 58  is called page X
22410 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69   will not be wri
22420 74 74 65 6e 0a 20 20 20 20 2a 2a 20 6f 75 74 20  tten.    ** out 
22430 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
22440 66 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20 62  file, but will b
22450 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 74  e dropped from t
22460 68 65 20 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a  he cache. Then,.
22470 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
22480 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54   the "ROLLBACK T
22490 4f 20 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c  O sp" statement,
224a0 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 58 20   reading page X 
224b0 77 69 6c 6c 20 72 65 61 64 0a 20 20 20 20 2a 2a  will read.    **
224c0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64   data from the d
224d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
224e0 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63  is will be the c
224f0 6f 70 79 20 6f 66 20 70 61 67 65 20 58 20 61 73  opy of page X as
22500 20 69 74 0a 20 20 20 20 2a 2a 20 77 61 73 20 77   it.    ** was w
22510 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
22520 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 6e 6f 74  ion started, not
22530 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20   as it was when 
22540 22 53 41 56 45 50 4f 49 4e 54 20 73 70 22 0a 20  "SAVEPOINT sp". 
22550 20 20 20 2a 2a 20 77 61 73 20 65 78 65 63 75 74     ** was execut
22560 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
22570 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69  * The solution i
22580 73 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63  s to write the c
22590 75 72 72 65 6e 74 20 64 61 74 61 20 66 6f 72 20  urrent data for 
225a0 70 61 67 65 20 58 20 69 6e 74 6f 20 74 68 65 20  page X into the 
225b0 0a 20 20 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72  .    ** sub-jour
225c0 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20 28 69 66  nal file now (if
225d0 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
225e0 64 79 20 74 68 65 72 65 29 2c 20 73 6f 20 74 68  dy there), so th
225f0 61 74 20 69 74 20 77 69 6c 6c 0a 20 20 20 20 2a  at it will.    *
22600 2a 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  * be restored to
22610 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c   its current val
22620 75 65 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c  ue when the "ROL
22630 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 69 73 20  LBACK TO sp" is 
22640 0a 20 20 20 20 2a 2a 20 65 78 65 63 75 74 65 64  .    ** executed
22650 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
22660 20 4e 45 56 45 52 28 0a 20 20 20 20 20 20 20 20   NEVER(.        
22670 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
22680 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
22690 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 73 75 62  r->dbSize && sub
226a0 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
226b0 67 29 0a 20 20 20 20 29 20 29 7b 0a 20 20 20 20  g).    ) ){.    
226c0 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61    rc = subjourna
226d0 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  lPage(pPg);.    
226e0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74  }.  .    /* Writ
226f0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
22700 66 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74  f the page out t
22710 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
22720 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile. */.    if( 
22730 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22740 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
22750 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
22760 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
22770 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
22780 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a  page as clean. *
22790 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
227a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47  TE_OK ){.    PAG
227b0 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53 53  ERTRACE(("STRESS
227c0 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
227d0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
227e0 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
227f0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
22800 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
22810 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67   }..  return pag
22820 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
22830 20 72 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   rc);.}.../*.** 
22840 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
22850 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61  tialize a new Pa
22860 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70  ger object and p
22870 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
22880 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65  it.** in *ppPage
22890 72 2e 20 54 68 65 20 70 61 67 65 72 20 73 68 6f  r. The pager sho
228a0 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62  uld eventually b
228b0 65 20 66 72 65 65 64 20 62 79 20 70 61 73 73 69  e freed by passi
228c0 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69  ng it.** to sqli
228d0 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e  te3PagerClose().
228e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65  .**.** The zFile
228f0 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73  name argument is
22900 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65   the path to the
22910 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
22920 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46  o open..** If zF
22930 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
22940 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
22950 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
22960 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
22970 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
22980 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
22990 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20  ched. Temporary 
229a0 66 69 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c  files are be del
229b0 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69  eted.** automati
229c0 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20  cally when they 
229d0 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a  are closed. If z
229e0 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
229f0 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20  mory:" then .** 
22a00 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
22a10 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65  is held in cache
22a20 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72  . It is never wr
22a30 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a  itten to disk. .
22a40 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  ** This can be u
22a50 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
22a60 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
22a70 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
22a80 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74  e nExtra paramet
22a90 65 72 20 73 70 65 63 69 66 69 65 73 20 74 68 65  er specifies the
22aa0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
22ab0 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
22ac0 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74  ted.** along wit
22ad0 68 20 65 61 63 68 20 70 61 67 65 20 72 65 66 65  h each page refe
22ae0 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63  rence. This spac
22af0 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74  e is available t
22b00 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69  o the user.** vi
22b10 61 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  a the sqlite3Pag
22b20 65 72 47 65 74 45 78 74 72 61 28 29 20 41 50 49  erGetExtra() API
22b30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
22b40 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73  s argument is us
22b50 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70 72  ed to specify pr
22b60 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61 66  operties that af
22b70 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72  fect the.** oper
22b80 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67  ation of the pag
22b90 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65  er. It should be
22ba0 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74   passed some bit
22bb0 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wise combination
22bc0 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52  .** of the PAGER
22bd0 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e  _OMIT_JOURNAL an
22be0 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c  d PAGER_NO_READL
22bf0 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a  OCK flags..**.**
22c00 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70 61   The vfsFlags pa
22c10 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74  rameter is a bit
22c20 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20  mask to pass to 
22c30 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
22c40 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f  ter.** of the xO
22c50 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20  pen() method of 
22c60 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46 53  the supplied VFS
22c70 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69   when opening fi
22c80 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  les. .**.** If t
22c90 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
22ca0 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
22cb0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
22cc0 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73  ile opened .** s
22cd0 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c  uccessfully, SQL
22ce0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
22cf0 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20  ed and *ppPager 
22d00 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a  set to point to.
22d10 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 72  ** the new pager
22d20 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65   object. If an e
22d30 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70  rror occurs, *pp
22d40 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f 20  Pager is set to 
22d50 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f  NULL.** and erro
22d60 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e  r code returned.
22d70 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
22d80 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
22d90 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74  _NOMEM.** (sqlit
22da0 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73  e3Malloc() is us
22db0 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  ed to allocate m
22dc0 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43  emory), SQLITE_C
22dd0 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76  ANTOPEN or .** v
22de0 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f  arious SQLITE_IO
22df0 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a  _XXX errors..*/.
22e00 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
22e10 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
22e20 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
22e30 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
22e40 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75  file system to u
22e50 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a  se */.  Pager **
22e60 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  ppPager,        
22e70 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20   /* OUT: Return 
22e80 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
22e90 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
22ea0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
22eb0 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame,   /* Name o
22ec0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
22ed0 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ile to open */. 
22ee0 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20   int nExtra,    
22ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
22f00 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20  ra bytes append 
22f10 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
22f20 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  y page */.  int 
22f30 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
22f40 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f       /* flags co
22f50 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66  ntrolling this f
22f60 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ile */.  int vfs
22f70 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
22f80 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65    /* flags passe
22f90 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c  d through to sql
22fa0 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
22fb0 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65   */.  void (*xRe
22fc0 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f  init)(DbPage*) /
22fd0 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65  * Function to re
22fe0 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73  initialize pages
22ff0 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74   */.){.  u8 *pPt
23000 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r;.  Pager *pPag
23010 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
23020 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f   Pager object to
23030 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   allocate and re
23040 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  turn */.  int rc
23050 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
23060 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
23070 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46  e */.  int tempF
23080 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ile = 0;        
23090 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70  /* True for temp
230a0 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e   files (incl. in
230b0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a  -memory files) *
230c0 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20  /.  int memDb = 
230d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
230e0 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
230f0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  an in-memory fil
23100 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f  e */.  int readO
23110 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nly = 0;        
23120 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
23130 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66  is a read-only f
23140 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75  ile */.  int jou
23150 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20  rnalFileSize;   
23160 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
23170 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68 20  locate for each 
23180 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20  journal fd */.  
23190 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20  char *zPathname 
231a0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c  = 0;     /* Full
231b0 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61 73   path to databas
231c0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
231d0 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20  nPathname = 0;  
231e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
231f0 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68  f bytes in zPath
23200 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73  name */.  int us
23210 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67  eJournal = (flag
23220 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  s & PAGER_OMIT_J
23230 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46  OURNAL)==0; /* F
23240 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75  alse to omit jou
23250 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  rnal */.  int no
23260 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67  Readlock = (flag
23270 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41  s & PAGER_NO_REA
23280 44 4c 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a 20 54  DLOCK)!=0;  /* T
23290 72 75 65 20 74 6f 20 6f 6d 69 74 20 72 65 61 64  rue to omit read
232a0 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70  -lock */.  int p
232b0 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69  cacheSize = sqli
232c0 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b  te3PcacheSize();
232d0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
232e0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
232f0 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 31 36 20  PCache */.  u16 
23300 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
23310 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
23320 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75  _SIZE;  /* Defau
23330 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  lt page size */.
23340 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
23350 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20   how much space 
23360 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
23370 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  each journal fil
23380 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74  e-handle.  ** (t
23390 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20  here are two of 
233a0 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a  them, the main j
233b0 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73  ournal and the s
233c0 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69  ub-journal). Thi
233d0 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6d 61  s.  ** is the ma
233e0 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75  ximum space requ
233f0 69 72 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  ired for an in-m
23400 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
23410 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20  le handle .  ** 
23420 61 6e 64 20 61 20 72 65 67 75 6c 61 72 20 6a 6f  and a regular jo
23430 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c  urnal file-handl
23440 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20 22  e. Note that a "
23450 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d  regular journal-
23460 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79  handle".  ** may
23470 20 62 65 20 61 20 77 72 61 70 70 65 72 20 63 61   be a wrapper ca
23480 70 61 62 6c 65 20 6f 66 20 63 61 63 68 69 6e 67  pable of caching
23490 20 74 68 65 20 66 69 72 73 74 20 70 6f 72 74 69   the first porti
234a0 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  on of the journa
234b0 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d  l.  ** file in m
234c0 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65  emory to impleme
234d0 6e 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  nt the atomic-wr
234e0 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
234f0 20 28 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72   (see .  ** sour
23500 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e  ce file journal.
23510 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  c)..  */.  if( s
23520 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a  qlite3JournalSiz
23530 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65 33 4d  e(pVfs)>sqlite3M
23540 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20  emJournalSize() 
23550 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  ){.    journalFi
23560 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28  leSize = ROUND8(
23570 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69  sqlite3JournalSi
23580 7a 65 28 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c  ze(pVfs));.  }el
23590 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46  se{.    journalF
235a0 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38  ileSize = ROUND8
235b0 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e  (sqlite3MemJourn
235c0 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a  alSize());.  }..
235d0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74    /* Set the out
235e0 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20  put variable to 
235f0 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20  NULL in case an 
23600 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f  error occurs. */
23610 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b  .  *ppPager = 0;
23620 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61  ..  /* Compute a
23630 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c  nd store the ful
23640 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e  l pathname in an
23650 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65   allocated buffe
23660 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74  r pointed.  ** t
23670 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20  o by zPathname, 
23680 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65  length nPathname
23690 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73  . Or, if this is
236a0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
236b0 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f  e,.  ** leave bo
236c0 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64  th nPathname and
236d0 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74   zPathname set t
236e0 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  o 0..  */.  if( 
236f0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
23700 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
23710 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66   nPathname = pVf
23720 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
23730 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d  .    zPathname =
23740 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e   sqlite3Malloc(n
23750 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20  Pathname*2);.   
23760 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d   if( zPathname==
23770 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
23780 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
23790 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
237a0 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
237b0 44 42 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  DB.    if( strcm
237c0 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65  p(zFilename,":me
237d0 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  mory:")==0 ){.  
237e0 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20      memDb = 1;. 
237f0 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30       zPathname[0
23800 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  ] = 0;.    }else
23810 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
23820 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d      zPathname[0]
23830 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75   = 0; /* Make su
23840 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65  re initialized e
23850 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e  ven if FullPathn
23860 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20  ame() fails */. 
23870 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
23880 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
23890 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
238a0 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74   nPathname, zPat
238b0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  hname);.    }.. 
238c0 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73     nPathname = s
238d0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
238e0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Pathname);.    i
238f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23900 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e   && nPathname+8>
23910 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
23920 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
23930 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
23940 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  n when the journ
23950 61 6c 20 70 61 74 68 20 72 65 71 75 69 72 65 64  al path required
23960 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   by.      ** the
23970 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20   database being 
23980 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d  opened will be m
23990 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d  ore than pVfs->m
239a0 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20  xPathname.      
239b0 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67  ** bytes in leng
239c0 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  th. This means t
239d0 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
239e0 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20  ot be opened,.  
239f0 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c      ** as it wil
23a00 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c  l not be possibl
23a10 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f  e to open the jo
23a20 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76  urnal file or ev
23a30 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63  en.      ** chec
23a40 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  k for a hot-jour
23a50 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69  nal before readi
23a60 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ng..      */.   
23a70 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
23a80 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
23a90 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
23aa0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23ab0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
23ac0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
23ad0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
23ae0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
23af0 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72  ocate memory for
23b00 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
23b10 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f 62 6a  ture, PCache obj
23b20 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68  ect, the.  ** th
23b30 72 65 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ree file descrip
23b40 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61 62 61  tors, the databa
23b50 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64  se file name and
23b60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   the journal .  
23b70 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68  ** file name. Th
23b80 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f  e layout in memo
23b90 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  ry is as follows
23ba0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
23bb0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20 20 20  Pager object    
23bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bd0 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29 20 62  (sizeof(Pager) b
23be0 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 50  ytes).  **     P
23bf0 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20 20 20  Cache object    
23c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
23c10 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a  sqlite3PcacheSiz
23c20 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  e() bytes).  ** 
23c30 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c      Database fil
23c40 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
23c50 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46      (pVfs->szOsF
23c60 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  ile bytes).  ** 
23c70 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20      Sub-journal 
23c80 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
23c90 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65      (journalFile
23ca0 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a  Size bytes).  **
23cb0 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61       Main journa
23cc0 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  l file handle   
23cd0 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c       (journalFil
23ce0 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a  eSize bytes).  *
23cf0 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66  *     Database f
23d00 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20  ile name        
23d10 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65        (nPathname
23d20 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  +1 bytes).  **  
23d30 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     Journal file 
23d40 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  name            
23d50 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b     (nPathname+8+
23d60 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20  1 bytes).  */.  
23d70 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73 71 6c  pPtr = (u8 *)sql
23d80 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a  ite3MallocZero(.
23d90 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f      ROUND8(sizeo
23da0 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20 20 20  f(*pPager)) +   
23db0 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75     /* Pager stru
23dc0 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55  cture */.    ROU
23dd0 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 20  ND8(pcacheSize) 
23de0 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  +           /* P
23df0 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  Cache object */.
23e00 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66 73 2d      ROUND8(pVfs-
23e10 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20 20  >szOsFile) +    
23e20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64     /* The main d
23e30 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f  b file */.    jo
23e40 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20  urnalFileSize * 
23e50 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2 +          /* 
23e60 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20  The two journal 
23e70 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50  files */ .    nP
23e80 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 20 20  athname + 1 +   
23e90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23ea0 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20  zFilename */.   
23eb0 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b   nPathname + 8 +
23ec0 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
23ed0 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  /* zJournal */. 
23ee0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   );.  assert( EI
23ef0 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
23f00 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  NT(SQLITE_INT_TO
23f10 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65  _PTR(journalFile
23f20 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20  Size)) );.  if( 
23f30 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c  !pPtr ){.    sql
23f40 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
23f50 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
23f60 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
23f70 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20   }.  pPager =   
23f80 20 20 20 20 20 20 20 20 20 20 20 28 50 61 67 65             (Page
23f90 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61  r*)(pPtr);.  pPa
23fa0 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20  ger->pPCache =  
23fb0 20 20 28 50 43 61 63 68 65 2a 29 28 70 50 74 72    (PCache*)(pPtr
23fc0 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f   += ROUND8(sizeo
23fd0 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20  f(*pPager)));.  
23fe0 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28  pPager->fd =   (
23ff0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
24000 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63  Ptr += ROUND8(pc
24010 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50  acheSize));.  pP
24020 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71  ager->sjfd = (sq
24030 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
24040 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73  r += ROUND8(pVfs
24050 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20  ->szOsFile));.  
24060 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28  pPager->jfd =  (
24070 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
24080 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69  Ptr += journalFi
24090 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
240a0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20  r->zFilename =  
240b0 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b    (char*)(pPtr +
240c0 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  = journalFileSiz
240d0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49  e);.  assert( EI
240e0 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
240f0 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  NT(pPager->jfd) 
24100 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
24110 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65   the Pager.zFile
24120 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a  name and Pager.z
24130 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c  Journal buffers,
24140 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
24150 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65  .  if( zPathname
24160 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
24170 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68  zJournal =   (ch
24180 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61  ar*)(pPtr += nPa
24190 74 68 6e 61 6d 65 20 2b 20 31 29 3b 0a 20 20 20  thname + 1);.   
241a0 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
241b0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68  zFilename, zPath
241c0 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
241d0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
241e0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a  ger->zJournal, z
241f0 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
24200 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
24210 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  (&pPager->zJourn
24220 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22  al[nPathname], "
24230 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38 29 3b 0a 20  -journal", 8);. 
24240 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 7a     if( pPager->z
24250 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 20 29  Filename[0]==0 )
24260 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
24270 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71  l[0] = 0;.    sq
24280 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68  lite3_free(zPath
24290 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61  name);.  }.  pPa
242a0 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73  ger->pVfs = pVfs
242b0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46  ;.  pPager->vfsF
242c0 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b  lags = vfsFlags;
242d0 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
242e0 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f  pager file..  */
242f0 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
24300 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
24310 20 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20   && !memDb ){.  
24320 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20    int fout = 0; 
24330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24340 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20     /* VFS flags 
24350 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65  returned by xOpe
24360 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  n() */.    rc = 
24370 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
24380 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  fs, pPager->zFil
24390 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66  ename, pPager->f
243a0 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f  d, vfsFlags, &fo
243b0 75 74 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c  ut);.    readOnl
243c0 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45  y = (fout&SQLITE
243d0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
243e0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
243f0 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73  file was success
24400 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72  fully opened for
24410 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
24420 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73  ss,.    ** choos
24430 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65  e a default page
24440 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65   size in case we
24450 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20   have to create 
24460 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
24470 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65  ase file. The de
24480 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
24490 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f  is the maximum o
244a0 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
244b0 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46      + SQLITE_DEF
244c0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a  AULT_PAGE_SIZE,.
244d0 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20      **    + The 
244e0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
244f0 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  y sqlite3OsSecto
24500 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20  rSize().    **  
24510 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20    + The largest 
24520 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63  page size that c
24530 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  an be written at
24540 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f  omically..    */
24550 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
24560 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f  ITE_OK && !readO
24570 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 65 74  nly ){.      set
24580 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
24590 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
245a0 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
245b0 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54  PAGE_SIZE<=SQLIT
245c0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
245d0 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
245e0 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70  if( szPageDflt<p
245f0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
24600 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
24610 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
24620 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ize>SQLITE_MAX_D
24630 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
24640 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a   ){.          sz
24650 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54  PageDflt = SQLIT
24660 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
24670 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  GE_SIZE;.       
24680 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24690 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28    szPageDflt = (
246a0 75 31 36 29 70 50 61 67 65 72 2d 3e 73 65 63 74  u16)pPager->sect
246b0 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  orSize;.        
246c0 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66  }.      }.#ifdef
246d0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
246e0 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
246f0 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20    {.        int 
24700 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
24710 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
24720 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
24730 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69  ;.        int ii
24740 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
24750 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
24760 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
24770 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ));.        asse
24780 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
24790 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
247a0 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  6>>8));.        
247b0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41  assert(SQLITE_MA
247c0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
247d0 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20  IZE<=65536);.   
247e0 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61       for(ii=szPa
247f0 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49  geDflt; ii<=SQLI
24800 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
24810 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a  AGE_SIZE; ii=ii*
24820 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  2){.          if
24830 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f  ( iDc&(SQLITE_IO
24840 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e  CAP_ATOMIC|(ii>>
24850 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  8)) ){.         
24860 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
24870 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ii;.          }.
24880 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24890 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
248a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
248b0 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  f a temporary fi
248c0 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  le is requested,
248d0 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65   it is not opene
248e0 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  d immediately.. 
248f0 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
24900 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65  se we accept the
24910 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
24920 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74  ze and delay act
24930 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65  ually.    ** ope
24940 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e  ning the file un
24950 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61  til the first ca
24960 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e  ll to OsWrite().
24970 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
24980 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c  his branch is al
24990 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e  so run for an in
249a0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
249b0 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20  . An in-memory. 
249c0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
249d0 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20  s the same as a 
249e0 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69  temp-file that i
249f0 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
24a00 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69  out to.    ** di
24a10 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69  sk and uses an i
24a20 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63  n-memory rollbac
24a30 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  k journal..    *
24a40 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20  / .    tempFile 
24a50 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
24a60 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
24a70 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 72 65  XCLUSIVE;.    re
24a80 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61  adOnly = (vfsFla
24a90 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  gs&SQLITE_OPEN_R
24aa0 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20  EADONLY);.  }.. 
24ab0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
24ac0 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72 53  g call to PagerS
24ad0 65 74 50 61 67 65 73 69 7a 65 28 29 20 73 65 72  etPagesize() ser
24ae0 76 65 73 20 74 6f 20 73 65 74 20 74 68 65 20 76  ves to set the v
24af0 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61  alue of .  ** Pa
24b00 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e 64  ger.pageSize and
24b10 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   to allocate the
24b20 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
24b30 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20   buffer..  */.  
24b40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24b50 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
24b60 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d   pPager->memDb==
24b70 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
24b80 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
24b90 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 73  esize(pPager, &s
24ba0 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a  zPageDflt, -1);.
24bb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
24bc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
24bd0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65   }..  /* If an e
24be0 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e  rror occurred in
24bf0 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 62   either of the b
24c00 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72 65  locks above, fre
24c10 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65  e the .  ** Page
24c20 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
24c30 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a  close the file..
24c40 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53    */.  if( rc!=S
24c50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24c60 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
24c70 3e 70 54 6d 70 53 70 61 63 65 20 29 3b 0a 20 20  >pTmpSpace );.  
24c80 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
24c90 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
24ca0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
24cb0 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
24cc0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
24cd0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
24ce0 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a  PCache object. *
24cf0 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78 74  /.  assert( nExt
24d00 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 6e 45 78  ra<1000 );.  nEx
24d10 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78  tra = ROUND8(nEx
24d20 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  tra);.  sqlite3P
24d30 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65  cacheOpen(szPage
24d40 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d  Dflt, nExtra, !m
24d50 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20  emDb,.          
24d60 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62            !memDb
24d70 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20  ?pagerStress:0, 
24d80 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
24d90 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
24da0 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  ;..  PAGERTRACE(
24db0 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c  ("OPEN %d %s\n",
24dc0 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50   FILEHANDLEID(pP
24dd0 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65  ager->fd), pPage
24de0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  r->zFilename));.
24df0 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e    IOTRACE(("OPEN
24e00 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65   %p %s\n", pPage
24e10 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  r, pPager->zFile
24e20 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72  name))..  pPager
24e30 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  ->useJournal = (
24e40 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20  u8)useJournal;. 
24e50 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
24e60 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63  ock = (noReadloc
24e70 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 29 20 3f  k && readOnly) ?
24e80 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  1:0;.  /* pPager
24e90 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20  ->stmtOpen = 0; 
24ea0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
24eb0 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a  stmtInUse = 0; *
24ec0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
24ed0 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  Ref = 0; */.  pP
24ee0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
24ef0 64 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20  d = (u8)memDb;. 
24f00 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
24f10 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
24f20 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  * pPager->stmtJS
24f30 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
24f40 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
24f50 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
24f60 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45  >mxPgno = SQLITE
24f70 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b  _MAX_PAGE_COUNT;
24f80 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
24f90 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
24fa0 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  CK; */.  assert(
24fb0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
24fc0 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41  = (tempFile ? PA
24fd0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20  GER_EXCLUSIVE : 
24fe0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b  PAGER_UNLOCK) );
24ff0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72  .  /* pPager->er
25000 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20  rMask = 0; */.  
25010 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
25020 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b   = (u8)tempFile;
25030 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46  .  assert( tempF
25040 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
25050 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20  NGMODE_NORMAL . 
25060 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70           || temp
25070 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
25080 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
25090 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  E );.  assert( P
250a0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
250b0 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b  _EXCLUSIVE==1 );
250c0 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
250d0 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74  siveMode = (u8)t
250e0 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67  empFile; .  pPag
250f0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
25100 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
25110 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
25120 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65  ->memDb = (u8)me
25130 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72  mDb;.  pPager->r
25140 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65  eadOnly = (u8)re
25150 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61  adOnly;.  /* pPa
25160 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
25170 30 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  0; */.  assert( 
25180 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50  useJournal || pP
25190 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
251a0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  ;.  pPager->noSy
251b0 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  nc = pPager->tem
251c0 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
251d0 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 70 50 61 67  >fullSync = pPag
251e0 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b  er->noSync ?0:1;
251f0 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  .  pPager->sync_
25200 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  flags = SQLITE_S
25210 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a  YNC_NORMAL;.  /*
25220 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
25230 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
25240 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
25250 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  d = 0; */.  /* p
25260 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30  Pager->pLast = 0
25270 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
25280 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78  Extra = (u16)nEx
25290 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  tra;.  pPager->j
252a0 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
252b0 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
252c0 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49  _JOURNAL_SIZE_LI
252d0 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69  MIT;.  assert( i
252e0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
252f0 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b  ) || tempFile );
25300 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  .  setSectorSize
25310 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
25320 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  !useJournal ){. 
25330 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
25340 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
25350 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a  OURNALMODE_OFF;.
25360 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44    }else if( memD
25370 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  b ){.    pPager-
25380 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
25390 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
253a0 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f  _MEMORY;.  }.  /
253b0 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  * pPager->xBusyH
253c0 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20  andler = 0; */. 
253d0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73   /* pPager->pBus
253e0 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b  yHandlerArg = 0;
253f0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52   */.  pPager->xR
25400 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69  einiter = xReini
25410 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70  t;.  /* memset(p
25420 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c  Pager->aHash, 0,
25430 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
25440 61 48 61 73 68 29 29 3b 20 2a 2f 0a 0a 20 20 2a  aHash)); */..  *
25450 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
25460 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
25470 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  E_OK;.}..../*.**
25480 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
25490 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  s called after t
254a0 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f  ransitioning fro
254b0 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74  m PAGER_UNLOCK t
254c0 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45  o.** PAGER_SHARE
254d0 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73 74  D state. It test
254e0 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
254f0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73  hot journal pres
25500 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69  ent in.** the fi
25510 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  le-system for th
25520 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41  e given pager. A
25530 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20   hot journal is 
25540 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65  one that .** nee
25550 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
25560 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20  back. According 
25570 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
25580 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a  , a hot-journal.
25590 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  ** file exists i
255a0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
255b0 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65 74  criteria are met
255c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
255d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
255e0 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  sts in the file 
255f0 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20  system, and.**  
25600 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f   * No process ho
25610 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6f  lds a RESERVED o
25620 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
25630 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
25640 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ile, and.**   * 
25650 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
25660 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65 61  e itself is grea
25670 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
25680 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a   in size, and.**
25690 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20 62     * The first b
256a0 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  yte of the journ
256b0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
256c0 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a  nd is not 0x00..
256d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
256e0 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
256f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
25700 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61  s 0 but a journa
25710 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73  l file.** exists
25720 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62  , that is probab
25730 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ly an old journa
25740 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d  l left over from
25750 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61   a prior.** data
25760 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
25770 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  me name. In this
25780 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61   case the journa
25790 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73  l file is.** jus
257a0 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  t deleted using 
257b0 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73  OsDelete, *pExis
257c0 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  ts is set to 0 a
257d0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  nd SQLITE_OK.** 
257e0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
257f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
25800 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69  does not check i
25810 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61 73  f there is a mas
25820 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
25830 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65  name.** at the e
25840 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20  nd of the file. 
25850 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64  If there is, and
25860 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75   that master jou
25870 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65  rnal file.** doe
25880 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65  s not exist, the
25890 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
258a0 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
258b0 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a   hot. In this.**
258c0 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
258d0 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  ne will return a
258e0 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e   false-positive.
258f0 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   The pager_playb
25900 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ack().** routine
25910 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74   will discover t
25920 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
25930 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  file is not real
25940 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77  ly hot and .** w
25950 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20  ill not roll it 
25960 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  back. .**.** If 
25970 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
25980 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65  le is found to e
25990 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69  xist, *pExists i
259a0 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a  s set to 1 and .
259b0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
259c0 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74  urned. If no hot
259d0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
259e0 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73   present, *pExis
259f0 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ts is.** set to 
25a00 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  0 and SQLITE_OK 
25a10 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
25a20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
25a30 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20  while trying.** 
25a40 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
25a50 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f  ther or not a ho
25a60 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  t-journal file e
25a70 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72  xists, the IO er
25a80 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72  ror.** code is r
25a90 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
25aa0 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74  value of *pExist
25ab0 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a  s is undefined..
25ac0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
25ad0 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sHotJournal(Page
25ae0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
25af0 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69  pExists){.  sqli
25b00 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
25b10 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
25b20 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Vfs;.  int rc = 
25b30 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
25b40 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
25b50 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69  ode */.  int exi
25b60 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  sts = 1;        
25b70 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
25b80 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
25b90 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
25ba0 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20   int jrnlOpen = 
25bb0 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  !!isOpen(pPager-
25bc0 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74  >jfd);..  assert
25bd0 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
25be0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25bf0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
25c00 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
25c10 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
25c20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25c30 3e 73 74 61 74 65 20 3c 3d 20 50 41 47 45 52 5f  >state <= PAGER_
25c40 53 48 41 52 45 44 20 29 3b 0a 20 20 61 73 73 65  SHARED );.  asse
25c50 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20  rt( jrnlOpen==0 
25c60 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73 44 65  || ( sqlite3OsDe
25c70 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
25c80 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ics(pPager->jfd)
25c90 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f 49 4f   &.    SQLITE_IO
25ca0 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f  CAP_UNDELETABLE_
25cb0 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a  WHEN_OPEN.  ));.
25cc0 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b  .  *pExists = 0;
25cd0 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e  .  if( !jrnlOpen
25ce0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
25cf0 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
25d00 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
25d10 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
25d20 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73  SS_EXISTS, &exis
25d30 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ts);.  }.  if( r
25d40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
25d50 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e  exists ){.    in
25d60 74 20 6c 6f 63 6b 65 64 3b 20 20 20 20 20 20 20  t locked;       
25d70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
25d80 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73  e if some proces
25d90 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
25da0 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20  ED lock */..    
25db0 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f  /* Race conditio
25dc0 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72  n here:  Another
25dd0 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68   process might h
25de0 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67  ave been holding
25df0 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   the.    ** the 
25e00 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e  RESERVED lock an
25e10 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c  d have a journal
25e20 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c   open at the sql
25e30 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a  ite3OsAccess() .
25e40 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76      ** call abov
25e50 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65  e, but then dele
25e60 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  te the journal a
25e70 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b  nd drop the lock
25e80 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77   before.    ** w
25e90 65 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c  e get to the fol
25ea0 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73  lowing sqlite3Os
25eb0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
25ec0 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68  k() call.  If th
25ed0 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65  at.    ** is the
25ee0 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74   case, this rout
25ef0 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20  ine might think 
25f00 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
25f10 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20  ournal when.    
25f20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72 65  ** in fact there
25f30 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20   is none.  This 
25f40 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c  results in a fal
25f50 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63  se-positive whic
25f60 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  h will.    ** be
25f70 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74   dealt with by t
25f80 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74  he playback rout
25f90 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38  ine.  Ticket #38
25fa0 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  83..    */.    r
25fb0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65  c = sqlite3OsChe
25fc0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70  ckReservedLock(p
25fd0 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b  Pager->fd, &lock
25fe0 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
25ff0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c  =SQLITE_OK && !l
26000 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 69  ocked ){.      i
26010 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 20 20 20  nt nPage;..     
26020 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 73 69   /* Check the si
26030 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
26040 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20 63  se file. If it c
26050 6f 6e 73 69 73 74 73 20 6f 66 20 30 20 70 61 67  onsists of 0 pag
26060 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  es,.      ** the
26070 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  n delete the jou
26080 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65 20 74  rnal file. See t
26090 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  he header commen
260a0 74 20 61 62 6f 76 65 20 66 6f 72 20 0a 20 20 20  t above for .   
260b0 20 20 20 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e     ** the reason
260c0 69 6e 67 20 68 65 72 65 2e 20 20 44 65 6c 65 74  ing here.  Delet
260d0 65 20 74 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a  e the obsolete j
260e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65  ournal file unde
260f0 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 52 45 53  r.      ** a RES
26100 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76  ERVED lock to av
26110 6f 69 64 20 72 61 63 65 20 63 6f 6e 64 69 74 69  oid race conditi
26120 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f 69 64  ons and to avoid
26130 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20   violating.     
26140 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20   ** [H33020]..  
26150 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
26160 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
26170 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
26180 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  &nPage);.      i
26190 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
261a0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
261b0 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
261c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
261d0 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
261e0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
261f0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
26200 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56  ager->fd, RESERV
26210 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45  ED_LOCK)==SQLITE
26220 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
26230 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
26240 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  te(pVfs, pPager-
26250 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
26260 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
26270 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
26280 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
26290 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  CK);.          }
262a0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
262b0 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
262c0 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  c();.        }el
262d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
262e0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
262f0 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20  e exists and no 
26300 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
26310 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a   has a reserved.
26320 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
26330 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
26340 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26350 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61  e. Now check tha
26360 74 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20  t there is.     
26370 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74       ** at least
26380 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79   one non-zero by
26390 74 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74  tes at the start
263a0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
263b0 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20  file..          
263c0 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20  ** If there is, 
263d0 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72  then we consider
263e0 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f   this journal to
263f0 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c   be hot. If not,
26400 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
26410 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  t can be ignored
26420 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
26430 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72           if( !jr
26440 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  nlOpen ){.      
26450 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51        int f = SQ
26460 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
26470 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
26480 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20  AIN_JOURNAL;.   
26490 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
264a0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
264b0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
264c0 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
264d0 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20   f, &f);.       
264e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
264f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26500 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26510 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20  u8 first = 0;.  
26520 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
26530 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
26540 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20  ger->jfd, (void 
26550 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b  *)&first, 1, 0);
26560 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
26570 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
26580 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
26590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
265a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
265b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
265c0 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e          if( !jrn
265d0 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  lOpen ){.       
265e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
265f0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
26600 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
26610 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  }.            *p
26620 45 78 69 73 74 73 20 3d 20 28 66 69 72 73 74 21  Exists = (first!
26630 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  =0);.          }
26640 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
26650 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a  ITE_CANTOPEN ){.
26660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
26670 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  f we cannot open
26680 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
26690 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72  urnal file in or
266a0 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20  der to see if.  
266b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 73            ** its
266c0 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64   has a zero head
266d0 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62  er, that might b
266e0 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20  e due to an I/O 
266f0 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20  error, or.      
26700 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68        ** it migh
26710 74 20 62 65 20 64 75 65 20 74 6f 20 74 68 65 20  t be due to the 
26720 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64  race condition d
26730 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 61  escribed above a
26740 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20  nd in.          
26750 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38    ** ticket #388
26760 33 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20  3.  Either way, 
26770 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
26780 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a  journal is hot..
26790 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54              ** T
267a0 68 69 73 20 6d 69 67 68 74 20 62 65 20 61 20 66  his might be a f
267b0 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20  alse positive.  
267c0 42 75 74 20 69 66 20 69 74 20 69 73 2c 20 74 68  But if it is, th
267d0 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  en the.         
267e0 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20     ** automatic 
267f0 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
26800 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65   and recovery me
26810 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61  chanism will dea
26820 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  l.            **
26830 20 77 69 74 68 20 69 74 20 75 6e 64 65 72 20 61   with it under a
26840 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
26850 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74   where we do not
26860 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20   need to.       
26870 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f       ** worry so
26880 20 6d 75 63 68 20 77 69 74 68 20 72 61 63 65 20   much with race 
26890 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20  conditions..    
268a0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
268b0 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
268c0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
268d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
268e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
268f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
26900 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
26910 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
26920 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
26930 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
26940 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  n a shared lock 
26950 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
26960 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69  file..** It is i
26970 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73  llegal to call s
26980 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
26990 72 65 28 29 20 75 6e 74 69 6c 20 61 66 74 65 72  re() until after
269a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
269b0 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65  * has been succe
269c0 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20  ssfully called. 
269d0 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b  If a shared-lock
269e0 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
269f0 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75   when.** this fu
26a00 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
26a10 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
26a20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
26a30 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20  wing operations 
26a40 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d  are also perform
26a50 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
26a60 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ion..**.**   1) 
26a70 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
26a80 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41 47  currently in PAG
26a90 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20  ER_UNLOCK state 
26aa0 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a  (no lock held.**
26ab0 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74        on the dat
26ac0 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65  abase file), the
26ad0 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  n an attempt is 
26ae0 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61  made to obtain a
26af0 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 20  .**      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 20 49 6d 6d 65 64  base file. Immed
26b20 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74  iately after obt
26b30 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  aining.**      t
26b40 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
26b50 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
26b60 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61  is checked for a
26b70 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a   hot-journal,.**
26b80 20 20 20 20 20 20 77 68 69 63 68 20 69 73 20 70        which is p
26b90 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20 70 72  layed back if pr
26ba0 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67  esent. Following
26bb0 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c   any hot-journal
26bc0 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61   .**      rollba
26bd0 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ck, the contents
26be0 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 61 72   of the cache ar
26bf0 65 20 76 61 6c 69 64 61 74 65 64 20 62 79 20 63  e validated by c
26c00 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  hecking.**      
26c10 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e  the 'change-coun
26c20 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68  ter' field of th
26c30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
26c40 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20  header and.**   
26c50 20 20 20 64 69 73 63 61 72 64 65 64 20 69 66 20     discarded if 
26c60 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74  they are found t
26c70 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a  o be invalid..**
26c80 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65 20  .**   2) If the 
26c90 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
26ca0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f   in exclusive-mo
26cb0 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  de, and there ar
26cc0 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20  e currently.**  
26cd0 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69      no outstandi
26ce0 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
26cf0 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20   any pages, and 
26d00 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
26d10 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74  state,.**      t
26d20 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
26d30 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20  s made to clear 
26d40 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
26d50 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a  by discarding.**
26d60 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e        the conten
26d70 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 63  ts of the page c
26d80 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67  ache and rolling
26d90 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a   back any open j
26da0 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66  ournal.**      f
26db0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ile..**.** If th
26dc0 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 65 73 63  e operation desc
26dd0 72 69 62 65 64 20 62 79 20 28 32 29 20 61 62 6f  ribed by (2) abo
26de0 76 65 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70  ve is not attemp
26df0 74 65 64 2c 20 61 6e 64 20 69 66 20 74 68 65 0a  ted, and if the.
26e00 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20 61  ** pager is in a
26e10 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74  n error state ot
26e20 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
26e30 46 55 4c 4c 20 77 68 65 6e 20 74 68 69 73 20 69  FULL when this i
26e40 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 74 68 65  s called,.** the
26e50 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72   error state err
26e60 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
26e70 6e 65 64 2e 20 49 74 20 69 73 20 70 65 72 6d 69  ned. It is permi
26e80 74 74 65 64 20 74 6f 20 72 65 61 64 20 74 68 65  tted to read the
26e90 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 68 65  .** database whe
26ea0 6e 20 69 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  n in SQLITE_FULL
26eb0 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a   error state..**
26ec0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
26ed0 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
26ee0 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
26ef0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
26f00 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 49 4f 20 65  d. If an.** IO e
26f10 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
26f20 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61  e locking the da
26f30 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67  tabase, checking
26f40 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
26f50 61 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72 20 72 6f  al.** file or ro
26f60 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
26f70 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49  rnal file, the I
26f80 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
26f90 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
26fa0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61   sqlite3PagerSha
26fb0 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70  redLock(Pager *p
26fc0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
26fd0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
26fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26ff0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
27000 20 69 6e 74 20 69 73 45 72 72 6f 72 52 65 73 65   int isErrorRese
27010 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
27020 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
27030 65 63 6f 76 65 72 69 6e 67 20 66 72 6f 6d 20 65  ecovering from e
27040 72 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a 0a 20  rror state */.. 
27050 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
27060 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
27070 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20  from b-tree and 
27080 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20  only when there 
27090 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73  are no.  ** outs
270a0 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 2a 2f  tanding pages */
270b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
270c0 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
270d0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
270e0 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45  )==0 );.  if( NE
270f0 56 45 52 28 4d 45 4d 44 42 20 26 26 20 70 50 61  VER(MEMDB && pPa
27100 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b  ger->errCode) ){
27110 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
27120 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 2f 2a  errCode; }..  /*
27130 20 49 66 20 74 68 69 73 20 64 61 74 61 62 61 73   If this databas
27140 65 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72  e is in an error
27150 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69 73 20 61  -state, now is a
27160 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65 61 72   chance to clear
27170 0a 20 20 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e  .  ** the error.
27180 20 44 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e   Discard the con
27190 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
271a0 65 72 2d 63 61 63 68 65 20 61 6e 64 20 72 6f 6c  er-cache and rol
271b0 6c 62 61 63 6b 0a 20 20 2a 2a 20 61 6e 79 20 68  lback.  ** any h
271c0 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 74 68  ot journal in th
271d0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 20  e file-system.. 
271e0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
271f0 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
27200 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
27210 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67  er->jfd) || pPag
27220 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 29 7b 0a  er->zJournal ){.
27230 20 20 20 20 20 20 69 73 45 72 72 6f 72 52 65 73        isErrorRes
27240 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  et = 1;.    }.  
27250 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
27260 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  e = SQLITE_OK;. 
27270 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
27280 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  Pager);.  }..  i
27290 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
272a0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63  Pager) ){.    rc
272b0 20 3d 20 70 61 67 65 72 42 65 67 69 6e 52 65 61   = pagerBeginRea
272c0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
272d0 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ger);.  }else if
272e0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
272f0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c  =PAGER_UNLOCK ||
27300 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b   isErrorReset ){
27310 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
27320 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
27330 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
27340 20 20 69 6e 74 20 69 73 48 6f 74 4a 6f 75 72 6e    int isHotJourn
27350 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  al = 0;.    asse
27360 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
27370 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
27380 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
27390 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
273a0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
273b0 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
273c0 6b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  k ){.      asser
273d0 74 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  t( pPager->readO
273e0 6e 6c 79 20 29 3b 0a 20 20 20 20 20 20 70 50 61  nly );.      pPa
273f0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
27400 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d  ER_SHARED;.    }
27410 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
27420 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
27430 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52  ock(pPager, SHAR
27440 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
27450 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27460 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27470 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
27480 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
27490 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
274a0 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
274b0 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
274c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
274d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
274e0 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ate>=SHARED_LOCK
274f0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61   );..    /* If a
27500 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
27510 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20  ists, and there 
27520 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c  is no RESERVED l
27530 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
27540 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
27550 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20   then it either 
27560 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
27570 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74  ed back or delet
27580 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
27590 66 28 20 21 69 73 45 72 72 6f 72 52 65 73 65 74  f( !isErrorReset
275a0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
275b0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  ( pPager->state 
275c0 3c 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  <= PAGER_SHARED 
275d0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61  );.      rc = ha
275e0 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sHotJournal(pPag
275f0 65 72 2c 20 26 69 73 48 6f 74 4a 6f 75 72 6e 61  er, &isHotJourna
27600 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  l);.      if( rc
27610 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
27620 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
27630 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ed;.      }.    
27640 7d 0a 20 20 20 20 69 66 28 20 69 73 45 72 72 6f  }.    if( isErro
27650 72 52 65 73 65 74 20 7c 7c 20 69 73 48 6f 74 4a  rReset || isHotJ
27660 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
27670 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
27680 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
27690 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
276a0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
276b0 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  is.      ** impo
276c0 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
276d0 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
276e0 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
276f0 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
27700 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
27710 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65  lock. If it were
27720 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  , another proces
27730 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65  s might open the
27740 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
27750 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
27760 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
27770 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
27780 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
27790 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61  * database is sa
277a0 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65  fe to read while
277b0 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
277c0 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74   still rolling t
277d0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74  he .      ** hot
277e0 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20  -journal back.. 
277f0 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
27800 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
27810 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
27820 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
27830 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20  requested, any. 
27840 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72       ** other pr
27850 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67  ocess attempting
27860 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
27870 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
27880 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20  l get to .      
27890 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  ** this point in
278a0 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
278b0 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73  il to obtain its
278c0 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c   own EXCLUSIVE l
278d0 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  ock .      ** on
278e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
278f0 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  le..      */.   
27900 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
27910 74 61 74 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c  tate<EXCLUSIVE_L
27920 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  OCK ){.        r
27930 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
27940 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58  k(pPager->fd, EX
27950 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
27960 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
27970 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27980 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
27990 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
279a0 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  c);.          go
279b0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
279c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
279d0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
279e0 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
279f0 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a      }. .      /*
27a00 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
27a10 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  l for read/write
27a20 20 61 63 63 65 73 73 2e 20 54 68 69 73 20 69 73   access. This is
27a30 20 62 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20   because in .   
27a40 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d     ** exclusive-
27a50 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20  access mode the 
27a60 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
27a70 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65  will be kept ope
27a80 6e 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70  n and.      ** p
27a90 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72  ossibly used for
27aa0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c   a transaction l
27ab0 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65  ater on. On some
27ac0 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20   systems, the.  
27ad0 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74      ** OsTruncat
27ae0 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69 6e  e() call used in
27af0 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
27b00 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71 75  s mode also requ
27b10 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  ires.      ** a 
27b20 72 65 61 64 2f 77 72 69 74 65 20 66 69 6c 65 20  read/write file 
27b30 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20 2a 2f  handle..      */
27b40 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4f 70  .      if( !isOp
27b50 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
27b60 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
27b70 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  es;.        rc =
27b80 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
27b90 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a  (pVfs,pPager->zJ
27ba0 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43  ournal,SQLITE_AC
27bb0 43 45 53 53 5f 45 58 49 53 54 53 2c 26 72 65 73  CESS_EXISTS,&res
27bc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
27bd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27be0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65            if( re
27bf0 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
27c00 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20   int fout = 0;. 
27c10 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66             int f
27c20 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
27c30 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
27c40 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
27c50 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  L;.            a
27c60 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
27c70 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
27c80 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
27c90 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
27ca0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
27cb0 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
27cc0 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20  f, &fout);.     
27cd0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
27ce0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
27cf0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
27d00 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  fd) );.         
27d10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
27d20 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c  E_OK && fout&SQL
27d30 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
27d40 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  Y ){.           
27d50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
27d60 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
27d70 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
27d80 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
27d90 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
27da0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
27db0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27dc0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f      /* If the jo
27dd0 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65  urnal does not e
27de0 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79  xist, it usually
27df0 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65   means that some
27e00 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
27e10 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
27e20 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74  n managed to get
27e30 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20   in and roll it 
27e40 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20  back before .   
27e50 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
27e60 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61   connection obta
27e70 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73 69  ined the exclusi
27e80 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f  ve lock above. O
27e90 72 2c 20 69 74 20 0a 20 20 20 20 20 20 20 20 20  r, it .         
27ea0 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74     ** may mean t
27eb0 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61  hat the pager wa
27ec0 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  s in the error-s
27ed0 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20  tate when this. 
27ee0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75             ** fu
27ef0 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
27f00 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  d and the journa
27f10 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  l file does not 
27f20 65 78 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20  exist.  */.     
27f30 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
27f40 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
27f50 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  n(pPager, 0);.  
27f60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27f70 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
27f80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27f90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
27fa0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
27fb0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65    }..      /* Re
27fc0 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  set the journal 
27fd0 73 74 61 74 75 73 20 66 69 65 6c 64 73 20 74 6f  status fields to
27fe0 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
27ff0 77 65 20 68 61 76 65 20 6e 6f 0a 20 20 20 20 20  we have no.     
28000 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75   ** rollback jou
28010 72 6e 61 6c 20 61 74 20 74 68 69 73 20 74 69 6d  rnal at this tim
28020 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67  e. */.      pPag
28030 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
28040 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ed = 0;.      pP
28050 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
28060 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
28070 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
28080 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
28090 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
280a0 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  . .      /* Make
280b0 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61   sure the journa
280c0 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  l file has been 
280d0 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20  synced to disk. 
280e0 2a 2f 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c  */. .      /* Pl
280f0 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
28100 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
28110 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
28120 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  e write.      **
28130 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75   lock and reacqu
28140 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
28150 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63 61 63  k. Purge the cac
28160 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20  he before.      
28170 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  ** playing back 
28180 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  the hot-journal 
28190 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74  so that we don't
281a0 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20   end up with.   
281b0 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69     ** an inconsi
281c0 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79  stent cache.  Sy
281d0 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e  nc the hot journ
281e0 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e  al before playin
281f0 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61  g.      ** it ba
28200 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f  ck since the pro
28210 63 65 73 73 20 74 68 61 74 20 63 72 61 73 68 65  cess that crashe
28220 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68  d and left the h
28230 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  ot journal.     
28240 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64   ** probably did
28250 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64   not sync it and
28260 20 77 65 20 61 72 65 20 72 65 71 75 69 72 65 64   we are required
28270 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a   to always sync.
28280 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75        ** the jou
28290 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79  rnal before play
282a0 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20  ing it back..   
282b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
282c0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
282d0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  fd) ){.        r
282e0 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74  c = pagerSyncHot
282f0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
28300 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
28310 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28320 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
28330 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
28340 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  er, 1);.        
28350 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
28360 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
28370 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
28380 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
28390 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20  , rc);.         
283a0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
283b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
283c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
283d0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
283e0 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20  GER_SHARED).    
283f0 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
28400 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
28410 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74   && pPager->stat
28420 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a  e>PAGER_SHARED).
28430 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
28440 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
28450 70 42 61 63 6b 75 70 20 7c 7c 20 73 71 6c 69 74  pBackup || sqlit
28460 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e  e3PcachePagecoun
28470 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
28480 65 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  e)>0 ){.      /*
28490 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b   The shared-lock
284a0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
284b0 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64  cquired on the d
284c0 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20  atabase file.   
284d0 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20     ** and there 
284e0 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65  are already page
284f0 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28  s in the cache (
28500 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a  from a previous.
28510 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72        ** read or
28520 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
28530 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  on).  Check to s
28540 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ee if the databa
28550 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  se.      ** has 
28560 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20  been modified.  
28570 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
28580 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75  has changed, flu
28590 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  sh the.      ** 
285a0 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  cache..      **.
285b0 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73        ** Databas
285c0 65 20 63 68 61 6e 67 65 73 20 69 73 20 64 65 74  e changes is det
285d0 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67  ected by looking
285e0 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67   at 15 bytes beg
285f0 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  inning.      ** 
28600 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74  at offset 24 int
28610 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65  o the file.  The
28620 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73   first 4 of thes
28630 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20  e 16 bytes are. 
28640 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74       ** a 32-bit
28650 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73   counter that is
28660 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74   incremented wit
28670 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20  h each change.  
28680 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  The.      ** oth
28690 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20  er bytes change 
286a0 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61  randomly with ea
286b0 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77  ch file change w
286c0 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63  hen.      ** a c
286d0 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a  odec is in use..
286e0 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
286f0 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61  ** There is a va
28700 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
28710 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68  chance that a ch
28720 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ange will not be
28730 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63   .      ** detec
28740 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65  ted.  The chance
28750 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65   of an undetecte
28760 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73  d change is so s
28770 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20  mall that.      
28780 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67  ** it can be neg
28790 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f  lected..      */
287a0 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65  .      int nPage
287b0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46  ;.      char dbF
287c0 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70  ileVers[sizeof(p
287d0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
287e0 73 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  s)];.      sqlit
287f0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
28800 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
28810 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ;..      if( pPa
28820 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
28830 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 50 61          rc = pPa
28840 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
28850 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
28860 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
28870 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b    if( nPage>0 ){
28880 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
28890 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c  (("CKVERS %p %d\
288a0 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65  n", pPager, size
288b0 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29  of(dbFileVers)))
288c0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
288d0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
288e0 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65  ger->fd, &dbFile
288f0 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
28900 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20  ileVers), 24);. 
28910 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
28920 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28930 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
28940 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
28950 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28960 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56    memset(dbFileV
28970 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ers, 0, sizeof(d
28980 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
28990 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
289a0 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64  memcmp(pPager->d
289b0 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
289c0 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
289d0 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b  FileVers))!=0 ){
289e0 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
289f0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
28a00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
28a10 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
28a20 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
28a30 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
28a40 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
28a50 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
28a60 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20 69   is a WAL file i
28a70 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
28a80 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61 74  m, open this dat
28a90 61 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20 20  abase in WAL.   
28aa0 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77   ** mode. Otherw
28ab0 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ise, the followi
28ac0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ng function call
28ad0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20   is a no-op..   
28ae0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
28af0 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65  erOpenWalIfPrese
28b00 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  nt(pPager);.  }.
28b10 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  . failed:.  if( 
28b20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
28b30 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 75 6e  .    /* pager_un
28b40 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f  lock() is a no-o
28b50 70 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20  p for exclusive 
28b60 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f  mode and in-memo
28b70 72 79 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f  ry databases. */
28b80 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63  .    pager_unloc
28b90 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
28ba0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
28bb0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65  *.** If the refe
28bc0 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20  rence count has 
28bd0 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f  reached zero, ro
28be0 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
28bf0 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
28c00 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
28c10 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63  pager..**.** Exc
28c20 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  ept, in locking_
28c30 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77  mode=EXCLUSIVE w
28c40 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74  hen there is not
28c50 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68  hing to in.** th
28c60 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
28c70 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69  al, the unlock i
28c80 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20  s not performed 
28c90 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  and there is.** 
28ca0 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62  nothing to rollb
28cb0 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75  ack, so this rou
28cc0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
28cd0 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
28ce0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
28cf0 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67  used(Pager *pPag
28d00 65 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c 69  er){.  if( (sqli
28d10 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
28d20 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
28d30 65 29 3d 3d 30 29 0a 20 20 20 26 26 20 28 21 70  e)==0).   && (!p
28d40 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
28d50 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mode || pPager->
28d60 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 0a 20  journalOff>0) . 
28d70 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c   ){.    pagerUnl
28d80 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
28d90 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Pager);.  }.}../
28da0 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72  *.** Acquire a r
28db0 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
28dc0 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20   number pgno in 
28dd0 70 61 67 65 72 20 70 50 61 67 65 72 20 28 61 20  pager pPager (a 
28de0 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  page.** referenc
28df0 65 20 68 61 73 20 74 79 70 65 20 44 62 50 61 67  e has type DbPag
28e00 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71 75  e*). If the requ
28e10 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65 20  ested reference 
28e20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  is .** successfu
28e30 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74  lly obtained, it
28e40 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70   is copied to *p
28e50 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45  pPage and SQLITE
28e60 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
28e70 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
28e80 73 74 65 64 20 70 61 67 65 20 69 73 20 61 6c 72  sted page is alr
28e90 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68  eady in the cach
28ea0 65 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e 65  e, it is returne
28eb0 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  d. .** Otherwise
28ec0 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a  , a new page obj
28ed0 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ect is allocated
28ee0 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
28ef0 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64  ith data.** read
28f00 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
28f10 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65  se file. In some
28f20 20 63 61 73 65 73 2c 20 74 68 65 20 70 63 61 63   cases, the pcac
28f30 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a  he module may.**
28f40 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61   choose not to a
28f50 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
28f60 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61  ge object and ma
28f70 79 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74  y reuse an exist
28f80 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69  ing.** object wi
28f90 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  th no outstandin
28fa0 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a  g references..**
28fb0 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64 61  .** The extra da
28fc0 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61  ta appended to a
28fd0 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20   page is always 
28fe0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a  initialized to z
28ff0 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72  eros the .** fir
29000 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  st time a page i
29010 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65  s loaded into me
29020 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61 67  mory. If the pag
29030 65 20 72 65 71 75 65 73 74 65 64 20 69 73 20 0a  e requested is .
29040 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
29050 65 20 63 61 63 68 65 20 77 68 65 6e 20 74 68 69  e cache when thi
29060 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
29070 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65  lled, then the e
29080 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20  xtra.** data is 
29090 6c 65 66 74 20 61 73 20 69 74 20 77 61 73 20 77  left as it was w
290a0 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a  hen the page obj
290b0 65 63 74 20 77 61 73 20 6c 61 73 74 20 75 73 65  ect was last use
290c0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
290d0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 69  database image i
290e0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  s smaller than t
290f0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
29100 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f  e or if a .** no
29110 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20  n-zero value is 
29120 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f  passed as the no
29130 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65  Content paramete
29140 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65  r and the .** re
29150 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
29160 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72  not already stor
29170 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  ed in the cache,
29180 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74   then no .** act
29190 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63  ual disk read oc
291a0 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  curs. In this ca
291b0 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d  se the memory im
291c0 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  age of the .** p
291d0 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
291e0 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e  ed to all zeros.
291f0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e   .**.** If noCon
29200 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74  tent is true, it
29210 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
29220 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
29230 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   the contents.**
29240 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54 68   of the page. Th
29250 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f  is occurs in two
29260 20 73 65 70 65 72 61 74 65 20 73 63 65 6e 61 72   seperate scenar
29270 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  ios:.**.**   a) 
29280 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66  When reading a f
29290 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
292a0 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
292b0 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  base, and.**.** 
292c0 20 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65    b) When a save
292d0 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72  point is being r
292e0 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77  olled back and w
292f0 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a  e need to load.*
29300 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67  *      a new pag
29310 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  e into the cache
29320 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69   to be filled wi
29330 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64  th the data read
29340 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68  .**      from th
29350 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72  e savepoint jour
29360 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  nal..**.** If no
29370 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c  Content is true,
29380 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 72   then the data r
29390 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65  eturned is zeroe
293a0 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
293b0 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20  being read from 
293c0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64  the database. Ad
293d0 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20  ditionally, the 
293e0 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  bits correspondi
293f0 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e  ng.** to pgno in
29400 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
29410 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70 61 67  l (bitvec of pag
29420 65 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 74  es already writt
29430 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75  en to the.** jou
29440 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74  rnal file) and t
29450 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
29460 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62  t.pInSavepoint b
29470 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70  itvecs of any op
29480 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73  en.** savepoints
29490 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d   are set. This m
294a0 65 61 6e 73 20 69 66 20 74 68 65 20 70 61 67 65  eans if the page
294b0 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c   is made writabl
294c0 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e  e at any.** poin
294d0 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c  t in the future,
294e0 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f   using a call to
294f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
29500 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e  te(), its conten
29510 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  ts.** will not b
29520 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69  e journaled. Thi
29530 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a  s saves IO..**.*
29540 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
29550 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
29560 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
29570 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
29580 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
29590 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
295a0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
295b0 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
295c0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
295d0 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
295e0 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68  rLookup().  Both
295f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
29600 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d  d Lookup() attem
29610 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20  pt.** to find a 
29620 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d  page in the in-m
29630 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73  emory cache firs
29640 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  t.  If the page 
29650 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
29660 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69  * in memory, thi
29670 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  s routine goes t
29680 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69  o disk to read i
29690 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f  t in whereas Loo
296a0 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65  kup().** just re
296b0 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72  turns 0.  This r
296c0 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20  outine acquires 
296d0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20  a read-lock the 
296e0 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a  first time it.**
296f0 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69   has to go to di
29700 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c  sk, and could al
29710 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f  so playback an o
29720 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ld journal if ne
29730 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63  cessary..** Sinc
29740 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72  e Lookup() never
29750 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
29760 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
29770 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
29780 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
29790 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
297a0 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 0a  e3PagerAcquire(.
297b0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
297c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
297d0 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64  er open on the d
297e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
297f0 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
29800 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
29810 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f  mber to fetch */
29820 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61  .  DbPage **ppPa
29830 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ge,    /* Write 
29840 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
29850 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
29860 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20  int noContent   
29870 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f      /* Do not bo
29880 74 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e  ther reading con
29890 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69  tent from disk i
298a0 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69  f true */.){.  i
298b0 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
298c0 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pPg;..  assert( 
298d0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
298e0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
298f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
29900 73 74 61 74 65 3e 50 41 47 45 52 5f 55 4e 4c 4f  state>PAGER_UNLO
29910 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e  CK );..  if( pgn
29920 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  o==0 ){.    retu
29930 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
29940 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
29950 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
29960 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
29970 74 61 74 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  tate, return an 
29980 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c  error immediatel
29990 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  y. .  ** Otherwi
299a0 73 65 2c 20 72 65 71 75 65 73 74 20 74 68 65 20  se, request the 
299b0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 50 43  page from the PC
299c0 61 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20  ache layer. */. 
299d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
299e0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code!=SQLITE_OK 
299f0 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
29a00 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
29a10 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
29a20 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
29a30 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
29a40 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
29a50 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
29a60 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 70 70 50 61  e, pgno, 1, ppPa
29a70 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ge);.  }..  if( 
29a80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29a90 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74  .    /* Either t
29aa0 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
29ab0 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20  e3PcacheFetch() 
29ac0 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f  returned an erro
29ad0 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  r or the.    ** 
29ae0 70 61 67 65 72 20 77 61 73 20 61 6c 72 65 61 64  pager was alread
29af0 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  y in the error-s
29b00 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
29b10 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
29b20 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 70  ed..    ** Set p
29b30 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70  Pg to 0 and jump
29b40 20 74 6f 20 74 68 65 20 65 78 63 65 70 74 69 6f   to the exceptio
29b50 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20  n handler.  */. 
29b60 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20     pPg = 0;.    
29b70 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
29b80 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73  re_err;.  }.  as
29b90 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d  sert( (*ppPage)-
29ba0 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20  >pgno==pgno );. 
29bb0 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
29bc0 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  e)->pPager==pPag
29bd0 65 72 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d  er || (*ppPage)-
29be0 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20  >pPager==0 );.. 
29bf0 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e   if( (*ppPage)->
29c00 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e  pPager && !noCon
29c10 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  tent ){.    /* I
29c20 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
29c30 70 63 61 63 68 65 20 61 6c 72 65 61 64 79 20 63  pcache already c
29c40 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69  ontains an initi
29c50 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20  alized copy of. 
29c60 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20     ** the page. 
29c70 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66  Return without f
29c80 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a  urther ado.  */.
29c90 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
29ca0 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  <=PAGER_MAX_PGNO
29cb0 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f   && pgno!=PAGER_
29cc0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
29cd0 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43  );.    PAGER_INC
29ce0 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b  R(pPager->nHit);
29cf0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
29d00 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b  TE_OK;..  }else{
29d10 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
29d20 72 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61  r cache has crea
29d30 74 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20  ted a new page. 
29d40 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64  Its content need
29d50 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20  s to .    ** be 
29d60 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f  initialized.  */
29d70 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 0a  .    int nMax;..
29d80 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
29d90 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20  Pager->nMiss);. 
29da0 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65     pPg = *ppPage
29db0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  ;.    pPg->pPage
29dc0 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20  r = pPager;..   
29dd0 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
29de0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32  page number is 2
29df0 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ^31. Return SQLI
29e00 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20  TE_CORRUPT if a 
29e10 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62  page.    ** numb
29e20 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
29e30 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75  this, or the unu
29e40 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65  sed locking-page
29e50 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 20  , is requested. 
29e60 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  */.    if( pgno>
29e70 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c  PAGER_MAX_PGNO |
29e80 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
29e90 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
29ea0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
29eb0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
29ec0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
29ed0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
29ee0 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 73     }..    rc = s
29ef0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
29f00 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 4d  ount(pPager, &nM
29f10 61 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ax);.    if( rc!
29f20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29f30 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
29f40 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
29f50 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  }..    if( MEMDB
29f60 20 7c 7c 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67   || nMax<(int)pg
29f70 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20  no || noContent 
29f80 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  || !isOpen(pPage
29f90 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20  r->fd) ){.      
29fa0 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
29fb0 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  >mxPgno ){.     
29fc0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
29fd0 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ULL;.        got
29fe0 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
29ff0 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
2a000 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74     if( noContent
2a010 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
2a020 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68  ailure to set th
2a030 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e  e bits in the In
2a040 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74  Journal bit-vect
2a050 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20  ors is benign.. 
2a060 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72         ** It mer
2a070 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77  ely means that w
2a080 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20  e might do some 
2a090 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f  extra work to jo
2a0a0 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20  urnal a .       
2a0b0 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f   ** page that do
2a0c0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
2a0d0 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65  e journaled.  Ne
2a0e0 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73  vertheless, be s
2a0f0 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
2a100 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73 65  to test the case
2a110 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20   where a malloc 
2a120 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
2a130 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74  le trying to set
2a140 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62   .        ** a b
2a150 69 74 20 69 6e 20 61 20 62 69 74 20 76 65 63 74  it in a bit vect
2a160 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  or..        */. 
2a170 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
2a180 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
2a190 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2a1a0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
2a1b0 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  rigSize ){.     
2a1c0 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
2a1d0 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74  c = ) sqlite3Bit
2a1e0 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
2a1f0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29  InJournal, pgno)
2a200 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
2a210 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
2a220 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
2a230 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54    }.        TEST
2a240 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64  ONLY( rc = ) add
2a250 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
2a260 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  cs(pPager, pgno)
2a270 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
2a280 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
2a290 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
2a2a0 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
2a2b0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
2a2c0 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
2a2d0 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50  Pg->pData, 0, pP
2a2e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
2a2f0 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
2a300 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20  "ZERO %p %d\n", 
2a310 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
2a320 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a330 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
2a340 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
2a350 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
2a360 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  bPage(pPg);.    
2a370 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a380 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
2a390 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
2a3a0 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
2a3b0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
2a3c0 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
2a3d0 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
2a3e0 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
2a3f0 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
2a400 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
2a410 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61  ITE_OK;..pager_a
2a420 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73  cquire_err:.  as
2a430 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
2a440 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67  _OK );.  if( pPg
2a450 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
2a460 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a  cacheDrop(pPg);.
2a470 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63    }.  pagerUnloc
2a480 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
2a490 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  );..  *ppPage = 
2a4a0 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
2a4b0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
2a4c0 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73   a page if it is
2a4d0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
2a4e0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
2a4f0 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64    Do.** not read
2a500 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64   the page from d
2a510 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70  isk.  Return a p
2a520 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
2a530 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74  ge,.** or 0 if t
2a540 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
2a550 6e 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 20 72  n cache. Also, r
2a560 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 0a  eturn 0 if the .
2a570 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20 50  ** pager is in P
2a580 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74  AGER_UNLOCK stat
2a590 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
2a5a0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a  tion is called,.
2a5b0 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 70 61 67  ** or if the pag
2a5c0 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f  er is in an erro
2a5d0 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68  r state other th
2a5e0 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 0a  an SQLITE_FULL..
2a5f0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
2a600 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
2a610 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
2a620 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
2a630 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
2a640 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
2a650 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77  is that _get() w
2a660 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69  ill go to the di
2a670 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69  sk and read.** i
2a680 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68  n the page if th
2a690 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
2a6a0 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20  ready in cache. 
2a6b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
2a6c0 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
2a6d0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
2a6e0 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20   in cache or if 
2a6f0 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72  a disk I/O error
2a700 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61   .** has ever ha
2a710 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67  ppened..*/.DbPag
2a720 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c  e *sqlite3PagerL
2a730 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
2a740 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
2a750 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
2a760 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  0;.  assert( pPa
2a770 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
2a780 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
2a790 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2a7a0 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20  >pPCache!=0 );. 
2a7b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2a7c0 3e 73 74 61 74 65 20 3e 20 50 41 47 45 52 5f 55  >state > PAGER_U
2a7d0 4e 4c 4f 43 4b 20 29 3b 0a 20 20 73 71 6c 69 74  NLOCK );.  sqlit
2a7e0 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
2a7f0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
2a800 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20  gno, 0, &pPg);. 
2a810 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a   return pPg;.}..
2a820 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
2a830 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a  page reference..
2a840 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
2a850 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
2a860 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
2a870 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
2a880 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
2a890 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
2a8a0 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
2a8b0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
2a8c0 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
2a8d0 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
2a8e0 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
2a8f0 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
2a900 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
2a910 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  emoved..*/.void 
2a920 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2a930 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
2a940 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
2a950 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2a960 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
2a970 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
2a980 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 20  elease(pPg);.   
2a990 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
2a9a0 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20  used(pPager);.  
2a9b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
2a9c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2a9d0 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
2a9e0 6f 66 20 65 76 65 72 79 20 77 72 69 74 65 20 74  of every write t
2a9f0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54  ransaction..** T
2aa00 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64  here must alread
2aa10 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44 20  y be a RESERVED 
2aa20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
2aa30 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2aa40 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20  e .** file when 
2aa50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
2aa60 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70  called..**.** Op
2aa70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
2aa80 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
2aa90 61 67 65 72 20 61 6e 64 20 77 72 69 74 65 20 61  ager and write a
2aaa0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
2aab0 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ** to the start 
2aac0 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72 65 20  of it. If there 
2aad0 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70  are active savep
2aae0 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20  oints, open the 
2aaf0 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61  sub-journal.** a
2ab00 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e  s well. This fun
2ab10 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ction is only us
2ab20 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  ed when the jour
2ab30 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e  nal file is bein
2ab40 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20  g .** opened to 
2ab50 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b  write a rollback
2ab60 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73   log for a trans
2ab70 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f  action. It is no
2ab80 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20  t used .** when 
2ab90 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f  opening a hot jo
2aba0 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f  urnal file to ro
2abb0 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  ll it back..**.*
2abc0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
2abd0 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79   file is already
2abe0 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79   open (as it may
2abf0 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65   be in exclusive
2ac00 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20   mode),.** then 
2ac10 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75  this function ju
2ac20 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72  st writes a jour
2ac30 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68  nal header to th
2ac40 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a  e start of the.*
2ac50 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66  * already open f
2ac60 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ile. .**.** Whet
2ac70 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
2ac80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
2ac90 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  pened by this fu
2aca0 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50  nction, the.** P
2acb0 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
2acc0 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65  bitvec structure
2acd0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a   is allocated..*
2ace0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
2acf0 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
2ad00 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
2ad10 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  l. Otherwise, re
2ad20 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
2ad30 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74  NOMEM if the att
2ad40 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  empt to allocate
2ad50 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
2ad60 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20  l fails, or .** 
2ad70 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
2ad80 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77   if opening or w
2ad90 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  riting the journ
2ada0 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a  al file fails..*
2adb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
2adc0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
2add0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2ade0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2adf0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2ae00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ae10 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2ae20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
2ae30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2ae50 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20  ize of database 
2ae60 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  file */.  sqlite
2ae70 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
2ae80 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
2ae90 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  s;   /* Local ca
2aea0 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74  che of vfs point
2aeb0 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
2aec0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
2aed0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
2aee0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2aef0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
2af00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2af10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
2af20 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2af30 44 45 5f 4f 46 46 20 29 3b 0a 20 20 61 73 73 65  DE_OFF );.  asse
2af40 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
2af50 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a  ournal==0 );.  .
2af60 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20    /* If already 
2af70 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
2af80 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  te, this functio
2af90 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42  n is a no-op.  B
2afa0 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f  ut on.  ** the o
2afb0 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20  ther hand, this 
2afc0 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
2afd0 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72   called if we ar
2afe0 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a  e already in.  *
2aff0 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  * an error state
2b000 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
2b010 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
2b020 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  ) ) return pPage
2b030 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 74  r->errCode;..  t
2b040 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d  estcase( pPager-
2b050 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20  >dbSizeValid==0 
2b060 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
2b070 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
2b080 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
2b090 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
2b0a0 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d  rn rc;.  pPager-
2b0b0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >pInJournal = sq
2b0c0 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
2b0d0 65 28 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(nPage);.  if( 
2b0e0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
2b0f0 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  al==0 ){.    ret
2b100 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2b110 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
2b120 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2b130 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  e if it is not a
2b140 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a  lready open. */.
2b150 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
2b160 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
2b170 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
2b180 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
2b190 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
2b1a0 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ORY ){.      sql
2b1b0 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70  ite3MemJournalOp
2b1c0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  en(pPager->jfd);
2b1d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2b1e0 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
2b1f0 73 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20  s =             
2b200 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61        /* VFS fla
2b210 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e  gs to open journ
2b220 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20  al file */.     
2b230 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
2b240 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
2b250 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20  OPEN_CREATE|.   
2b260 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65       (pPager->te
2b270 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20  mpFile ? .      
2b280 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
2b290 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53  _DELETEONCLOSE|S
2b2a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
2b2b0 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20  JOURNAL):.      
2b2c0 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
2b2d0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20  _MAIN_JOURNAL). 
2b2e0 20 20 20 20 20 20 20 29 3b 0a 23 69 66 64 65 66         );.#ifdef
2b2f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
2b300 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
2b310 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
2b320 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20  urnalOpen(.     
2b330 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65       pVfs, pPage
2b340 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
2b350 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
2b360 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
2b370 70 50 61 67 65 72 29 0a 20 20 20 20 20 20 29 3b  pPager).      );
2b380 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20  .#else.      rc 
2b390 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
2b3a0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
2b3b0 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
2b3c0 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  jfd, flags, 0);.
2b3d0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
2b3e0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
2b3f0 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
2b400 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
2b410 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 57 72 69 74  .  }...  /* Writ
2b420 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  e the first jour
2b430 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68  nal header to th
2b440 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
2b450 6e 64 20 6f 70 65 6e 20 0a 20 20 2a 2a 20 74 68  nd open .  ** th
2b460 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66  e sub-journal if
2b470 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
2b480 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2b490 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54  E_OK ){.    /* T
2b4a0 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c  ODO: Check if al
2b4b0 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65 20 72  l of these are r
2b4c0 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20  eally required. 
2b4d0 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  */.    pPager->d
2b4e0 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67  bOrigSize = pPag
2b4f0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
2b500 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
2b510 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
2b520 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
2b530 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
2b540 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
2b550 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2b560 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ff = 0;.    pPag
2b570 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
2b580 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  0;.    pPager->j
2b590 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
2b5a0 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
2b5b0 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
2b5c0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
2b5d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b5e0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
2b5f0 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
2b600 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
2b610 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
2b620 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  l = 0;.  }.  ret
2b630 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2b640 20 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74   Begin a write-t
2b650 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
2b660 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
2b670 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a  r object. If a .
2b680 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ** write-transac
2b690 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
2b6a0 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68   been opened, th
2b6b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
2b6c0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
2b6d0 20 74 68 65 20 65 78 46 6c 61 67 20 61 72 67 75   the exFlag argu
2b6e0 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74  ment is false, t
2b6f0 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c  hen acquire at l
2b700 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 0a  east a RESERVED.
2b710 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ** lock on the d
2b720 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
2b730 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c   exFlag is true,
2b740 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74   then acquire at
2b750 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43   least.** an EXC
2b760 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
2b770 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61  such a lock is a
2b780 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20  lready held, no 
2b790 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63  locking .** func
2b7a0 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61  tions need be ca
2b7b0 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lled..**.** If t
2b7c0 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d  his is not a tem
2b7d0 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d  porary or in-mem
2b7e0 6f 72 79 20 66 69 6c 65 20 61 6e 64 2c 20 74 68  ory file and, th
2b7f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2b800 73 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 69 66 20  s .** opened if 
2b810 69 74 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  it has not been 
2b820 61 6c 72 65 61 64 79 2e 20 46 6f 72 20 61 20 74  already. For a t
2b830 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 20 74  emporary file, t
2b840 68 65 20 6f 70 65 6e 69 6e 67 20 0a 2a 2a 20 6f  he opening .** o
2b850 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2b860 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75  le is deferred u
2b870 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e  ntil there is an
2b880 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20   actual need to 
2b890 0a 2a 2a 20 77 72 69 74 65 20 74 6f 20 74 68 65  .** write to the
2b8a0 20 6a 6f 75 72 6e 61 6c 2e 20 54 4f 44 4f 3a 20   journal. TODO: 
2b8b0 57 68 79 20 68 61 6e 64 6c 65 20 74 65 6d 70 6f  Why handle tempo
2b8c0 72 61 72 79 20 66 69 6c 65 73 20 64 69 66 66 65  rary files diffe
2b8d0 72 65 6e 74 6c 79 3f 0a 2a 2a 0a 2a 2a 20 49 66  rently?.**.** If
2b8e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2b8f0 65 20 69 73 20 6f 70 65 6e 65 64 20 28 6f 72 20  e is opened (or 
2b900 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
2b910 20 6f 70 65 6e 29 2c 20 74 68 65 6e 20 61 0a 2a   open), then a.*
2b920 2a 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  * journal-header
2b930 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
2b940 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 0a  he start of it..
2b950 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62  **.** If the sub
2b960 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65  jInMemory argume
2b970 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  nt is non-zero, 
2b980 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75  then any sub-jou
2b990 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77  rnal opened.** w
2b9a0 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
2b9b0 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f  action will be o
2b9c0 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
2b9d0 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73  emory file. This
2b9e0 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63  .** has no effec
2b9f0 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75  t if the sub-jou
2ba00 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20  rnal is already 
2ba10 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61  opened (as it ma
2ba20 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e  y be when.** run
2ba30 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
2ba40 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68  e mode) or if th
2ba50 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f  e transaction do
2ba60 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
2ba70 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  .** sub-journal.
2ba80 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65   If the subjInMe
2ba90 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73  mory argument is
2baa0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20   zero, then any 
2bab0 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d  required.** sub-
2bac0 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65  journal is imple
2bad0 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79  mented in-memory
2bae0 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61 6e   if pPager is an
2baf0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
2bb00 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e  ase, .** or usin
2bb10 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  g a temporary fi
2bb20 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  le otherwise..*/
2bb30 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2bb40 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  rBegin(Pager *pP
2bb50 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67  ager, int exFlag
2bb60 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f  , int subjInMemo
2bb70 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ry){.  int rc = 
2bb80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
2bb90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
2bba0 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
2bbb0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75   );.  pPager->su
2bbc0 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38  bjInMemory = (u8
2bbd0 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a  )subjInMemory;..
2bbe0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
2bbf0 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
2bc00 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
2bc10 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
2bc20 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  nal==0 );.    as
2bc30 73 65 72 74 28 20 21 4d 45 4d 44 42 20 26 26 20  sert( !MEMDB && 
2bc40 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
2bc50 65 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61  e );..    if( pa
2bc60 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2bc70 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
2bc80 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63 6f   the pager is co
2bc90 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20  nfigured to use 
2bca0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
2bcb0 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20  lusive, and an. 
2bcc0 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76       ** exclusiv
2bcd0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
2bce0 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c  tabase is not al
2bcf0 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61  ready held, obta
2bd00 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20  in it now..     
2bd10 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
2bd20 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2bd30 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33 57 61  ode && sqlite3Wa
2bd40 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70  lExclusiveMode(p
2bd50 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29  Pager->pWal, -1)
2bd60 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2bd70 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
2bd80 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55  Pager->fd, EXCLU
2bd90 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
2bda0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
2bdb0 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
2bdc0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2bdd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2bde0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2bdf0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
2be00 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
2be10 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
2be20 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a  ager->pWal, 1);.
2be30 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
2be40 2a 20 47 72 61 62 20 74 68 65 20 77 72 69 74 65  * Grab the write
2be50 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67   lock on the log
2be60 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73   file. If succes
2be70 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f  sful, upgrade to
2be80 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f  .      ** PAGER_
2be90 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20  RESERVED state. 
2bea0 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
2beb0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
2bec0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  to the caller.. 
2bed0 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79       ** The busy
2bee0 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20  -handler is not 
2bef0 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68  invoked if anoth
2bf00 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c  er connection al
2bf10 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68  ready.      ** h
2bf20 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c  olds the write-l
2bf30 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ock. If possible
2bf40 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  , the upper laye
2bf50 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a  r will call it..
2bf60 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2bf70 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73 20  * WAL mode sets 
2bf80 50 61 67 65 72 2e 73 74 61 74 65 20 74 6f 20 50  Pager.state to P
2bf90 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 77 68  AGER_RESERVED wh
2bfa0 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65  en it has an ope
2bfb0 6e 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73  n.      ** trans
2bfc0 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65  action, but neve
2bfd0 72 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55  r to PAGER_EXCLU
2bfe0 53 49 56 45 2e 20 54 68 69 73 20 69 73 20 62 65  SIVE. This is be
2bff0 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20  cause in .      
2c000 2a 2a 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  ** PAGER_EXCLUSI
2c010 56 45 20 73 74 61 74 65 20 74 68 65 20 63 6f 64  VE state the cod
2c020 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73  e to roll back s
2c030 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63  avepoint transac
2c040 74 69 6f 6e 73 0a 20 20 20 20 20 20 2a 2a 20 6d  tions.      ** m
2c050 61 79 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f  ay copy data fro
2c060 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
2c070 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  l into the datab
2c080 61 73 65 20 66 69 6c 65 20 61 73 20 77 65 6c 6c  ase file as well
2c090 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 6e 74  .      ** as int
2c0a0 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  o the page cache
2c0b0 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65  . Which would be
2c0c0 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 57 41   incorrect in WA
2c0d0 4c 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f  L mode..      */
2c0e0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2c0f0 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65  te3WalBeginWrite
2c100 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
2c110 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 20  er->pWal);.     
2c120 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c130 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  OK ){.        pP
2c140 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
2c150 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
2c160 65 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  e;.        pPage
2c170 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
2c180 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20  _RESERVED;.     
2c190 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2c1a0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
2c1b0 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
2c1c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c1d0 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
2c1e0 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
2c1f0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2c200 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c210 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
2c220 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  ==PAGER_SHARED )
2c230 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2c240 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52     /* Obtain a R
2c250 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
2c260 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2c270 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61 67  e. If the exFlag
2c280 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20   parameter.     
2c290 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65   ** is true, the
2c2a0 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70  n immediately up
2c2b0 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e  grade this to an
2c2c0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
2c2d0 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75   The.      ** bu
2c2e0 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
2c2f0 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20  ack can be used 
2c300 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74  when upgrading t
2c310 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a  o the EXCLUSIVE.
2c320 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62        ** lock, b
2c330 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61  ut not when obta
2c340 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52 56  ining the RESERV
2c350 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a  ED lock..      *
2c360 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
2c370 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
2c380 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f  r->fd, RESERVED_
2c390 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
2c3a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2c3b0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
2c3c0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
2c3d0 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20  RESERVED;.      
2c3e0 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a    if( exFlag ){.
2c3f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
2c400 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
2c410 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
2c420 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
2c430 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2c440 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65   }..    /* No ne
2c450 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a  ed to open the j
2c460 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74  ournal file at t
2c470 68 69 73 20 74 69 6d 65 2e 20 20 49 74 20 77 69  his time.  It wi
2c480 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 6f 70 65  ll be.    ** ope
2c490 6e 65 64 20 62 65 66 6f 72 65 20 69 74 20 69 73  ned before it is
2c4a0 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 20 49 66   written to.  If
2c4b0 20 77 65 20 64 65 66 65 72 20 6f 70 65 6e 69 6e   we defer openin
2c4c0 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 0a 20  g the journal,. 
2c4d0 20 20 20 2a 2a 20 77 65 20 6d 69 67 68 74 20 73     ** we might s
2c4e0 61 76 65 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  ave the work of 
2c4f0 63 72 65 61 74 69 6e 67 20 61 20 66 69 6c 65 20  creating a file 
2c500 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
2c510 6f 6e 0a 20 20 20 20 2a 2a 20 65 6e 64 73 20 75  on.    ** ends u
2c520 70 20 62 65 69 6e 67 20 61 20 6e 6f 2d 6f 70 2e  p being a no-op.
2c530 0a 20 20 20 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  .    */.  }else 
2c540 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
2c550 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65  r->jfd) && pPage
2c560 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
2c570 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
2c580 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68 65  happens when the
2c590 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 78   pager was in ex
2c5a0 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
2c5b0 6f 64 65 20 74 68 65 20 6c 61 73 74 0a 20 20 20  ode the last.   
2c5c0 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64   ** time a (read
2c5d0 20 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73   or write) trans
2c5e0 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65  action was succe
2c5f0 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65  ssfully conclude
2c600 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73  d.    ** by this
2c610 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73   connection. Ins
2c620 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67  tead of deleting
2c630 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2c640 65 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a  e it was .    **
2c650 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 65   kept open and e
2c660 69 74 68 65 72 20 77 61 73 20 74 72 75 6e 63 61  ither was trunca
2c670 74 65 64 20 74 6f 20 30 20 62 79 74 65 73 20 6f  ted to 0 bytes o
2c680 72 20 69 74 73 20 68 65 61 64 65 72 20 77 61 73  r its header was
2c690 0a 20 20 20 20 2a 2a 20 6f 76 65 72 77 72 69 74  .    ** overwrit
2c6a0 74 65 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a  ten with zeros..
2c6b0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
2c6c0 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
2c6d0 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20  Pager)==0 );.   
2c6e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2c6f0 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20  >nRec==0 );.    
2c700 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2c710 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29 3b  dbOrigSize==0 );
2c720 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2c730 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
2c740 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  =0 );.    rc = p
2c750 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
2c760 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  l(pPager);.  }..
2c770 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 54    PAGERTRACE(("T
2c780 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
2c790 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
2c7a0 29 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  )));.  if( rc!=S
2c7b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c7c0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
2c7d0 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a 20  >dbModified );. 
2c7e0 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 61 6e 79     /* Ignore any
2c7f0 20 49 4f 20 65 72 72 6f 72 20 74 68 61 74 20 6f   IO error that o
2c800 63 63 75 72 73 20 77 69 74 68 69 6e 20 70 61 67  ccurs within pag
2c810 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
2c820 6f 6e 28 29 2e 20 54 68 65 0a 20 20 20 20 2a 2a  on(). The.    **
2c830 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68 69 73   purpose of this
2c840 20 63 61 6c 6c 20 69 73 20 74 6f 20 72 65 73 65   call is to rese
2c850 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  t the internal s
2c860 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65  tate of the page
2c870 72 0a 20 20 20 20 2a 2a 20 73 75 62 2d 73 79 73  r.    ** sub-sys
2c880 74 65 6d 2e 20 49 74 20 64 6f 65 73 6e 27 74 20  tem. It doesn't 
2c890 6d 61 74 74 65 72 20 69 66 20 74 68 65 20 6a 6f  matter if the jo
2c8a0 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f  urnal-file is no
2c8b0 74 20 70 72 6f 70 65 72 6c 79 0a 20 20 20 20 2a  t properly.    *
2c8c0 2a 20 66 69 6e 61 6c 69 7a 65 64 20 61 74 20 74  * finalized at t
2c8d0 68 69 73 20 70 6f 69 6e 74 20 28 73 69 6e 63 65  his point (since
2c8e0 20 69 74 20 69 73 20 6e 6f 74 20 61 20 76 61 6c   it is not a val
2c8f0 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  id journal file 
2c900 61 6e 79 77 61 79 29 2e 0a 20 20 20 20 2a 2f 0a  anyway)..    */.
2c910 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72      pager_end_tr
2c920 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
2c930 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
2c940 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2c950 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64 61  Mark a single da
2c960 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65  ta page as write
2c970 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  able. The page i
2c980 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
2c990 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72  he .** main jour
2c9a0 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e  nal or sub-journ
2c9b0 61 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e 20  al as required. 
2c9c0 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77  If the page is w
2c9d0 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f  ritten into.** o
2c9e0 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
2c9f0 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ls, the correspo
2ca00 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74  nding bit is set
2ca10 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67 65   in the .** Page
2ca20 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.pInJournal bit
2ca30 76 65 63 20 61 6e 64 20 74 68 65 20 50 61 67 65  vec and the Page
2ca40 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
2ca50 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 0a  vepoint bitvecs.
2ca60 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73  ** of any open s
2ca70 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70 70  avepoints as app
2ca80 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61  ropriate..*/.sta
2ca90 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
2caa0 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ite(PgHdr *pPg){
2cab0 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d  .  void *pData =
2cac0 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50   pPg->pData;.  P
2cad0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
2cae0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
2caf0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2cb00 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  ;..  /* This rou
2cb10 74 69 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c  tine is not call
2cb20 65 64 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e  ed unless a tran
2cb30 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  saction has alre
2cb40 61 64 79 20 62 65 65 6e 0a 20 20 2a 2a 20 73 74  ady been.  ** st
2cb50 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  arted..  */.  as
2cb60 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
2cb70 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
2cb80 56 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  VED );..  /* If 
2cb90 61 6e 20 65 72 72 6f 72 20 68 61 73 20 62 65 65  an error has bee
2cba0 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65 74  n previously det
2cbb0 65 63 74 65 64 2c 20 72 65 70 6f 72 74 20 74 68  ected, report th
2cbc0 65 20 73 61 6d 65 20 65 72 72 6f 72 0a 20 20 2a  e same error.  *
2cbd0 2a 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20  * again..  */.  
2cbe0 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
2cbf0 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 20 72 65  ->errCode) )  re
2cc00 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
2cc10 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 48 69 67 68  Code;..  /* High
2cc20 65 72 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65  er-level routine
2cc30 73 20 6e 65 76 65 72 20 63 61 6c 6c 20 74 68 69  s never call thi
2cc40 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 64 61  s function if da
2cc50 74 61 62 61 73 65 20 69 73 20 6e 6f 74 0a 20 20  tabase is not.  
2cc60 2a 2a 20 77 72 69 74 61 62 6c 65 2e 20 20 42 75  ** writable.  Bu
2cc70 74 20 63 68 65 63 6b 20 61 6e 79 77 61 79 2c 20  t check anyway, 
2cc80 6a 75 73 74 20 66 6f 72 20 72 6f 62 75 73 74 6e  just for robustn
2cc90 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ess. */.  if( NE
2cca0 56 45 52 28 70 50 61 67 65 72 2d 3e 72 65 61 64  VER(pPager->read
2ccb0 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 53  Only) ) return S
2ccc0 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 0a 20 20 61  QLITE_PERM;..  a
2ccd0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
2cce0 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20  setMaster );..  
2ccf0 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b  CHECK_PAGE(pPg);
2cd00 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
2cd10 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20  page as dirty.  
2cd20 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20  If the page has 
2cd30 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
2cd40 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tten.  ** to the
2cd50 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65   journal then we
2cd60 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68   can return righ
2cd70 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73  t away..  */.  s
2cd80 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
2cd90 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66  Dirty(pPg);.  if
2cda0 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  ( pageInJournal(
2cdb0 70 50 67 29 20 26 26 20 21 73 75 62 6a 52 65 71  pPg) && !subjReq
2cdc0 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
2cdd0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
2cde0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2cdf0 72 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  r) );.    pPager
2ce00 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31  ->dbModified = 1
2ce10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20  ;.  }else{..    
2ce20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
2ce30 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
2ce40 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
2ce50 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
2ce60 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2ce70 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
2ce80 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b  nal or the ckeck
2ce90 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  point journal.  
2cea0 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20    ** or both..  
2ceb0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 48 69 67 68    **.    ** High
2cec0 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65  er level routine
2ced0 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  s should have al
2cee0 72 65 61 64 79 20 73 74 61 72 74 65 64 20 61 20  ready started a 
2cef0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 20  transaction,.   
2cf00 20 2a 2a 20 77 68 69 63 68 20 6d 65 61 6e 73 20   ** which means 
2cf10 74 68 65 79 20 68 61 76 65 20 61 63 71 75 69 72  they have acquir
2cf20 65 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ed the necessary
2cf30 20 6c 6f 63 6b 73 20 62 75 74 20 74 68 65 20 72   locks but the r
2cf40 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a  ollback.    ** j
2cf50 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74  ournal might not
2cf60 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20   yet be open..  
2cf70 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
2cf80 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
2cf90 70 50 61 67 65 72 2c 20 30 2c 20 70 50 61 67 65  pPager, 0, pPage
2cfa0 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29  r->subjInMemory)
2cfb0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2cfc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2cfd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2cfe0 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
2cff0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 0a  ->pInJournal==0.
2d000 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
2d010 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
2d020 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2d030 46 46 20 0a 20 20 20 20 20 26 26 20 21 70 61 67  FF .     && !pag
2d040 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2d050 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73  .    ){.      as
2d060 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
2d070 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  eJournal );.    
2d080 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
2d090 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
2d0a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2d0b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
2d0c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2d0d0 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69    pPager->dbModi
2d0e0 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20 20  fied = 1;.  .   
2d0f0 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
2d100 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20  ion journal now 
2d110 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61  exists and we ha
2d120 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ve a RESERVED or
2d130 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55   an.    ** EXCLU
2d140 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
2d150 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
2d160 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ile.  Write the 
2d170 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a  current page to.
2d180 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73      ** the trans
2d190 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69  action journal i
2d1a0 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
2d1b0 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  e already..    *
2d1c0 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 49  /.    if( !pageI
2d1d0 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26  nJournal(pPg) &&
2d1e0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2d1f0 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73  jfd) ){.      as
2d200 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
2d210 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
2d220 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
2d230 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
2d240 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
2d250 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20   u32 cksum;.    
2d260 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
2d270 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ;..        /* We
2d280 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72   should never wr
2d290 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
2d2a0 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65  al file the page
2d2b0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
2d2c0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
2d2d0 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
2d2e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
2d2f0 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20  ert verifies.   
2d300 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
2d310 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  do not. */.     
2d320 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
2d330 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
2d340 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  GNO(pPager) );..
2d350 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2d360 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
2d370 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  dr <= pPager->jo
2d380 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20  urnalOff );.    
2d390 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
2d3a0 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
2d3b0 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53  gno, 7, return S
2d3c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61  QLITE_NOMEM, pDa
2d3d0 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6b  ta2);.        ck
2d3e0 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75  sum = pager_cksu
2d3f0 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70  m(pPager, (u8*)p
2d400 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20  Data2);.        
2d410 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
2d420 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
2d430 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2d440 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
2d450 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2d460 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d470 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2d480 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
2d490 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  >jfd, pData2, pP
2d4a0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  ager->pageSize,.
2d4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
2d4d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2d4e0 20 2b 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20   + 4);.         
2d4f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2d500 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70  Off += pPager->p
2d510 61 67 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20  ageSize+4;.     
2d520 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2d530 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2d540 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2d550 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
2d560 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
2d570 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b  ->journalOff, ck
2d580 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sum);.          
2d590 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2d5a0 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20  ff += 4;.       
2d5b0 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41   }.        IOTRA
2d5c0 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20  CE(("JOUT %p %d 
2d5d0 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
2d5e0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a  er, pPg->pgno, .
2d5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d600 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2d610 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Off, pPager->pag
2d620 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20  eSize));.       
2d630 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
2d640 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
2d650 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20  _count);.       
2d660 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f   PAGERTRACE(("JO
2d670 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
2d680 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73   needSync=%d has
2d690 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
2d6a0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
2d6b0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
2d6c0 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20  gno, .          
2d6d0 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26     ((pPg->flags&
2d6e0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
2d6f0 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67  ?1:0), pager_pag
2d700 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20  ehash(pPg)));.. 
2d710 20 20 20 20 20 20 20 2f 2a 20 45 76 65 6e 20 69         /* Even i
2d720 66 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66  f an IO or diskf
2d730 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 72  ull error occurr
2d740 65 64 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c  ed while journal
2d750 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20  ling the.       
2d760 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
2d770 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74  block above, set
2d780 20 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66   the need-sync f
2d790 6c 61 67 20 66 6f 72 20 74 68 65 20 70 61 67 65  lag for the page
2d7a0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68  ..        ** Oth
2d7b0 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65  erwise, when the
2d7c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2d7d0 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65  rolled back, the
2d7e0 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20 20 20   logic in.      
2d7f0 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e    ** playback_on
2d800 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68  e_page() will th
2d810 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70 61 67  ink that the pag
2d820 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  e needs to be re
2d830 73 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a  stored.        *
2d840 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  * in the databas
2d850 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61  e file. And if a
2d860 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
2d870 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f  s while doing so
2d880 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
2d890 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79  n corruption may
2d8a0 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20   follow..       
2d8b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2d8c0 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
2d8d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  ){.          pPg
2d8e0 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
2d8f0 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
2d900 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65        pPager->ne
2d910 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
2d920 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
2d930 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  * An error has o
2d940 63 63 75 72 72 65 64 20 77 72 69 74 69 6e 67 20  ccurred writing 
2d950 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
2d960 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20  ile. The .      
2d970 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
2d980 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20   will be rolled 
2d990 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65  back by the laye
2d9a0 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20  r above..       
2d9b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2d9c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2d9d0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2d9e0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
2d9f0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
2da00 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRec++;.       
2da10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2da20 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >pInJournal!=0 )
2da30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
2da40 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
2da50 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
2da60 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
2da70 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2da80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
2da90 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  EM );.        as
2daa0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2dab0 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
2dac0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
2dad0 20 20 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61     rc |= addToSa
2dae0 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
2daf0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
2db00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2db10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2db20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2db30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
2db40 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  EM );.          
2db50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2db60 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
2db70 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  {.        if( !p
2db80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
2db90 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65 72  arted && !pPager
2dba0 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
2dbb0 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73        pPg->flags
2dbc0 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53   |= PGHDR_NEED_S
2dbd0 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 70  YNC;.          p
2dbe0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
2dbf0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
2dc00 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
2dc10 45 28 28 22 41 50 50 45 4e 44 20 25 64 20 70 61  E(("APPEND %d pa
2dc20 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
2dc30 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
2dc40 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
2dc50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
2dc60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2dc70 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47   ((pPg->flags&PG
2dc80 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31  HDR_NEED_SYNC)?1
2dc90 3a 30 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  :0)));.      }. 
2dca0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
2dcb0 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
2dcc0 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
2dcd0 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
2dce0 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a  not in it,.    *
2dcf0 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  * then write the
2dd00 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
2dd10 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
2dd20 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68  ournal.  Note th
2dd30 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74  at.    ** the st
2dd40 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
2dd50 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66  format differs f
2dd60 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64  rom the standard
2dd70 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a   journal format.
2dd80 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69      ** in that i
2dd90 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63  t omits the chec
2dda0 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65  ksums and the he
2ddb0 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ader..    */.   
2ddc0 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65   if( subjRequire
2ddd0 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20  sPage(pPg) ){.  
2dde0 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72      rc = subjour
2ddf0 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20  nalPage(pPg);.  
2de00 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70    }.  }..  /* Up
2de10 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  date the databas
2de20 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72  e size and retur
2de30 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
2de40 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
2de50 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
2de60 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
2de70 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20  bSize<pPg->pgno 
2de80 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
2de90 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e  bSize = pPg->pgn
2dea0 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  o;.  }.  return 
2deb0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
2dec0 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73  k a data page as
2ded0 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 69 73   writeable. This
2dee0 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65   routine must be
2def0 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a   called before .
2df00 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ** making change
2df10 73 20 74 6f 20 61 20 70 61 67 65 2e 20 54 68 65  s to a page. The
2df20 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 68 65   caller must che
2df30 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  ck the return va
2df40 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20  lue .** of this 
2df50 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65 20  function and be 
2df60 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63  careful not to c
2df70 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64  hange any page d
2df80 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74  ata unless .** t
2df90 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
2dfa0 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
2dfb0 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
2dfc0 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
2dfd0 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61   function and pa
2dfe0 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 74  ger_write() is t
2dff0 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  hat this.** func
2e000 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20  tion also deals 
2e010 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c  with the special
2e020 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f 72   case where 2 or
2e030 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66   more pages.** f
2e040 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64  it on a single d
2e050 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74  isk sector. In t
2e060 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d  his case all co-
2e070 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a  resident pages.*
2e080 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  * must have been
2e090 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2e0a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66  journal file bef
2e0b0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
2e0c0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
2e0d0 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f   occurs, SQLITE_
2e0e0 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65  NOMEM or an IO e
2e0f0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2e100 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70 72  urned.** as appr
2e110 6f 70 72 69 61 74 65 2e 20 4f 74 68 65 72 77 69  opriate. Otherwi
2e120 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
2e130 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2e140 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20 2a  erWrite(DbPage *
2e150 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  pDbPage){.  int 
2e160 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2e170 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
2e180 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72  pDbPage;.  Pager
2e190 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
2e1a0 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e  pPager;.  Pgno n
2e1b0 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20  PagePerSector = 
2e1c0 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
2e1d0 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65  ize/pPager->page
2e1e0 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 6e 50  Size);..  if( nP
2e1f0 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29  agePerSector>1 )
2e200 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65  {.    Pgno nPage
2e210 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  Count;          
2e220 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
2e230 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
2e240 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20  base file */.   
2e250 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20   Pgno pg1;      
2e260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2e270 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
2e280 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f  sector pPg is lo
2e290 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20  cated on. */.   
2e2a0 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
2e2b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2e2c0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74  mber of pages st
2e2d0 61 72 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f  arting at pg1 to
2e2e0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20   journal */.    
2e2f0 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
2e300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2e310 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
2e320 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20   int needSync = 
2e330 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  0;         /* Tr
2e340 75 65 20 69 66 20 61 6e 79 20 70 61 67 65 20 68  ue if any page h
2e350 61 73 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  as PGHDR_NEED_SY
2e360 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  NC */..    /* Se
2e370 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 53  t the doNotSyncS
2e380 70 69 6c 6c 20 66 6c 61 67 20 74 6f 20 31 2e 20  pill flag to 1. 
2e390 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
2e3a0 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a  we cannot allow.
2e3b0 20 20 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c      ** a journal
2e3c0 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72   header to be wr
2e3d0 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68  itten between th
2e3e0 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65  e pages journale
2e3f0 64 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 69 73  d by.    ** this
2e400 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a   function..    *
2e410 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  /.    assert( !M
2e420 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65  EMDB );.    asse
2e430 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
2e440 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 30 20 29 3b  tSyncSpill==0 );
2e450 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
2e460 6f 74 53 79 6e 63 53 70 69 6c 6c 2b 2b 3b 0a 0a  otSyncSpill++;..
2e470 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63      /* This tric
2e480 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62  k assumes that b
2e490 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a  oth the page-siz
2e4a0 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
2e4b0 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20  e are.    ** an 
2e4c0 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66  integer power of
2e4d0 20 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69   2. It sets vari
2e4e0 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20  able pg1 to the 
2e4f0 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a  identifier.    *
2e500 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70  * of the first p
2e510 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f  age of the secto
2e520 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64  r pPg is located
2e530 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   on..    */.    
2e540 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e  pg1 = ((pPg->pgn
2e550 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65  o-1) & ~(nPagePe
2e560 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b  rSector-1)) + 1;
2e570 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
2e580 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
2e590 28 70 50 61 67 65 72 2c 20 28 69 6e 74 20 2a 29  (pPager, (int *)
2e5a0 26 6e 50 61 67 65 43 6f 75 6e 74 29 3b 0a 20 20  &nPageCount);.  
2e5b0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2e5c0 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70 50  n rc;.    if( pP
2e5d0 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75  g->pgno>nPageCou
2e5e0 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  nt ){.      nPag
2e5f0 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d  e = (pPg->pgno -
2e600 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c   pg1)+1;.    }el
2e610 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67  se if( (pg1+nPag
2e620 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50  ePerSector-1)>nP
2e630 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
2e640 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43    nPage = nPageC
2e650 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20  ount+1-pg1;.    
2e660 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61  }else{.      nPa
2e670 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63  ge = nPagePerSec
2e680 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  tor;.    }.    a
2e690 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a  ssert(nPage>0);.
2e6a0 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d      assert(pg1<=
2e6b0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
2e6c0 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67  assert((pg1+nPag
2e6d0 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a  e)>pPg->pgno);..
2e6e0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
2e6f0 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51  <nPage && rc==SQ
2e700 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a  LITE_OK; ii++){.
2e710 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20        Pgno pg = 
2e720 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67  pg1+ii;.      Pg
2e730 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  Hdr *pPage;.    
2e740 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70    if( pg==pPg->p
2e750 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42  gno || !sqlite3B
2e760 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
2e770 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
2e780 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
2e790 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47   pg!=PAGER_MJ_PG
2e7a0 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
2e7b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2e7c0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
2e7d0 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29  ger, pg, &pPage)
2e7e0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2e7f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2e800 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2e810 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  = pager_write(pP
2e820 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2e830 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61    if( pPage->fla
2e840 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
2e850 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NC ){.          
2e860 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
2e870 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2e880 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
2e890 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20  eedSync);.      
2e8a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e8b0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
2e8c0 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
2e8d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e8e0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
2e8f0 69 66 28 20 28 70 50 61 67 65 20 3d 20 70 61 67  if( (pPage = pag
2e900 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
2e910 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20  , pg))!=0 ){.   
2e920 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
2e930 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
2e940 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20  _SYNC ){.       
2e950 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
2e960 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e970 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
2e980 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
2e990 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2e9a0 2f 2a 20 49 66 20 74 68 65 20 50 47 48 44 52 5f  /* If the PGHDR_
2e9b0 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69  NEED_SYNC flag i
2e9c0 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66  s set for any of
2e9d0 20 74 68 65 20 6e 50 61 67 65 20 70 61 67 65 73   the nPage pages
2e9e0 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e   .    ** startin
2e9f0 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69  g at pg1, then i
2ea00 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65  t needs to be se
2ea10 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  t for all of the
2ea20 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a  m. Because.    *
2ea30 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79  * writing to any
2ea40 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65 20   of these nPage 
2ea50 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65  pages may damage
2ea60 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65   the others, the
2ea70 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
2ea80 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69  file must contai
2ea90 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65  n sync()ed copie
2eaa0 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d  s of all of them
2eab0 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61  .    ** before a
2eac0 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62  ny of them can b
2ead0 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
2eae0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2eaf0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
2eb00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2eb10 20 26 26 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a   && needSync ){.
2eb20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 4d        assert( !M
2eb30 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
2eb40 6e 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  noSync==0 );.   
2eb50 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
2eb60 6e 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20  nPage; ii++){.  
2eb70 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
2eb80 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ge = pager_looku
2eb90 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69  p(pPager, pg1+ii
2eba0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2ebb0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
2ebc0 20 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c    pPage->flags |
2ebd0 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
2ebe0 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  C;.          sql
2ebf0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2ec00 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
2ec10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
2ec20 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65  ssert(pPager->ne
2ec30 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a  edSync);.    }..
2ec40 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2ec50 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69  er->doNotSyncSpi
2ec60 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61  ll==1 );.    pPa
2ec70 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70  ger->doNotSyncSp
2ec80 69 6c 6c 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ill--;.  }else{.
2ec90 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
2eca0 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
2ecb0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2ecc0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2ecd0 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65  TRUE if the page
2ece0 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
2ecf0 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69  gument was previ
2ed00 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20  ously passed.** 
2ed10 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
2ed20 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65  rite().  In othe
2ed30 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
2ed40 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b  TRUE if it is ok
2ed50 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
2ed60 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
2ed70 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65   page..*/.#ifnde
2ed80 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  f NDEBUG.int sql
2ed90 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2eda0 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67  able(DbPage *pPg
2edb0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  ){.  return pPg-
2edc0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
2edd0 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TY;.}.#endif../*
2ede0 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
2edf0 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
2ee00 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
2ee10 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
2ee20 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20  ary to.** write 
2ee30 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
2ee40 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63 6b  on page pPg back
2ee50 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76   to the disk, ev
2ee60 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61  en though.** tha
2ee70 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20  t page might be 
2ee80 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
2ee90 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20    This happens, 
2eea0 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
2eeb0 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 68 61  n.** the page ha
2eec0 73 20 62 65 65 6e 20 61 64 64 65 64 20 61 73 20  s been added as 
2eed0 61 20 6c 65 61 66 20 6f 66 20 74 68 65 20 66 72  a leaf of the fr
2eee0 65 65 6c 69 73 74 20 61 6e 64 20 73 6f 20 69 74  eelist and so it
2eef0 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20  s.** content no 
2ef00 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72 73 2e 0a  longer matters..
2ef10 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79  **.** The overly
2ef20 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79  ing software lay
2ef30 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
2ef40 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f  utine when all o
2ef50 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e  f the data.** on
2ef60 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
2ef70 69 73 20 75 6e 75 73 65 64 2e 20 54 68 65 20 70  is unused. The p
2ef80 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70  ager marks the p
2ef90 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a  age as clean so.
2efa0 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  ** that it does 
2efb0 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20  not get written 
2efc0 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54  to disk..**.** T
2efd0 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74  ests show that t
2efe0 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
2eff0 20 63 61 6e 20 71 75 61 64 72 75 70 6c 65 20 74   can quadruple t
2f000 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67  he speed of larg
2f010 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20 6f 70 65  e .** DELETE ope
2f020 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64  rations..*/.void
2f030 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
2f040 74 57 72 69 74 65 28 50 67 48 64 72 20 2a 70 50  tWrite(PgHdr *pP
2f050 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
2f060 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
2f070 72 3b 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66  r;.  if( (pPg->f
2f080 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
2f090 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53 61  ) && pPager->nSa
2f0a0 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20 20  vepoint==0 ){.  
2f0b0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 44    PAGERTRACE(("D
2f0c0 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25  ONT_WRITE page %
2f0d0 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d  d of %d\n", pPg-
2f0e0 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
2f0f0 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 49 4f  Pager)));.    IO
2f100 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70  TRACE(("CLEAN %p
2f110 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
2f120 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20  pPg->pgno)).    
2f130 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
2f140 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b 0a  HDR_DONT_WRITE;.
2f150 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
2f160 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
2f170 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
2f180 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
2f190 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a  );.#endif.  }.}.
2f1a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2f1b0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
2f1c0 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   increment the v
2f1d0 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61  alue of the data
2f1e0 62 61 73 65 20 66 69 6c 65 20 0a 2a 2a 20 63 68  base file .** ch
2f1f0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 20 73 74  ange-counter, st
2f200 6f 72 65 64 20 61 73 20 61 20 34 2d 62 79 74 65  ored as a 4-byte
2f210 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
2f220 67 65 72 20 73 74 61 72 74 69 6e 67 20 61 74 20  ger starting at 
2f230 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73 65 74 20  .** byte offset 
2f240 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  24 of the pager 
2f250 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  file..**.** If t
2f260 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20  he isDirectMode 
2f270 66 6c 61 67 20 69 73 20 7a 65 72 6f 2c 20 74 68  flag is zero, th
2f280 65 6e 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20  en this is done 
2f290 62 79 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73  by calling .** s
2f2a0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2f2b0 28 29 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68  () on page 1, th
2f2c0 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  en modifying the
2f2d0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2f2e0 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 20 49  .** page data. I
2f2f0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
2f300 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 70 64  file will be upd
2f310 61 74 65 64 20 77 68 65 6e 20 74 68 65 20 63 75  ated when the cu
2f320 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  rrent.** transac
2f330 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
2f340 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44  d..**.** The isD
2f350 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 6d  irectMode flag m
2f360 61 79 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a  ay only be non-z
2f370 65 72 6f 20 69 66 20 74 68 65 20 6c 69 62 72 61  ero if the libra
2f380 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a  ry was compiled.
2f390 2a 2a 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ** with the SQLI
2f3a0 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
2f3b0 5f 57 52 49 54 45 20 6d 61 63 72 6f 20 64 65 66  _WRITE macro def
2f3c0 69 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ined. In this ca
2f3d0 73 65 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72 65  se,.** if isDire
2f3e0 63 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ct is non-zero, 
2f3f0 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  then the databas
2f400 65 20 66 69 6c 65 20 69 73 20 75 70 64 61 74 65  e file is update
2f410 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79  d directly.** by
2f420 20 77 72 69 74 69 6e 67 20 61 6e 20 75 70 64 61   writing an upda
2f430 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70  ted version of p
2f440 61 67 65 20 31 20 75 73 69 6e 67 20 61 20 63 61  age 1 using a ca
2f450 6c 6c 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71  ll to the .** sq
2f460 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 66  lite3OsWrite() f
2f470 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
2f480 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63  ic int pager_inc
2f490 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
2f4a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
2f4b0 6e 74 20 69 73 44 69 72 65 63 74 4d 6f 64 65 29  nt isDirectMode)
2f4c0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2f4d0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 44 65  ITE_OK;..  /* De
2f4e0 63 6c 61 72 65 20 61 6e 64 20 69 6e 69 74 69 61  clare and initia
2f4f0 6c 69 7a 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e  lize constant in
2f500 74 65 67 65 72 20 27 69 73 44 69 72 65 63 74 27  teger 'isDirect'
2f510 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 61 74  . If the.  ** at
2f520 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
2f530 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c  ization is enabl
2f540 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  ed in this build
2f550 2c 20 74 68 65 6e 20 69 73 44 69 72 65 63 74 0a  , then isDirect.
2f560 20 20 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 69    ** is initiali
2f570 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65  zed to the value
2f580 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 69   passed as the i
2f590 73 44 69 72 65 63 74 4d 6f 64 65 20 70 61 72 61  sDirectMode para
2f5a0 6d 65 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68  meter.  ** to th
2f5b0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68  is function. Oth
2f5c0 65 72 77 69 73 65 2c 20 69 74 20 69 73 20 61 6c  erwise, it is al
2f5d0 77 61 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  ways set to zero
2f5e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
2f5f0 69 64 65 61 20 69 73 20 74 68 61 74 20 69 66 20  idea is that if 
2f600 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
2f610 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
2f620 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61 62 6c 65   not.  ** enable
2f630 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  d at compile tim
2f640 65 2c 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  e, the compiler 
2f650 63 61 6e 20 6f 6d 69 74 20 74 68 65 20 74 65 73  can omit the tes
2f660 74 73 20 6f 66 0a 20 20 2a 2a 20 27 69 73 44 69  ts of.  ** 'isDi
2f670 72 65 63 74 27 20 62 65 6c 6f 77 2c 20 61 73 20  rect' below, as 
2f680 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6c 6f 63  well as the bloc
2f690 6b 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 74 68  k enclosed in th
2f6a0 65 0a 20 20 2a 2a 20 22 69 66 28 20 69 73 44 69  e.  ** "if( isDi
2f6b0 72 65 63 74 20 29 22 20 63 6f 6e 64 69 74 69 6f  rect )" conditio
2f6c0 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  n..  */.#ifndef 
2f6d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
2f6e0 4f 4d 49 43 5f 57 52 49 54 45 0a 23 20 64 65 66  OMIC_WRITE.# def
2f6f0 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20  ine DIRECT_MODE 
2f700 30 0a 20 20 61 73 73 65 72 74 28 20 69 73 44 69  0.  assert( isDi
2f710 72 65 63 74 4d 6f 64 65 3d 3d 30 20 29 3b 0a 20  rectMode==0 );. 
2f720 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2f730 52 28 69 73 44 69 72 65 63 74 4d 6f 64 65 29 3b  R(isDirectMode);
2f740 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
2f750 44 49 52 45 43 54 5f 4d 4f 44 45 20 69 73 44 69  DIRECT_MODE isDi
2f760 72 65 63 74 4d 6f 64 65 0a 23 65 6e 64 69 66 0a  rectMode.#endif.
2f770 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2f780 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
2f790 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 69 66  RESERVED );.  if
2f7a0 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  ( !pPager->chang
2f7b0 65 43 6f 75 6e 74 44 6f 6e 65 20 26 26 20 70 50  eCountDone && pP
2f7c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29  ager->dbSize>0 )
2f7d0 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
2f7e0 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Hdr;            
2f7f0 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65      /* Reference
2f800 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20   to page 1 */.  
2f810 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
2f820 6e 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  nter;           
2f830 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65  /* Initial value
2f840 20 6f 66 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74   of change-count
2f850 65 72 20 66 69 65 6c 64 20 2a 2f 0a 0a 20 20 20  er field */..   
2f860 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
2f870 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 69 73  ->tempFile && is
2f880 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2f890 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e   );..    /* Open
2f8a0 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66   page 1 of the f
2f8b0 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ile for writing.
2f8c0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2f8d0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
2f8e0 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29  ger, 1, &pPgHdr)
2f8f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2f900 67 48 64 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  gHdr==0 || rc==S
2f910 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20  QLITE_OK );..   
2f920 20 2f 2a 20 49 66 20 70 61 67 65 20 6f 6e 65 20   /* If page one 
2f930 77 61 73 20 66 65 74 63 68 65 64 20 73 75 63 63  was fetched succ
2f940 65 73 73 66 75 6c 6c 79 2c 20 61 6e 64 20 74 68  essfully, and th
2f950 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  is function is n
2f960 6f 74 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  ot.    ** operat
2f970 69 6e 67 20 69 6e 20 64 69 72 65 63 74 2d 6d 6f  ing in direct-mo
2f980 64 65 2c 20 6d 61 6b 65 20 70 61 67 65 20 31 20  de, make page 1 
2f990 77 72 69 74 61 62 6c 65 2e 20 20 57 68 65 6e 20  writable.  When 
2f9a0 6e 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 64  not in .    ** d
2f9b0 69 72 65 63 74 20 6d 6f 64 65 2c 20 70 61 67 65  irect mode, page
2f9c0 20 31 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c   1 is always hel
2f9d0 64 20 69 6e 20 63 61 63 68 65 20 61 6e 64 20 68  d in cache and h
2f9e0 65 6e 63 65 20 74 68 65 20 50 61 67 65 72 47 65  ence the PagerGe
2f9f0 74 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  t().    ** above
2fa00 20 69 73 20 61 6c 77 61 79 73 20 73 75 63 63 65   is always succe
2fa10 73 73 66 75 6c 20 2d 20 68 65 6e 63 65 20 74 68  ssful - hence th
2fa20 65 20 41 4c 57 41 59 53 20 6f 6e 20 72 63 3d 3d  e ALWAYS on rc==
2fa30 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 20 20 2a  SQLITE_OK..    *
2fa40 2f 0a 20 20 20 20 69 66 28 20 21 44 49 52 45 43  /.    if( !DIREC
2fa50 54 5f 4d 4f 44 45 20 26 26 20 41 4c 57 41 59 53  T_MODE && ALWAYS
2fa60 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  (rc==SQLITE_OK) 
2fa70 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
2fa80 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2fa90 70 50 67 48 64 72 29 3b 0a 20 20 20 20 7d 0a 0a  pPgHdr);.    }..
2faa0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2fab0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
2fac0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
2fad0 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20  value just read 
2fae0 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63  and write it bac
2faf0 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f  k to byte 24. */
2fb00 0a 20 20 20 20 20 20 63 68 61 6e 67 65 5f 63 6f  .      change_co
2fb10 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47  unter = sqlite3G
2fb20 65 74 34 62 79 74 65 28 28 75 38 2a 29 70 50 61  et4byte((u8*)pPa
2fb30 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
2fb40 3b 0a 20 20 20 20 20 20 63 68 61 6e 67 65 5f 63  ;.      change_c
2fb50 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20  ounter++;.      
2fb60 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
2fb70 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29  *)pPgHdr->pData)
2fb80 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e  +24, change_coun
2fb90 74 65 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ter);..      /* 
2fba0 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65 20 53  Also store the S
2fbb0 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75  QLite version nu
2fbc0 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20 39 36  mber in bytes 96
2fbd0 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20 20 20  ..99 and in.    
2fbe0 20 20 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39    ** bytes 92..9
2fbf0 35 20 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e  5 store the chan
2fc00 67 65 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77  ge counter for w
2fc10 68 69 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e  hich the version
2fc20 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a   number.      **
2fc30 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20   is valid. */.  
2fc40 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28      put32bits(((
2fc50 63 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44  char*)pPgHdr->pD
2fc60 61 74 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f  ata)+92, change_
2fc70 63 6f 75 6e 74 65 72 29 3b 0a 20 20 20 20 20 20  counter);.      
2fc80 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
2fc90 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29  *)pPgHdr->pData)
2fca0 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56 45 52 53  +96, SQLITE_VERS
2fcb0 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 0a 20 20  ION_NUMBER);..  
2fcc0 20 20 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e      /* If runnin
2fcd0 67 20 69 6e 20 64 69 72 65 63 74 20 6d 6f 64 65  g in direct mode
2fce0 2c 20 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74  , write the cont
2fcf0 65 6e 74 73 20 6f 66 20 70 61 67 65 20 31 20 74  ents of page 1 t
2fd00 6f 20 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  o the file. */. 
2fd10 20 20 20 20 20 69 66 28 20 44 49 52 45 43 54 5f       if( DIRECT_
2fd20 4d 4f 44 45 20 29 7b 0a 20 20 20 20 20 20 20 20  MODE ){.        
2fd30 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66  const void *zBuf
2fd40 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2fd50 28 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  ( pPager->dbFile
2fd60 53 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20  Size>0 );.      
2fd70 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
2fd80 20 70 50 67 48 64 72 2d 3e 70 44 61 74 61 2c 20   pPgHdr->pData, 
2fd90 31 2c 20 36 2c 20 72 63 3d 53 51 4c 49 54 45 5f  1, 6, rc=SQLITE_
2fda0 4e 4f 4d 45 4d 2c 20 7a 42 75 66 29 3b 0a 20 20  NOMEM, zBuf);.  
2fdb0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2fdc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2fdd0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2fde0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
2fdf0 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65  >fd, zBuf, pPage
2fe00 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b  r->pageSize, 0);
2fe10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2fe20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2fe30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2fe40 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
2fe50 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20  CountDone = 1;. 
2fe60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2fe70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50  else{.        pP
2fe80 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
2fe90 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  tDone = 1;.     
2fea0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2feb0 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61 67   Release the pag
2fec0 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a  e reference. */.
2fed0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
2fee0 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
2fef0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2ff00 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
2ff10 65 20 70 61 67 65 72 20 66 69 6c 65 20 74 6f 20  e pager file to 
2ff20 64 69 73 6b 2e 20 54 68 69 73 20 69 73 20 61 20  disk. This is a 
2ff30 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d 65 6d  no-op for in-mem
2ff40 6f 72 79 20 66 69 6c 65 73 0a 2a 2a 20 6f 72 20  ory files.** or 
2ff50 70 61 67 65 73 20 77 69 74 68 20 74 68 65 20 50  pages with the P
2ff60 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67  ager.noSync flag
2ff70 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73   set..**.** If s
2ff80 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 63 61  uccessful, or ca
2ff90 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67 65 72 20  lled on a pager 
2ffa0 66 6f 72 20 77 68 69 63 68 20 69 74 20 69 73 20  for which it is 
2ffb0 61 20 6e 6f 2d 6f 70 2c 20 74 68 69 73 0a 2a 2a  a no-op, this.**
2ffc0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2ffd0 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68  s SQLITE_OK. Oth
2ffe0 65 72 77 69 73 65 2c 20 61 6e 20 49 4f 20 65 72  erwise, an IO er
2fff0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
30000 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
30010 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 50 61  ite3PagerSync(Pa
30020 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
30030 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
30040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30050 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
30060 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ode */.  assert(
30070 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28   !MEMDB );.  if(
30080 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
30090 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
300a0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
300b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
300c0 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  OsSync(pPager->f
300d0 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
300e0 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 72 65  flags);.  }.  re
300f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
30100 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
30110 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
30120 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a   pager pPager. z
30130 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
30140 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20   the name.** of 
30150 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
30160 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
30170 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
30180 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  o the individual
30190 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
301a0 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65  . zMaster may be
301b0 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20   NULL, which is 
301c0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e  interpreted as n
301d0 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  o master.** jour
301e0 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61  nal (a single da
301f0 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
30200 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  on)..**.** This 
30210 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
30220 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  that:.**.**   * 
30230 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
30240 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
30250 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20   is updated,.** 
30260 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20    * the journal 
30270 69 73 20 73 79 6e 63 65 64 20 28 75 6e 6c 65 73  is synced (unles
30280 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  s the atomic-wri
30290 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
302a0 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20 20 20 2a  is used),.**   *
302b0 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
302c0 20 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f 20   are written to 
302d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
302e0 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64  e, .**   * the d
302f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
30300 74 72 75 6e 63 61 74 65 64 20 28 69 66 20 72 65  truncated (if re
30310 71 75 69 72 65 64 29 2c 20 61 6e 64 0a 2a 2a 20  quired), and.** 
30320 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65    * the database
30330 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 0a 2a   file synced. .*
30340 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68  *.** The only th
30350 69 6e 67 20 74 68 61 74 20 72 65 6d 61 69 6e 73  ing that remains
30360 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74   to commit the t
30370 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f  ransaction is to
30380 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20 28 64   finalize .** (d
30390 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74 65 20  elete, truncate 
303a0 6f 72 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73  or zero the firs
303b0 74 20 70 61 72 74 20 6f 66 29 20 74 68 65 20 6a  t part of) the j
303c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20  ournal file (or 
303d0 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 6d  .** delete the m
303e0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
303f0 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29  le if specified)
30400 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
30410 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55  t if zMaster==NU
30420 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f  LL, this does no
30430 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72  t overwrite a pr
30440 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20  evious value.** 
30450 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c  passed to an sql
30460 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
30470 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a  haseOne() call..
30480 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6e  **.** If the fin
30490 61 6c 20 70 61 72 61 6d 65 74 65 72 20 2d 20 6e  al parameter - n
304a0 6f 53 79 6e 63 20 2d 20 69 73 20 74 72 75 65 2c  oSync - is true,
304b0 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   then the databa
304c0 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 0a 2a  se file itself.*
304d0 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 2e  * is not synced.
304e0 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
304f0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
30500 65 72 53 79 6e 63 28 29 20 64 69 72 65 63 74 6c  erSync() directl
30510 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68 65  y to.** sync the
30520 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
30530 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43 6f  efore calling Co
30540 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 74  mmitPhaseTwo() t
30550 6f 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20  o delete the.** 
30560 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
30570 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e  this case..*/.in
30580 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  t sqlite3PagerCo
30590 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a 20 20  mmitPhaseOne(.  
305a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
305b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
305c0 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
305d0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
305e0 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20 20 20 20  *zMaster,       
305f0 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
30600 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74 65 72 20  ULL, the master 
30610 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
30620 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20 20 20 20    int noSync    
30630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30640 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69    /* True to omi
30650 74 20 74 68 65 20 78 53 79 6e 63 20 6f 6e 20 74  t the xSync on t
30660 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a 29 7b  he db file */.){
30670 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
30680 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
30690 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
306a0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 64  e */..  /* The d
306b0 62 4f 72 69 67 53 69 7a 65 20 69 73 20 6e 65 76  bOrigSize is nev
306c0 65 72 20 73 65 74 20 69 66 20 6a 6f 75 72 6e 61  er set if journa
306d0 6c 5f 6d 6f 64 65 3d 4f 46 46 20 2a 2f 0a 20 20  l_mode=OFF */.  
306e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
306f0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
30700 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
30710 46 46 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  FF || pPager->db
30720 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29 3b 0a 0a  OrigSize==0 );..
30730 20 20 2f 2a 20 49 66 20 61 20 70 72 69 6f 72 20    /* If a prior 
30740 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20  error occurred, 
30750 72 65 70 6f 72 74 20 74 68 61 74 20 65 72 72 6f  report that erro
30760 72 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 69 66  r again. */.  if
30770 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
30780 65 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  e ) return pPage
30790 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 50  r->errCode;..  P
307a0 41 47 45 52 54 52 41 43 45 28 28 22 44 41 54 41  AGERTRACE(("DATA
307b0 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d  BASE SYNC: File=
307c0 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 53  %s zMaster=%s nS
307d0 69 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  ize=%d\n", .    
307e0 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
307f0 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  ame, zMaster, pP
30800 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 29 3b 0a  ager->dbSize));.
30810 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20  .  if( MEMDB && 
30820 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
30830 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ed ){.    /* If 
30840 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
30850 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70  mory db, or no p
30860 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77  ages have been w
30870 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68  ritten to, or th
30880 69 73 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  is.    ** functi
30890 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
308a0 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69  een called, it i
308b0 73 20 6d 6f 73 74 6c 79 20 61 20 6e 6f 2d 6f 70  s mostly a no-op
308c0 2e 20 20 48 6f 77 65 76 65 72 2c 20 61 6e 79 0a  .  However, any.
308d0 20 20 20 20 2a 2a 20 62 61 63 6b 75 70 20 69 6e      ** backup in
308e0 20 70 72 6f 67 72 65 73 73 20 6e 65 65 64 73 20   progress needs 
308f0 74 6f 20 62 65 20 72 65 73 74 61 72 74 65 64 2e  to be restarted.
30900 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
30910 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
30920 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
30930 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
30940 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
30950 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 70 50  GER_SYNCED && pP
30960 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
30970 20 29 7b 0a 20 20 20 20 69 66 28 20 70 61 67 65   ){.    if( page
30980 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
30990 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  ){.      PgHdr *
309a0 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pList = sqlite3P
309b0 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
309c0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
309d0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
309e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
309f0 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
30a00 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2c 20 70  pPager, pList, p
30a10 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2c 20 31  Pager->dbSize, 1
30a20 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  , .            (
30a30 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
30a40 20 3f 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f   ? pPager->sync_
30a50 66 6c 61 67 73 20 3a 20 30 29 0a 20 20 20 20 20  flags : 0).     
30a60 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
30a70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
30a80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30a90 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
30aa0 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70  eanAll(pPager->p
30ab0 50 43 61 63 68 65 29 3b 0a 20 20 20 20 20 20 7d  PCache);.      }
30ac0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
30ad0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
30ae0 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73  ng block updates
30af0 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
30b00 74 65 72 2e 20 45 78 61 63 74 6c 79 20 68 6f 77  ter. Exactly how
30b10 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f 65   it.      ** doe
30b20 73 20 74 68 69 73 20 64 65 70 65 6e 64 73 20 6f  s this depends o
30b30 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
30b40 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61   the atomic-upda
30b50 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
30b60 20 20 20 20 20 20 2a 2a 20 77 61 73 20 65 6e 61        ** was ena
30b70 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20  bled at compile 
30b80 74 69 6d 65 2c 20 61 6e 64 20 69 66 20 74 68 69  time, and if thi
30b90 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65  s transaction me
30ba0 65 74 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a  ets the .      *
30bb0 2a 20 72 75 6e 74 69 6d 65 20 63 72 69 74 65 72  * runtime criter
30bc0 69 61 20 74 6f 20 75 73 65 20 74 68 65 20 6f 70  ia to use the op
30bd0 65 72 61 74 69 6f 6e 3a 20 0a 20 20 20 20 20 20  eration: .      
30be0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a  **.      **    *
30bf0 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   The file-system
30c00 20 73 75 70 70 6f 72 74 73 20 74 68 65 20 61 74   supports the at
30c10 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65  omic-write prope
30c20 72 74 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  rty for.      **
30c30 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20        blocks of 
30c40 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20  size page-size, 
30c50 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 20 20  and .      **   
30c60 20 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69   * This commit i
30c70 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20  s not part of a 
30c80 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73  multi-file trans
30c90 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20  action, and.    
30ca0 20 20 2a 2a 20 20 20 20 2a 20 45 78 61 63 74 6c    **    * Exactl
30cb0 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62  y one page has b
30cc0 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64  een modified and
30cd0 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f   store in the jo
30ce0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
30cf0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
30d00 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
30d10 6e 20 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65  n was not enable
30d20 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  d at compile tim
30d30 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  e, then the.    
30d40 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f    ** pager_incr_
30d50 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
30d60 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
30d70 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  ed to update the
30d80 20 63 68 61 6e 67 65 0a 20 20 20 20 20 20 2a 2a   change.      **
30d90 20 63 6f 75 6e 74 65 72 20 69 6e 20 27 69 6e 64   counter in 'ind
30da0 69 72 65 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20  irect-mode'. If 
30db0 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
30dc0 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20   is compiled in 
30dd0 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  but.      ** is 
30de0 6e 6f 74 20 61 70 70 6c 69 63 61 62 6c 65 20 74  not applicable t
30df0 6f 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  o this transacti
30e00 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  on, call sqlite3
30e10 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 29 0a  JournalCreate().
30e20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65        ** to make
30e30 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61   sure the journa
30e40 6c 20 66 69 6c 65 20 68 61 73 20 61 63 74 75 61  l file has actua
30e50 6c 6c 79 20 62 65 65 6e 20 63 72 65 61 74 65 64  lly been created
30e60 2c 20 74 68 65 6e 20 63 61 6c 6c 0a 20 20 20 20  , then call.    
30e70 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f    ** pager_incr_
30e80 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
30e90 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
30ea0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20  ange-counter in 
30eb0 69 6e 64 69 72 65 63 74 0a 20 20 20 20 20 20 2a  indirect.      *
30ec0 2a 20 6d 6f 64 65 2e 20 0a 20 20 20 20 20 20 2a  * mode. .      *
30ed0 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72  *.      ** Other
30ee0 77 69 73 65 2c 20 69 66 20 74 68 65 20 6f 70 74  wise, if the opt
30ef0 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74  imization is bot
30f00 68 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 61 70  h enabled and ap
30f10 70 6c 69 63 61 62 6c 65 2c 0a 20 20 20 20 20 20  plicable,.      
30f20 2a 2a 20 74 68 65 6e 20 63 61 6c 6c 20 70 61 67  ** then call pag
30f30 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
30f40 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74  unter() to updat
30f50 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
30f60 6e 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 6e  nter.      ** in
30f70 20 27 64 69 72 65 63 74 27 20 6d 6f 64 65 2e 20   'direct' mode. 
30f80 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
30f90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
30fa0 6c 6c 20 6e 65 76 65 72 20 62 65 0a 20 20 20 20  ll never be.    
30fb0 20 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72    ** created for
30fc0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
30fd0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 23 69  n..      */.  #i
30fe0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
30ff0 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
31000 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67        PgHdr *pPg
31010 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
31020 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
31030 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  fd) || pPager->j
31040 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
31050 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
31060 46 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  F );.      if( !
31070 7a 4d 61 73 74 65 72 20 26 26 20 69 73 4f 70 65  zMaster && isOpe
31080 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a  n(pPager->jfd) .
31090 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72         && pPager
310a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72  ->journalOff==jr
310b0 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61  nlBufferSize(pPa
310c0 67 65 72 29 20 0a 20 20 20 20 20 20 20 26 26 20  ger) .       && 
310d0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
310e0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
310f0 7a 65 0a 20 20 20 20 20 20 20 26 26 20 28 30 3d  ze.       && (0=
31100 3d 28 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50  =(pPg = sqlite3P
31110 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
31120 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29  Pager->pPCache))
31130 20 7c 7c 20 30 3d 3d 70 50 67 2d 3e 70 44 69 72   || 0==pPg->pDir
31140 74 79 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ty).      ){.   
31150 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
31160 68 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67  he db file chang
31170 65 20 63 6f 75 6e 74 65 72 20 76 69 61 20 74 68  e counter via th
31180 65 20 64 69 72 65 63 74 2d 77 72 69 74 65 20 6d  e direct-write m
31190 65 74 68 6f 64 2e 20 54 68 65 20 0a 20 20 20 20  ethod. The .    
311a0 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
311b0 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66   call will modif
311c0 79 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  y the in-memory 
311d0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
311e0 66 20 70 61 67 65 20 31 20 0a 20 20 20 20 20 20  f page 1 .      
311f0 20 20 2a 2a 20 74 6f 20 69 6e 63 6c 75 64 65 20    ** to include 
31200 74 68 65 20 75 70 64 61 74 65 64 20 63 68 61 6e  the updated chan
31210 67 65 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74  ge counter and t
31220 68 65 6e 20 77 72 69 74 65 20 70 61 67 65 20 31  hen write page 1
31230 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 69 72   .        ** dir
31240 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74  ectly to the dat
31250 61 62 61 73 65 20 66 69 6c 65 2e 20 42 65 63 61  abase file. Beca
31260 75 73 65 20 6f 66 20 74 68 65 20 61 74 6f 6d 69  use of the atomi
31270 63 2d 77 72 69 74 65 20 0a 20 20 20 20 20 20 20  c-write .       
31280 20 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f 66 20   ** property of 
31290 74 68 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79  the host file-sy
312a0 73 74 65 6d 2c 20 74 68 69 73 20 69 73 20 73 61  stem, this is sa
312b0 66 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  fe..        */. 
312c0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
312d0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
312e0 6e 74 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b  nter(pPager, 1);
312f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
31300 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
31310 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28  e3JournalCreate(
31320 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
31330 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
31340 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31350 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
31360 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
31370 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  er(pPager, 0);. 
31380 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
31390 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 20 20 72  .  #else.      r
313a0 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
313b0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
313c0 67 65 72 2c 20 30 29 3b 0a 20 20 23 65 6e 64 69  ger, 0);.  #endi
313d0 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  f.      if( rc!=
313e0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
313f0 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
31400 65 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20 20 20  e_exit;.  .     
31410 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e   /* If this tran
31420 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65  saction has made
31430 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d   the database sm
31440 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20  aller, then all 
31450 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 62  pages.      ** b
31460 65 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62  eing discarded b
31470 79 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e  y the truncation
31480 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e   must be written
31490 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
314a0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 54        ** file. T
314b0 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
314c0 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  pen in auto-vacu
314d0 75 6d 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a  um mode..      *
314e0 2a 0a 20 20 20 20 20 20 2a 2a 20 42 65 66 6f 72  *.      ** Befor
314f0 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 70 61  e reading the pa
31500 67 65 73 20 77 69 74 68 20 70 61 67 65 20 6e 75  ges with page nu
31510 6d 62 65 72 73 20 6c 61 72 67 65 72 20 74 68 61  mbers larger tha
31520 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
31530 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
31540 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 73   Pager.dbSize, s
31550 65 74 20 64 62 53 69 7a 65 20 62 61 63 6b 20 74  et dbSize back t
31560 6f 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20  o the value.    
31570 20 20 2a 2a 20 74 68 61 74 20 69 74 20 74 6f 6f    ** that it too
31580 6b 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  k at the start o
31590 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
315a0 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  n. Otherwise, th
315b0 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 73  e.      ** calls
315c0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
315d0 47 65 74 28 29 20 72 65 74 75 72 6e 20 7a 65 72  Get() return zer
315e0 6f 65 64 20 70 61 67 65 73 20 69 6e 73 74 65 61  oed pages instea
315f0 64 20 6f 66 20 0a 20 20 20 20 20 20 2a 2a 20 72  d of .      ** r
31600 65 61 64 69 6e 67 20 64 61 74 61 20 66 72 6f 6d  eading data from
31610 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31620 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  le..      **.   
31630 20 20 20 2a 2a 20 57 68 65 6e 20 6a 6f 75 72 6e     ** When journ
31640 61 6c 5f 6d 6f 64 65 3d 3d 4f 46 46 20 74 68 65  al_mode==OFF the
31650 20 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61   dbOrigSize is a
31660 6c 77 61 79 73 20 7a 65 72 6f 2c 20 73 6f 20 74  lways zero, so t
31670 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f  his.      ** blo
31680 63 6b 20 6e 65 76 65 72 20 72 75 6e 73 20 69 66  ck never runs if
31690 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46   journal_mode=OF
316a0 46 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 23 69  F..      */.  #i
316b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
316c0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
316d0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
316e0 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  bSize<pPager->db
316f0 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 20 20  OrigSize .      
31700 20 26 26 20 41 4c 57 41 59 53 28 70 50 61 67 65   && ALWAYS(pPage
31710 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
31720 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
31730 45 5f 4f 46 46 29 0a 20 20 20 20 20 20 29 7b 0a  E_OFF).      ){.
31740 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 20          Pgno i; 
31750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31770 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
31780 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  riable */.      
31790 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20 69 53 6b    const Pgno iSk
317a0 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47  ip = PAGER_MJ_PG
317b0 4e 4f 28 70 50 61 67 65 72 29 3b 20 2f 2a 20 50  NO(pPager); /* P
317c0 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 70 61 67 65  ending lock page
317d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   */.        cons
317e0 74 20 50 67 6e 6f 20 64 62 53 69 7a 65 20 3d 20  t Pgno dbSize = 
317f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 20  pPager->dbSize; 
31800 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
31810 65 20 69 6d 61 67 65 20 73 69 7a 65 20 2a 2f 20  e image size */ 
31820 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
31830 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
31840 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20  ->dbOrigSize;.  
31850 20 20 20 20 20 20 66 6f 72 28 20 69 3d 64 62 53        for( i=dbS
31860 69 7a 65 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72  ize+1; i<=pPager
31870 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 20 69 2b  ->dbOrigSize; i+
31880 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  + ){.          i
31890 66 28 20 21 73 71 6c 69 74 65 33 42 69 74 76 65  f( !sqlite3Bitve
318a0 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
318b0 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20  nJournal, i) && 
318c0 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20  i!=iSkip ){.    
318d0 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70          PgHdr *p
318e0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
318f0 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 6a 6f 75    /* Page to jou
31900 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20  rnal */.        
31910 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31920 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
31930 20 69 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20   i, &pPage);.   
31940 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
31950 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
31960 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
31970 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  ne_exit;.       
31980 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31990 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
319a0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
319b0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
319c0 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
319d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
319e0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63  LITE_OK ) goto c
319f0 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
31a00 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
31a10 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
31a20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
31a30 7a 65 20 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20  ze = dbSize;.   
31a40 20 20 20 7d 20 0a 20 20 23 65 6e 64 69 66 0a 20     } .  #endif. 
31a50 20 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65   .      /* Write
31a60 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
31a70 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68  nal name into th
31a80 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
31a90 49 66 20 61 20 6d 61 73 74 65 72 20 0a 20 20 20  If a master .   
31aa0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
31ab0 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65  le name has alre
31ac0 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
31ad0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
31ae0 66 69 6c 65 2c 20 0a 20 20 20 20 20 20 2a 2a 20  file, .      ** 
31af0 6f 72 20 69 66 20 7a 4d 61 73 74 65 72 20 69 73  or if zMaster is
31b00 20 4e 55 4c 4c 20 28 6e 6f 20 6d 61 73 74 65 72   NULL (no master
31b10 20 6a 6f 75 72 6e 61 6c 29 2c 20 74 68 65 6e 20   journal), then 
31b20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  this call is a n
31b30 6f 2d 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  o-op..      */. 
31b40 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d       rc = writeM
31b50 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
31b60 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
31b70 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
31b80 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f  ITE_OK ) goto co
31b90 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
31ba0 78 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a  xit;.  .      /*
31bb0 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
31bc0 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 61  l file. If the a
31bd0 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74  tomic-update opt
31be0 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 65 69  imization is bei
31bf0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 64  ng.      ** used
31c00 2c 20 74 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c  , this call will
31c10 20 6e 6f 74 20 63 72 65 61 74 65 20 74 68 65 20   not create the 
31c20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
31c30 70 65 72 66 6f 72 6d 20 61 6e 79 0a 20 20 20 20  perform any.    
31c40 20 20 2a 2a 20 72 65 61 6c 20 49 4f 2e 0a 20 20    ** real IO..  
31c50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
31c60 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
31c70 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
31c80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31c90 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
31ca0 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 0a  se_one_exit;.  .
31cb0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61        /* Write a
31cc0 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74  ll dirty pages t
31cd0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
31ce0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ile. */.      rc
31cf0 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
31d00 61 67 65 6c 69 73 74 28 73 71 6c 69 74 65 33 50  agelist(sqlite3P
31d10 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
31d20 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29  Pager->pPCache))
31d30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
31d40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31d50 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
31d60 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c  =SQLITE_IOERR_BL
31d70 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 20 20 20  OCKED );.       
31d80 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
31d90 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20  se_one_exit;.   
31da0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
31db0 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
31dc0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
31dd0 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49  );.  .      /* I
31de0 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
31df0 73 6b 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61  sk is not the sa
31e00 6d 65 20 73 69 7a 65 20 61 73 20 74 68 65 20 64  me size as the d
31e10 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 0a 20  atabase image,. 
31e20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65       ** then use
31e30 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 20   pager_truncate 
31e40 74 6f 20 67 72 6f 77 20 6f 72 20 73 68 72 69 6e  to grow or shrin
31e50 6b 20 74 68 65 20 66 69 6c 65 20 68 65 72 65 2e  k the file here.
31e60 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
31e70 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
31e80 7a 65 21 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze!=pPager->dbFi
31e90 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
31ea0 20 20 50 67 6e 6f 20 6e 4e 65 77 20 3d 20 70 50    Pgno nNew = pP
31eb0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 2d 20 28  ager->dbSize - (
31ec0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
31ed0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
31ee0 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20  ager));.        
31ef0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
31f00 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
31f10 4c 55 53 49 56 45 20 29 3b 0a 20 20 20 20 20 20  LUSIVE );.      
31f20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
31f30 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 4e  ncate(pPager, nN
31f40 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
31f50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31f60 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
31f70 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20  se_one_exit;.   
31f80 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a     }.  .      /*
31f90 20 46 69 6e 61 6c 6c 79 2c 20 73 79 6e 63 20 74   Finally, sync t
31fa0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
31fb0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21  . */.      if( !
31fc0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26  pPager->noSync &
31fd0 26 20 21 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  & !noSync ){.   
31fe0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31ff0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
32000 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
32010 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d  _flags);.      }
32020 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
32030 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  "DBSYNC %p\n", p
32040 50 61 67 65 72 29 29 0a 20 20 20 20 7d 0a 0a 20  Pager)).    }.. 
32050 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
32060 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b   = PAGER_SYNCED;
32070 0a 20 20 7d 0a 0a 63 6f 6d 6d 69 74 5f 70 68 61  .  }..commit_pha
32080 73 65 5f 6f 6e 65 5f 65 78 69 74 3a 0a 20 20 72  se_one_exit:.  r
32090 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
320a0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
320b0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
320c0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
320d0 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6d  ile has been com
320e0 70 6c 65 74 65 6c 79 0a 2a 2a 20 75 70 64 61 74  pletely.** updat
320f0 65 64 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68  ed to reflect th
32100 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
32110 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  y the current tr
32120 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a  ansaction and.**
32130 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
32140 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
32150 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 69  e still exists i
32160 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
32170 6d 20 0a 2a 2a 20 74 68 6f 75 67 68 2c 20 61 6e  m .** though, an
32180 64 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  d if a failure o
32190 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f  ccurs at this po
321a0 69 6e 74 20 69 74 20 77 69 6c 6c 20 65 76 65 6e  int it will even
321b0 74 75 61 6c 6c 79 0a 2a 2a 20 62 65 20 75 73 65  tually.** be use
321c0 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  d as a hot-journ
321d0 61 6c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  al and the curre
321e0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  nt transaction r
321f0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
32200 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
32210 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f  finalizes the jo
32220 75 72 6e 61 6c 20 66 69 6c 65 2c 20 65 69 74 68  urnal file, eith
32230 65 72 20 62 79 20 64 65 6c 65 74 69 6e 67 2c 20  er by deleting, 
32240 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6e 67 20 6f  .** truncating o
32250 72 20 70 61 72 74 69 61 6c 6c 79 20 7a 65 72 6f  r partially zero
32260 69 6e 67 20 69 74 2c 20 73 6f 20 74 68 61 74 20  ing it, so that 
32270 69 74 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  it cannot be use
32280 64 20 0a 2a 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f  d .** for hot-jo
32290 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20  urnal rollback. 
322a0 4f 6e 63 65 20 74 68 69 73 20 69 73 20 64 6f 6e  Once this is don
322b0 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
322c0 6e 20 69 73 0a 2a 2a 20 69 72 72 65 76 6f 63 61  n is.** irrevoca
322d0 62 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a  bly committed..*
322e0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
322f0 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65   occurs, an IO e
32300 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
32310 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61  urned and the pa
32320 67 65 72 0a 2a 2a 20 6d 6f 76 65 73 20 69 6e 74  ger.** moves int
32330 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  o the error stat
32340 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  e. Otherwise, SQ
32350 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
32360 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
32370 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
32380 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50  aseTwo(Pager *pP
32390 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
323a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
323b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
323c0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
323d0 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
323e0 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  ne should not be
323f0 20 63 61 6c 6c 65 64 20 69 66 20 61 20 70 72 69   called if a pri
32400 6f 72 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  or error has occ
32410 75 72 72 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20  urred..  ** But 
32420 69 66 20 28 64 75 65 20 74 6f 20 61 20 63 6f 64  if (due to a cod
32430 69 6e 67 20 65 72 72 6f 72 20 65 6c 73 65 77 68  ing error elsewh
32440 65 72 65 20 69 6e 20 74 68 65 20 73 79 73 74 65  ere in the syste
32450 6d 29 20 69 74 20 64 6f 65 73 20 67 65 74 0a 20  m) it does get. 
32460 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 6a 75 73 74   ** called, just
32470 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
32480 20 65 72 72 6f 72 20 63 6f 64 65 20 77 69 74 68   error code with
32490 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
324a0 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ng. */.  if( NEV
324b0 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
324c0 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61  de) ) return pPa
324d0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20  ger->errCode;.. 
324e0 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
324f0 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  n should not be 
32500 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20 70 61  called if the pa
32510 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 61 74  ger is not in at
32520 20 6c 65 61 73 74 0a 20 20 2a 2a 20 50 41 47 45   least.  ** PAGE
32530 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65  R_RESERVED state
32540 2e 20 41 6e 64 20 69 6e 64 65 65 64 20 53 51 4c  . And indeed SQL
32550 69 74 65 20 6e 65 76 65 72 20 64 6f 65 73 20 74  ite never does t
32560 68 69 73 2e 20 42 75 74 20 69 74 20 69 73 0a 20  his. But it is. 
32570 20 2a 2a 20 6e 69 63 65 20 74 6f 20 68 61 76 65   ** nice to have
32580 20 74 68 69 73 20 64 65 66 65 6e 73 69 76 65 20   this defensive 
32590 74 65 73 74 20 68 65 72 65 20 61 6e 79 77 61 79  test here anyway
325a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ..  */.  if( NEV
325b0 45 52 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  ER(pPager->state
325c0 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 29  <PAGER_RESERVED)
325d0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
325e0 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 41 6e  _ERROR;..  /* An
325f0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 49   optimization. I
32600 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  f the database w
32610 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  as not actually 
32620 6d 6f 64 69 66 69 65 64 20 64 75 72 69 6e 67 0a  modified during.
32630 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61    ** this transa
32640 63 74 69 6f 6e 2c 20 74 68 65 20 70 61 67 65 72  ction, the pager
32650 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
32660 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 61 6e  xclusive-mode an
32670 64 20 69 73 0a 20 20 2a 2a 20 75 73 69 6e 67 20  d is.  ** using 
32680 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e  persistent journ
32690 61 6c 73 2c 20 74 68 65 6e 20 74 68 69 73 20 66  als, then this f
326a0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
326b0 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  op..  **.  ** Th
326c0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
326d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72  ournal file curr
326e0 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20 61  ently contains a
326f0 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 20   single journal 
32700 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77 69 74  .  ** header wit
32710 68 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  h the nRec field
32720 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 73 75   set to 0. If su
32730 63 68 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ch a journal is 
32740 75 73 65 64 20 61 73 0a 20 20 2a 2a 20 61 20 68  used as.  ** a h
32750 6f 74 2d 6a 6f 75 72 6e 61 6c 20 64 75 72 69 6e  ot-journal durin
32760 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  g hot-journal ro
32770 6c 6c 62 61 63 6b 2c 20 30 20 63 68 61 6e 67 65  llback, 0 change
32780 73 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 0a 20  s will be made. 
32790 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62   ** to the datab
327a0 61 73 65 20 66 69 6c 65 2e 20 53 6f 20 74 68 65  ase file. So the
327b0 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
327c0 20 7a 65 72 6f 20 74 68 65 20 6a 6f 75 72 6e 61   zero the journa
327d0 6c 20 0a 20 20 2a 2a 20 68 65 61 64 65 72 2e 20  l .  ** header. 
327e0 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 72 20  Since the pager 
327f0 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  is in exclusive 
32800 6d 6f 64 65 2c 20 74 68 65 72 65 20 69 73 20 6e  mode, there is n
32810 6f 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 64  o need.  ** to d
32820 72 6f 70 20 61 6e 79 20 6c 6f 63 6b 73 20 65 69  rop any locks ei
32830 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ther..  */.  if(
32840 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
32850 69 65 64 3d 3d 30 20 26 26 20 70 50 61 67 65 72  ied==0 && pPager
32860 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
32870 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  .   && pPager->j
32880 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
32890 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
328a0 52 53 49 53 54 0a 20 20 29 7b 0a 20 20 20 20 61  RSIST.  ){.    a
328b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
328c0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
328d0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
328e0 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) );.    return 
328f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
32900 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43    PAGERTRACE(("C
32910 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47  OMMIT %d\n", PAG
32920 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
32930 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
32940 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
32950 59 4e 43 45 44 20 7c 7c 20 4d 45 4d 44 42 20 7c  YNCED || MEMDB |
32960 7c 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  | !pPager->dbMod
32970 69 66 69 65 64 20 29 3b 0a 20 20 72 63 20 3d 20  ified );.  rc = 
32980 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
32990 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50  ction(pPager, pP
329a0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29  ager->setMaster)
329b0 3b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  ;.  return pager
329c0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
329d0 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  c);.}../*.** Rol
329e0 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65  lback all change
329f0 73 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20  s. The database 
32a00 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41  falls back to PA
32a10 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e  GER_SHARED mode.
32a20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
32a30 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 77  tion performs tw
32a40 6f 20 74 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20  o tasks:.**.**  
32a50 20 31 29 20 49 74 20 72 6f 6c 6c 73 20 62 61 63   1) It rolls bac
32a60 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  k the journal fi
32a70 6c 65 2c 20 72 65 73 74 6f 72 69 6e 67 20 61 6c  le, restoring al
32a80 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  l database file 
32a90 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 69 6e 2d  and .**      in-
32aa0 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67  memory cache pag
32ab0 65 73 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  es to the state 
32ac0 74 68 65 79 20 77 65 72 65 20 69 6e 20 77 68 65  they were in whe
32ad0 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
32ae0 6e 0a 2a 2a 20 20 20 20 20 20 77 61 73 20 6f 70  n.**      was op
32af0 65 6e 65 64 2c 20 61 6e 64 0a 2a 2a 20 20 20 32  ened, and.**   2
32b00 29 20 49 74 20 66 69 6e 61 6c 69 7a 65 73 20 74  ) It finalizes t
32b10 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
32b20 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e   so that it is n
32b30 6f 74 20 75 73 65 64 20 66 6f 72 20 68 6f 74 0a  ot used for hot.
32b40 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b  **      rollback
32b50 20 61 74 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e   at any point in
32b60 20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 0a   the future..**.
32b70 2a 2a 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  ** subject to th
32b80 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 61 6c  e following qual
32b90 69 66 69 63 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a  ifications:.**.*
32ba0 2a 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  * * If the journ
32bb0 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 79  al file is not y
32bc0 65 74 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  et open when thi
32bd0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
32be0 6c 6c 65 64 2c 0a 2a 2a 20 20 20 74 68 65 6e 20  lled,.**   then 
32bf0 6f 6e 6c 79 20 28 32 29 20 69 73 20 70 65 72 66  only (2) is perf
32c00 6f 72 6d 65 64 2e 20 49 6e 20 74 68 69 73 20 63  ormed. In this c
32c10 61 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ase there is no 
32c20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
32c30 20 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a    to roll back..
32c40 2a 2a 0a 2a 2a 20 2a 20 49 66 20 69 6e 20 61 6e  **.** * If in an
32c50 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68   error state oth
32c60 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46  er than SQLITE_F
32c70 55 4c 4c 2c 20 74 68 65 6e 20 74 61 73 6b 20 28  ULL, then task (
32c80 31 29 20 69 73 20 0a 2a 2a 20 20 20 70 65 72 66  1) is .**   perf
32c90 6f 72 6d 65 64 2e 20 49 66 20 73 75 63 63 65 73  ormed. If succes
32ca0 73 66 75 6c 2c 20 74 61 73 6b 20 28 32 29 2e 20  sful, task (2). 
32cb0 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
32cc0 65 20 6f 75 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f  e outcome.**   o
32cd0 66 20 65 69 74 68 65 72 2c 20 74 68 65 20 65 72  f either, the er
32ce0 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
32cf0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
32d00 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a   to the caller.*
32d10 2a 20 20 20 28 69 2e 65 2e 20 65 69 74 68 65 72  *   (i.e. either
32d20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72   SQLITE_IOERR or
32d30 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29   SQLITE_CORRUPT)
32d40 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65  ..**.** * If the
32d50 20 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47   pager is in PAG
32d60 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74  ER_RESERVED stat
32d70 65 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20  e, then attempt 
32d80 28 31 29 2e 20 57 68 65 74 68 65 72 0a 2a 2a 20  (1). Whether.** 
32d90 20 20 6f 72 20 6e 6f 74 20 28 31 29 20 69 73 20    or not (1) is 
32da0 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6c 73 6f  successful, also
32db0 20 61 74 74 65 6d 70 74 20 28 32 29 2e 20 49 66   attempt (2). If
32dc0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
32dd0 75 72 6e 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f  urn.**   SQLITE_
32de0 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65  OK. Otherwise, e
32df0 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73  nter the error s
32e00 74 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  tate and return 
32e10 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 20 20  the first .**   
32e20 65 72 72 6f 72 20 63 6f 64 65 20 65 6e 63 6f 75  error code encou
32e30 6e 74 65 72 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20  ntered. .**.**  
32e40 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
32e50 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
32e60 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
32e70 73 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 74  se was written t
32e80 6f 2e 20 0a 2a 2a 20 20 20 53 6f 20 69 73 20 73  o. .**   So is s
32e90 61 66 65 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  afe to finalize 
32ea0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
32eb0 20 65 76 65 6e 20 69 66 20 74 68 65 20 70 6c 61   even if the pla
32ec0 79 62 61 63 6b 20 0a 2a 2a 20 20 20 28 6f 70 65  yback .**   (ope
32ed0 72 61 74 69 6f 6e 20 31 29 20 66 61 69 6c 65 64  ration 1) failed
32ee0 2e 20 48 6f 77 65 76 65 72 20 74 68 65 20 70 61  . However the pa
32ef0 67 65 72 20 6d 75 73 74 20 65 6e 74 65 72 20 74  ger must enter t
32f00 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 2a  he error state.*
32f10 2a 20 20 20 61 73 20 74 68 65 20 63 6f 6e 74 65  *   as the conte
32f20 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65  nts of the in-me
32f30 6d 6f 72 79 20 63 61 63 68 65 20 61 72 65 20 6e  mory cache are n
32f40 6f 77 20 73 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a  ow suspect..**.*
32f50 2a 20 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20  * * Finally, if 
32f60 69 6e 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  in PAGER_EXCLUSI
32f70 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 61  VE state, then a
32f80 74 74 65 6d 70 74 20 28 31 29 2e 20 4f 6e 6c 79  ttempt (1). Only
32f90 0a 2a 2a 20 20 20 61 74 74 65 6d 70 74 20 28 32  .**   attempt (2
32fa0 29 20 69 66 20 28 31 29 20 69 73 20 73 75 63 63  ) if (1) is succ
32fb0 65 73 73 66 75 6c 2e 20 52 65 74 75 72 6e 20 53  essful. Return S
32fc0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
32fd0 65 73 73 66 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68  essful,.**   oth
32fe0 65 72 77 69 73 65 20 65 6e 74 65 72 20 74 68 65  erwise enter the
32ff0 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64   error state and
33000 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
33010 72 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 65 20  r code from the 
33020 0a 2a 2a 20 20 20 66 61 69 6c 69 6e 67 20 6f 70  .**   failing op
33030 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  eration..**.**  
33040 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
33050 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
33060 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 77 72  may have been wr
33070 69 74 74 65 6e 20 74 6f 2e 20 53 6f 20 69 66 20  itten to. So if 
33080 74 68 65 0a 2a 2a 20 20 20 70 6c 61 79 62 61 63  the.**   playbac
33090 6b 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 20  k operation did 
330a0 6e 6f 74 20 73 75 63 63 65 65 64 20 69 74 20 77  not succeed it w
330b0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 61 66 65  ould not be safe
330c0 20 74 6f 20 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20   to finalize.** 
330d0 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    the journal fi
330e0 6c 65 2e 20 49 74 20 6e 65 65 64 73 20 74 6f 20  le. It needs to 
330f0 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
33100 69 6c 65 2d 73 79 73 74 65 6d 20 73 6f 20 74 68  ile-system so th
33110 61 74 0a 2a 2a 20 20 20 73 6f 6d 65 20 6f 74 68  at.**   some oth
33120 65 72 20 70 72 6f 63 65 73 73 20 63 61 6e 20 75  er process can u
33130 73 65 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65  se it to restore
33140 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 74   the database st
33150 61 74 65 20 28 62 79 0a 2a 2a 20 20 20 68 6f 74  ate (by.**   hot
33160 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
33170 6b 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  k)..*/.int sqlit
33180 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
33190 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
331a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
331b0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
331c0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
331d0 20 63 6f 64 65 20 2a 2f 0a 20 20 50 41 47 45 52   code */.  PAGER
331e0 54 52 41 43 45 28 28 22 52 4f 4c 4c 42 41 43 4b  TRACE(("ROLLBACK
331f0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
33200 70 50 61 67 65 72 29 29 29 3b 0a 20 20 69 66 28  pPager)));.  if(
33210 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
33220 67 65 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  ger) ){.    int 
33230 72 63 32 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  rc2;..    rc = s
33240 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70  qlite3PagerSavep
33250 6f 69 6e 74 28 70 50 61 67 65 72 2c 20 53 41 56  oint(pPager, SAV
33260 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
33270 20 2d 31 29 3b 0a 20 20 20 20 72 63 32 20 3d 20   -1);.    rc2 = 
33280 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
33290 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50  ction(pPager, pP
332a0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29  ager->setMaster)
332b0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
332c0 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72  LITE_OK ) rc = r
332d0 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  c2;.    rc = pag
332e0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
332f0 20 72 63 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66   rc);.  }else if
33300 28 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  ( !pPager->dbMod
33310 69 66 69 65 64 20 7c 7c 20 21 69 73 4f 70 65 6e  ified || !isOpen
33320 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
33330 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
33340 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
33350 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
33360 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 7d 65  setMaster);.  }e
33370 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
33380 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65  errCode && pPage
33390 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
333a0 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69  TE_FULL ){.    i
333b0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
333c0 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
333d0 45 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  E ){.      pager
333e0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
333f0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
33400 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
33410 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Code;.  }else{. 
33420 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
33430 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
33440 52 56 45 44 20 29 7b 0a 20 20 20 20 20 20 69 6e  RVED ){.      in
33450 74 20 72 63 32 3b 0a 20 20 20 20 20 20 72 63 20  t rc2;.      rc 
33460 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
33470 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
33480 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 65     rc2 = pager_e
33490 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
334a0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
334b0 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  etMaster);.     
334c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
334d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
334e0 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a   = rc2;.      }.
334f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33500 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
33510 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
33520 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
33530 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
33540 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
33550 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  lid = 0;.    }..
33560 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72      /* If an err
33570 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
33580 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20   a ROLLBACK, we 
33590 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72  can no longer tr
335a0 75 73 74 20 74 68 65 20 70 61 67 65 72 0a 20 20  ust the pager.  
335b0 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63    ** cache. So c
335c0 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28  all pager_error(
335d0 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74  ) on the way out
335e0 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72   to make any err
335f0 6f 72 20 0a 20 20 20 20 2a 2a 20 70 65 72 73 69  or .    ** persi
33600 73 74 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  stent..    */.  
33610 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
33620 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
33630 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
33640 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
33650 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74   TRUE if the dat
33660 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70  abase file is op
33670 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20  ened read-only. 
33680 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
33690 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
336a0 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20   is (in theory) 
336b0 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20  writable..*/.u8 
336c0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
336d0 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50  adonly(Pager *pP
336e0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
336f0 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
33700 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
33710 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
33720 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
33730 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20  e pager..*/.int 
33740 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
33750 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
33760 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  er){.  return sq
33770 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
33780 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
33790 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  che);.}../*.** R
337a0 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 78  eturn the approx
337b0 69 6d 61 74 65 20 6e 75 6d 62 65 72 20 6f 66 20  imate number of 
337c0 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
337d0 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 73 65  currently.** use
337e0 64 20 62 79 20 74 68 65 20 70 61 67 65 72 20 61  d by the pager a
337f0 6e 64 20 69 74 73 20 61 73 73 6f 63 69 61 74 65  nd its associate
33800 64 20 63 61 63 68 65 2e 0a 2a 2f 0a 69 6e 74 20  d cache..*/.int 
33810 73 71 6c 69 74 65 33 50 61 67 65 72 4d 65 6d 55  sqlite3PagerMemU
33820 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  sed(Pager *pPage
33830 72 29 7b 0a 20 20 69 6e 74 20 70 65 72 50 61 67  r){.  int perPag
33840 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
33850 70 61 67 65 53 69 7a 65 20 2b 20 70 50 61 67 65  pageSize + pPage
33860 72 2d 3e 6e 45 78 74 72 61 20 2b 20 32 30 3b 0a  r->nExtra + 20;.
33870 20 20 72 65 74 75 72 6e 20 70 65 72 50 61 67 65    return perPage
33880 53 69 7a 65 2a 73 71 6c 69 74 65 33 50 63 61 63  Size*sqlite3Pcac
33890 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
338a0 65 72 2d 3e 70 50 43 61 63 68 65 29 0a 20 20 20  er->pPCache).   
338b0 20 20 20 20 20 20 20 20 2b 20 73 71 6c 69 74 65          + sqlite
338c0 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 50 61 67  3MallocSize(pPag
338d0 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  er);.}../*.** Re
338e0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
338f0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
33900 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
33910 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  age..*/.int sqli
33920 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
33930 6f 75 6e 74 28 44 62 50 61 67 65 20 2a 70 50 61  ount(DbPage *pPa
33940 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  ge){.  return sq
33950 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52  lite3PcachePageR
33960 65 66 63 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a  efcount(pPage);.
33970 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
33980 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73  _TEST./*.** This
33990 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
339a0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
339b0 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a   analysis only..
339c0 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50  */.int *sqlite3P
339d0 61 67 65 72 53 74 61 74 73 28 50 61 67 65 72 20  agerStats(Pager 
339e0 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74  *pPager){.  stat
339f0 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20  ic int a[11];.  
33a00 61 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 50 63  a[0] = sqlite3Pc
33a10 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
33a20 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
33a30 20 61 5b 31 5d 20 3d 20 73 71 6c 69 74 65 33 50   a[1] = sqlite3P
33a40 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70  cachePagecount(p
33a50 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
33a60 0a 20 20 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65  .  a[2] = sqlite
33a70 33 50 63 61 63 68 65 47 65 74 43 61 63 68 65 73  3PcacheGetCaches
33a80 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
33a90 63 68 65 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70  che);.  a[3] = p
33aa0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
33ab0 69 64 20 3f 20 28 69 6e 74 29 20 70 50 61 67 65  id ? (int) pPage
33ac0 72 2d 3e 64 62 53 69 7a 65 20 3a 20 2d 31 3b 0a  r->dbSize : -1;.
33ad0 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d    a[4] = pPager-
33ae0 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d  >state;.  a[5] =
33af0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
33b00 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65  ;.  a[6] = pPage
33b10 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20  r->nHit;.  a[7] 
33b20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b  = pPager->nMiss;
33b30 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a  .  a[8] = 0;  /*
33b40 20 55 73 65 64 20 74 6f 20 62 65 20 70 50 61 67   Used to be pPag
33b50 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61  er->nOvfl */.  a
33b60 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  [9] = pPager->nR
33b70 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70  ead;.  a[10] = p
33b80 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20  Pager->nWrite;. 
33b90 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e   return a;.}.#en
33ba0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
33bb0 6e 20 74 72 75 65 20 69 66 20 74 68 69 73 20 69  n true if this i
33bc0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  s an in-memory p
33bd0 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ager..*/.int sql
33be0 69 74 65 33 50 61 67 65 72 49 73 4d 65 6d 64 62  ite3PagerIsMemdb
33bf0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
33c00 0a 20 20 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b  .  return MEMDB;
33c10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
33c20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 61  that there are a
33c30 74 20 6c 65 61 73 74 20 6e 53 61 76 65 70 6f 69  t least nSavepoi
33c40 6e 74 20 73 61 76 65 70 6f 69 6e 74 73 20 6f 70  nt savepoints op
33c50 65 6e 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  en. If there are
33c60 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 6c 65  .** currently le
33c70 73 73 20 74 68 61 6e 20 6e 53 61 76 65 70 6f 69  ss than nSavepoi
33c80 6e 74 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 6f  nts open, then o
33c90 70 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  pen one or more 
33ca0 73 61 76 65 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f  savepoints.** to
33cb0 20 6d 61 6b 65 20 75 70 20 74 68 65 20 64 69 66   make up the dif
33cc0 66 65 72 65 6e 63 65 2e 20 49 66 20 74 68 65 20  ference. If the 
33cd0 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f  number of savepo
33ce0 69 6e 74 73 20 69 73 20 61 6c 72 65 61 64 79 0a  ints is already.
33cf0 2a 2a 20 65 71 75 61 6c 20 74 6f 20 6e 53 61 76  ** equal to nSav
33d00 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69  epoint, then thi
33d10 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
33d20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
33d30 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
33d40 69 6f 6e 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  ion fails, SQLIT
33d50 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
33d60 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ned. If an error
33d70 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c   .** occurs whil
33d80 65 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 73 75  e opening the su
33d90 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  b-journal file, 
33da0 74 68 65 6e 20 61 6e 20 49 4f 20 65 72 72 6f 72  then an IO error
33db0 20 63 6f 64 65 20 69 73 0a 2a 2a 20 72 65 74 75   code is.** retu
33dc0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
33dd0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
33de0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
33df0 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 50 61 67  penSavepoint(Pag
33e00 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
33e10 6e 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  nSavepoint){.  i
33e20 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
33e30 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
33e40 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
33e50 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
33e60 20 6e 43 75 72 72 65 6e 74 20 3d 20 70 50 61 67   nCurrent = pPag
33e70 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
33e80 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
33e90 74 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65  t number of save
33ea0 70 6f 69 6e 74 73 20 2a 2f 0a 0a 20 20 69 66 28  points */..  if(
33eb0 20 6e 53 61 76 65 70 6f 69 6e 74 3e 6e 43 75 72   nSavepoint>nCur
33ec0 72 65 6e 74 20 26 26 20 70 50 61 67 65 72 2d 3e  rent && pPager->
33ed0 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  useJournal ){.  
33ee0 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
33ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
33f10 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
33f20 2f 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  /.    PagerSavep
33f30 6f 69 6e 74 20 2a 61 4e 65 77 3b 20 20 20 20 20  oint *aNew;     
33f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33f50 20 4e 65 77 20 50 61 67 65 72 2e 61 53 61 76 65   New Pager.aSave
33f60 70 6f 69 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20  point array */. 
33f70 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20     int nPage;   
33f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
33fa0 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 66  ze of database f
33fb0 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d  ile */..    rc =
33fc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
33fd0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
33fe0 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
33ff0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
34000 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65  .    /* Grow the
34010 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
34020 74 20 61 72 72 61 79 20 75 73 69 6e 67 20 72 65  t array using re
34030 61 6c 6c 6f 63 28 29 2e 20 52 65 74 75 72 6e 20  alloc(). Return 
34040 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20  SQLITE_NOMEM.   
34050 20 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f 63   ** if the alloc
34060 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20 4f 74 68  ation fails. Oth
34070 65 72 77 69 73 65 2c 20 7a 65 72 6f 20 74 68 65  erwise, zero the
34080 20 6e 65 77 20 70 6f 72 74 69 6f 6e 20 69 6e 20   new portion in 
34090 63 61 73 65 20 61 20 0a 20 20 20 20 2a 2a 20 6d  case a .    ** m
340a0 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
340b0 63 75 72 73 20 77 68 69 6c 65 20 70 6f 70 75 6c  curs while popul
340c0 61 74 69 6e 67 20 69 74 20 69 6e 20 74 68 65 20  ating it in the 
340d0 66 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20 62 65  for(...) loop be
340e0 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  low..    */.    
340f0 61 4e 65 77 20 3d 20 28 50 61 67 65 72 53 61 76  aNew = (PagerSav
34100 65 70 6f 69 6e 74 20 2a 29 73 71 6c 69 74 65 33  epoint *)sqlite3
34110 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  Realloc(.       
34120 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
34130 69 6e 74 2c 20 73 69 7a 65 6f 66 28 50 61 67 65  int, sizeof(Page
34140 72 53 61 76 65 70 6f 69 6e 74 29 2a 6e 53 61 76  rSavepoint)*nSav
34150 65 70 6f 69 6e 74 0a 20 20 20 20 29 3b 0a 20 20  epoint.    );.  
34160 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a 20    if( !aNew ){. 
34170 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
34180 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
34190 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77      memset(&aNew
341a0 5b 6e 43 75 72 72 65 6e 74 5d 2c 20 30 2c 20 28  [nCurrent], 0, (
341b0 6e 53 61 76 65 70 6f 69 6e 74 2d 6e 43 75 72 72  nSavepoint-nCurr
341c0 65 6e 74 29 20 2a 20 73 69 7a 65 6f 66 28 50 61  ent) * sizeof(Pa
341d0 67 65 72 53 61 76 65 70 6f 69 6e 74 29 29 3b 0a  gerSavepoint));.
341e0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76      pPager->aSav
341f0 65 70 6f 69 6e 74 20 3d 20 61 4e 65 77 3b 0a 0a  epoint = aNew;..
34200 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
34210 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
34220 6e 74 20 73 74 72 75 63 74 75 72 65 73 20 6a 75  nt structures ju
34230 73 74 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f  st allocated. */
34240 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e 43 75 72  .    for(ii=nCur
34250 72 65 6e 74 3b 20 69 69 3c 6e 53 61 76 65 70 6f  rent; ii<nSavepo
34260 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
34270 20 20 61 4e 65 77 5b 69 69 5d 2e 6e 4f 72 69 67    aNew[ii].nOrig
34280 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
34290 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
342a0 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65  r->jfd) && pPage
342b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20  r->journalOff>0 
342c0 29 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b  ){.        aNew[
342d0 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 70 50  ii].iOffset = pP
342e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
342f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
34300 20 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e         aNew[ii].
34310 69 4f 66 66 73 65 74 20 3d 20 4a 4f 55 52 4e 41  iOffset = JOURNA
34320 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
34330 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34340 61 4e 65 77 5b 69 69 5d 2e 69 53 75 62 52 65 63  aNew[ii].iSubRec
34350 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52   = pPager->nSubR
34360 65 63 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b 69  ec;.      aNew[i
34370 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  i].pInSavepoint 
34380 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
34390 72 65 61 74 65 28 6e 50 61 67 65 29 3b 0a 20 20  reate(nPage);.  
343a0 20 20 20 20 69 66 28 20 21 61 4e 65 77 5b 69 69      if( !aNew[ii
343b0 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 29  ].pInSavepoint )
343c0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
343d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
343e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
343f0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
34400 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
34410 73 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f  sqlite3WalSavepo
34420 69 6e 74 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  int(pPager->pWal
34430 2c 20 61 4e 65 77 5b 69 69 5d 2e 61 57 61 6c 44  , aNew[ii].aWalD
34440 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ata);.      }.  
34450 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76      pPager->nSav
34460 65 70 6f 69 6e 74 20 3d 20 69 69 2b 31 3b 0a 20  epoint = ii+1;. 
34470 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
34480 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
34490 69 6e 74 3d 3d 6e 53 61 76 65 70 6f 69 6e 74 20  int==nSavepoint 
344a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 54 72 75  );.    assertTru
344b0 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
344c0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
344d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
344e0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
344f0 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  n is called to r
34500 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65 61  ollback or relea
34510 73 65 20 28 63 6f 6d 6d 69 74 29 20 61 20 73 61  se (commit) a sa
34520 76 65 70 6f 69 6e 74 2e 0a 2a 2a 20 54 68 65 20  vepoint..** The 
34530 73 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 65 6c  savepoint to rel
34540 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
34550 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 65   need not be the
34560 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 0a   most recently .
34570 2a 2a 20 63 72 65 61 74 65 64 20 73 61 76 65 70  ** created savep
34580 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61  oint..**.** Para
34590 6d 65 74 65 72 20 6f 70 20 69 73 20 61 6c 77 61  meter op is alwa
345a0 79 73 20 65 69 74 68 65 72 20 53 41 56 45 50 4f  ys either SAVEPO
345b0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 20  INT_ROLLBACK or 
345c0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
345d0 45 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 53  E..** If it is S
345e0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
345f0 2c 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20 61  , then release a
34600 6e 64 20 64 65 73 74 72 6f 79 20 74 68 65 20 73  nd destroy the s
34610 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 2a 2a  avepoint with.**
34620 20 69 6e 64 65 78 20 69 53 61 76 65 70 6f 69 6e   index iSavepoin
34630 74 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45  t. If it is SAVE
34640 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
34650 74 68 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 61 6c  then rollback al
34660 6c 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 61  l changes.** tha
34670 74 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20  t have occurred 
34680 73 69 6e 63 65 20 74 68 65 20 73 70 65 63 69 66  since the specif
34690 69 65 64 20 73 61 76 65 70 6f 69 6e 74 20 77 61  ied savepoint wa
346a0 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  s created..**.**
346b0 20 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74   The savepoint t
346c0 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65  o rollback or re
346d0 6c 65 61 73 65 20 69 73 20 69 64 65 6e 74 69 66  lease is identif
346e0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
346f0 20 0a 2a 2a 20 69 53 61 76 65 70 6f 69 6e 74 2e   .** iSavepoint.
34700 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 6d 65   A value of 0 me
34710 61 6e 73 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ans to operate o
34720 6e 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20  n the outermost 
34730 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 28 74 68  savepoint.** (th
34740 65 20 66 69 72 73 74 20 63 72 65 61 74 65 64 29  e first created)
34750 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 28 50 61  . A value of (Pa
34760 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31  ger.nSavepoint-1
34770 29 20 6d 65 61 6e 73 20 6f 70 65 72 61 74 65 0a  ) means operate.
34780 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  ** on the most r
34790 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20  ecently created 
347a0 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 53  savepoint. If iS
347b0 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61  avepoint is grea
347c0 74 65 72 20 74 68 61 6e 0a 2a 2a 20 28 50 61 67  ter than.** (Pag
347d0 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29  er.nSavepoint-1)
347e0 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
347f0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
34800 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 65 67 61  .**.** If a nega
34810 74 69 76 65 20 76 61 6c 75 65 20 69 73 20 70 61  tive value is pa
34820 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
34830 63 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20  ction, then the 
34840 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  current.** trans
34850 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
34860 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
34870 69 66 66 65 72 65 6e 74 20 74 6f 20 63 61 6c 6c  ifferent to call
34880 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ing .** sqlite3P
34890 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 62  agerRollback() b
348a0 65 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63  ecause this func
348b0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 74 65  tion does not te
348c0 72 6d 69 6e 61 74 65 0a 2a 2a 20 74 68 65 20 74  rminate.** the t
348d0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 75 6e  ransaction or un
348e0 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
348f0 65 2c 20 69 74 20 6a 75 73 74 20 72 65 73 74 6f  e, it just resto
34900 72 65 73 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74  res the .** cont
34910 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61  ents of the data
34920 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67  base to its orig
34930 69 6e 61 6c 20 73 74 61 74 65 2e 20 0a 2a 2a 0a  inal state. .**.
34940 2a 2a 20 49 6e 20 61 6e 79 20 63 61 73 65 2c 20  ** In any case, 
34950 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 77  all savepoints w
34960 69 74 68 20 61 6e 20 69 6e 64 65 78 20 67 72 65  ith an index gre
34970 61 74 65 72 20 74 68 61 6e 20 69 53 61 76 65 70  ater than iSavep
34980 6f 69 6e 74 20 0a 2a 2a 20 61 72 65 20 64 65 73  oint .** are des
34990 74 72 6f 79 65 64 2e 20 49 66 20 74 68 69 73 20  troyed. If this 
349a0 69 73 20 61 20 72 65 6c 65 61 73 65 20 6f 70 65  is a release ope
349b0 72 61 74 69 6f 6e 20 28 6f 70 3d 3d 53 41 56 45  ration (op==SAVE
349c0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 2c 0a  POINT_RELEASE),.
349d0 2a 2a 20 74 68 65 6e 20 73 61 76 65 70 6f 69 6e  ** then savepoin
349e0 74 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20  t iSavepoint is 
349f0 61 6c 73 6f 20 64 65 73 74 72 6f 79 65 64 2e 0a  also destroyed..
34a00 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
34a10 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ion may return S
34a20 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61  QLITE_NOMEM if a
34a30 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
34a40 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 6f 72 20  on fails,.** or 
34a50 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
34a60 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   if an IO error 
34a70 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 6f 6c  occurs while rol
34a80 6c 69 6e 67 20 62 61 63 6b 20 61 20 0a 2a 2a 20  ling back a .** 
34a90 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 6e 6f  savepoint. If no
34aa0 20 65 72 72 6f 72 73 20 6f 63 63 75 72 2c 20 53   errors occur, S
34ab0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
34ac0 72 6e 65 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71  rned..*/ .int sq
34ad0 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f  lite3PagerSavepo
34ae0 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
34af0 72 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69  r, int op, int i
34b00 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
34b10 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
34b20 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d  ;..  assert( op=
34b30 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
34b40 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  SE || op==SAVEPO
34b50 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
34b60 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70    assert( iSavep
34b70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 53  oint>=0 || op==S
34b80 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
34b90 4b 20 29 3b 0a 0a 20 20 69 66 28 20 69 53 61 76  K );..  if( iSav
34ba0 65 70 6f 69 6e 74 3c 70 50 61 67 65 72 2d 3e 6e  epoint<pPager->n
34bb0 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
34bc0 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
34bd0 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
34be0 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
34bf0 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20  int nNew;       
34c00 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
34c10 72 65 6d 61 69 6e 69 6e 67 20 73 61 76 65 70 6f  remaining savepo
34c20 69 6e 74 73 20 61 66 74 65 72 20 74 68 69 73 20  ints after this 
34c30 6f 70 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  op. */..    /* F
34c40 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
34c50 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69  ny savepoints wi
34c60 6c 6c 20 73 74 69 6c 6c 20 62 65 20 61 63 74 69  ll still be acti
34c70 76 65 20 61 66 74 65 72 20 74 68 69 73 0a 20 20  ve after this.  
34c80 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20    ** operation. 
34c90 53 74 6f 72 65 20 74 68 69 73 20 76 61 6c 75 65  Store this value
34ca0 20 69 6e 20 6e 4e 65 77 2e 20 54 68 65 6e 20 66   in nNew. Then f
34cb0 72 65 65 20 72 65 73 6f 75 72 63 65 73 20 61 73  ree resources as
34cc0 73 6f 63 69 61 74 65 64 20 0a 20 20 20 20 2a 2a  sociated .    **
34cd0 20 77 69 74 68 20 61 6e 79 20 73 61 76 65 70 6f   with any savepo
34ce0 69 6e 74 73 20 74 68 61 74 20 61 72 65 20 64 65  ints that are de
34cf0 73 74 72 6f 79 65 64 20 62 79 20 74 68 69 73 20  stroyed by this 
34d00 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
34d10 2f 0a 20 20 20 20 6e 4e 65 77 20 3d 20 69 53 61  /.    nNew = iSa
34d20 76 65 70 6f 69 6e 74 20 2b 20 28 28 20 6f 70 3d  vepoint + (( op=
34d30 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
34d40 53 45 20 29 20 3f 20 30 20 3a 20 31 29 3b 0a 20  SE ) ? 0 : 1);. 
34d50 20 20 20 66 6f 72 28 69 69 3d 6e 4e 65 77 3b 20     for(ii=nNew; 
34d60 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
34d70 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
34d80 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
34d90 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
34da0 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
34db0 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  pInSavepoint);. 
34dc0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
34dd0 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e 4e  >nSavepoint = nN
34de0 65 77 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  ew;..    /* If t
34df0 68 69 73 20 69 73 20 61 20 72 65 6c 65 61 73 65  his is a release
34e00 20 6f 66 20 74 68 65 20 6f 75 74 65 72 6d 6f 73   of the outermos
34e10 74 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 72 75  t savepoint, tru
34e20 6e 63 61 74 65 20 0a 20 20 20 20 2a 2a 20 74 68  ncate .    ** th
34e30 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 74 6f  e sub-journal to
34e40 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73   zero bytes in s
34e50 69 7a 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ize. */.    if( 
34e60 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
34e70 4c 45 41 53 45 20 29 7b 0a 20 20 20 20 20 20 69  LEASE ){.      i
34e80 66 28 20 6e 4e 65 77 3d 3d 30 20 26 26 20 69 73  f( nNew==0 && is
34e90 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
34ea0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  d) ){.        /*
34eb0 20 4f 6e 6c 79 20 74 72 75 6e 63 61 74 65 20 69   Only truncate i
34ec0 66 20 69 74 20 69 73 20 61 6e 20 69 6e 2d 6d 65  f it is an in-me
34ed0 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  mory sub-journal
34ee0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
34ef0 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75   sqlite3IsMemJou
34f00 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66  rnal(pPager->sjf
34f10 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  d) ){.          
34f20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
34f30 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73  uncate(pPager->s
34f40 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  jfd, 0);.       
34f50 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
34f60 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
34f70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
34f80 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
34f90 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
34fa0 0a 20 20 20 20 2f 2a 20 45 6c 73 65 20 74 68 69  .    /* Else thi
34fb0 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  s is a rollback 
34fc0 6f 70 65 72 61 74 69 6f 6e 2c 20 70 6c 61 79 62  operation, playb
34fd0 61 63 6b 20 74 68 65 20 73 70 65 63 69 66 69 65  ack the specifie
34fe0 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a 20 20 20  d savepoint..   
34ff0 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
35000 20 74 65 6d 70 2d 66 69 6c 65 2c 20 69 74 20 69   temp-file, it i
35010 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  s possible that 
35020 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
35030 20 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20   has.    ** not 
35040 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  yet been opened.
35050 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
35060 65 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f  ere have been no
35070 20 63 68 61 6e 67 65 73 20 74 6f 0a 20 20 20 20   changes to.    
35080 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
35090 66 69 6c 65 2c 20 73 6f 20 74 68 65 20 70 6c 61  file, so the pla
350a0 79 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  yback operation 
350b0 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a  can be skipped..
350c0 20 20 20 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20      */.    else 
350d0 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
350e0 70 50 61 67 65 72 29 20 7c 7c 20 69 73 4f 70 65  pPager) || isOpe
350f0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
35100 7b 0a 20 20 20 20 20 20 50 61 67 65 72 53 61 76  {.      PagerSav
35110 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69  epoint *pSavepoi
35120 6e 74 20 3d 20 28 6e 4e 65 77 3d 3d 30 29 3f 30  nt = (nNew==0)?0
35130 3a 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70  :&pPager->aSavep
35140 6f 69 6e 74 5b 6e 4e 65 77 2d 31 5d 3b 0a 20 20  oint[nNew-1];.  
35150 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 6c      rc = pagerPl
35160 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28  aybackSavepoint(
35170 70 50 61 67 65 72 2c 20 70 53 61 76 65 70 6f 69  pPager, pSavepoi
35180 6e 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nt);.      asser
35190 74 28 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  t(rc!=SQLITE_DON
351a0 45 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 7d  E);.    }.  .  }
351b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
351c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
351d0 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
351e0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
351f0 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
35200 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65  har *sqlite3Page
35210 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20  rFilename(Pager 
35220 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
35230 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  rn pPager->zFile
35240 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  name;.}../*.** R
35250 65 74 75 72 6e 20 74 68 65 20 56 46 53 20 73 74  eturn the VFS st
35260 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20  ructure for the 
35270 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  pager..*/.const 
35280 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c  sqlite3_vfs *sql
35290 69 74 65 33 50 61 67 65 72 56 66 73 28 50 61 67  ite3PagerVfs(Pag
352a0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
352b0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 56  eturn pPager->pV
352c0 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  fs;.}../*.** Ret
352d0 75 72 6e 20 74 68 65 20 66 69 6c 65 20 68 61 6e  urn the file han
352e0 64 6c 65 20 66 6f 72 20 74 68 65 20 64 61 74 61  dle for the data
352f0 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69  base file associ
35300 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  ated.** with the
35310 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 6d 69   pager.  This mi
35320 67 68 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  ght return NULL 
35330 69 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 0a  if the file has.
35340 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ** not yet been 
35350 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74  opened..*/.sqlit
35360 65 33 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65 33  e3_file *sqlite3
35370 50 61 67 65 72 46 69 6c 65 28 50 61 67 65 72 20  PagerFile(Pager 
35380 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
35390 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d  rn pPager->fd;.}
353a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
353b0 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
353c0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
353d0 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
353e0 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65  har *sqlite3Page
353f0 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67  rJournalname(Pag
35400 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
35410 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a  eturn pPager->zJ
35420 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ournal;.}../*.**
35430 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
35440 66 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72  fsync() calls ar
35450 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74  e disabled for t
35460 68 69 73 20 70 61 67 65 72 2e 20 20 52 65 74 75  his pager.  Retu
35470 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66  rn FALSE.** if f
35480 73 79 6e 63 28 29 73 20 61 72 65 20 65 78 65 63  sync()s are exec
35490 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a  uted normally..*
354a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
354b0 65 72 4e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a  erNosync(Pager *
354c0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
354d0 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  n pPager->noSync
354e0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
354f0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a  TE_HAS_CODEC./*.
35500 2a 2a 20 53 65 74 20 6f 72 20 72 65 74 72 69 65  ** Set or retrie
35510 76 65 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72  ve the codec for
35520 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 73   this pager.*/.s
35530 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
35540 65 33 50 61 67 65 72 53 65 74 43 6f 64 65 63 28  e3PagerSetCodec(
35550 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
35560 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64  ,.  void *(*xCod
35570 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ec)(void*,void*,
35580 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69  Pgno,int),.  voi
35590 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68  d (*xCodecSizeCh
355a0 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e  ng)(void*,int,in
355b0 74 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f  t),.  void (*xCo
355c0 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a 29 2c  decFree)(void*),
355d0 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 0a  .  void *pCodec.
355e0 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
355f0 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50  >xCodecFree ) pP
35600 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
35610 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29  (pPager->pCodec)
35620 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  ;.  pPager->xCod
35630 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 6d 65 6d  ec = pPager->mem
35640 44 62 20 3f 20 30 20 3a 20 78 43 6f 64 65 63 3b  Db ? 0 : xCodec;
35650 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  .  pPager->xCode
35660 63 53 69 7a 65 43 68 6e 67 20 3d 20 78 43 6f 64  cSizeChng = xCod
35670 65 63 53 69 7a 65 43 68 6e 67 3b 0a 20 20 70 50  ecSizeChng;.  pP
35680 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
35690 20 3d 20 78 43 6f 64 65 63 46 72 65 65 3b 0a 20   = xCodecFree;. 
356a0 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 20   pPager->pCodec 
356b0 3d 20 70 43 6f 64 65 63 3b 0a 20 20 70 61 67 65  = pCodec;.  page
356c0 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
356d0 65 72 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  er);.}.static vo
356e0 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
356f0 47 65 74 43 6f 64 65 63 28 50 61 67 65 72 20 2a  GetCodec(Pager *
35700 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
35710 6e 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63  n pPager->pCodec
35720 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
35730 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
35740 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
35750 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 70   Move the page p
35760 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70  Pg to location p
35770 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  gno in the file.
35780 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
35790 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63  t be no referenc
357a0 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70  es to the page p
357b0 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65  reviously locate
357c0 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68  d at.** pgno (wh
357d0 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f  ich we call pPgO
357e0 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61 74 20  ld) though that 
357f0 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  page is allowed 
35800 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68  to be.** in cach
35810 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  e.  If the page 
35820 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74  previously locat
35830 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f  ed at pgno is no
35840 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
35850 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
35860 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20  rnal, it is not 
35870 70 75 74 20 74 68 65 72 65 20 62 79 20 62 79 20  put there by by 
35880 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
35890 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74  .** References t
358a0 6f 20 74 68 65 20 70 61 67 65 20 70 50 67 20 72  o the page pPg r
358b0 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64  emain valid. Upd
358c0 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74  ating any.** met
358d0 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  a-data associate
358e0 64 20 77 69 74 68 20 70 50 67 20 28 69 2e 65 2e  d with pPg (i.e.
358f0 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20   data stored in 
35900 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65 73  the nExtra bytes
35910 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  .** allocated al
35920 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61 67  ong with the pag
35930 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  e) is the respon
35940 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
35950 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20  caller..**.** A 
35960 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
35970 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e 20   be active when 
35980 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
35990 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20  called. It used 
359a0 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65  to be.** require
359b0 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d 65  d that a stateme
359c0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
359d0 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62  as not active, b
359e0 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74  ut this restrict
359f0 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
35a00 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20  removed (CREATE 
35a10 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d  INDEX needs to m
35a20 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e 20  ove a page when 
35a30 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  a statement.** t
35a40 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
35a50 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tive)..**.** If 
35a60 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d  the fourth argum
35a70 65 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 69  ent, isCommit, i
35a80 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
35a90 20 74 68 69 73 20 70 61 67 65 20 69 73 20 62 65   this page is be
35aa0 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61 73 20  ing.** moved as 
35ab0 70 61 72 74 20 6f 66 20 61 20 64 61 74 61 62 61  part of a databa
35ac0 73 65 20 72 65 6f 72 67 61 6e 69 7a 61 74 69 6f  se reorganizatio
35ad0 6e 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68  n just before th
35ae0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  e transaction .*
35af0 2a 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69  * is being commi
35b00 74 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  tted. In this ca
35b10 73 65 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e  se, it is guaran
35b20 74 65 65 64 20 74 68 61 74 20 74 68 65 20 64 61  teed that the da
35b30 74 61 62 61 73 65 20 70 61 67 65 20 0a 2a 2a 20  tabase page .** 
35b40 70 50 67 20 72 65 66 65 72 73 20 74 6f 20 77 69  pPg refers to wi
35b50 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65  ll not be writte
35b60 6e 20 74 6f 20 61 67 61 69 6e 20 77 69 74 68 69  n to again withi
35b70 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
35b80 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  on..**.** This f
35b90 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75  unction may retu
35ba0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  rn SQLITE_NOMEM 
35bb0 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  or an IO error c
35bc0 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0a  ode if an error.
35bd0 2a 2a 20 6f 63 63 75 72 73 2e 20 4f 74 68 65 72  ** occurs. Other
35be0 77 69 73 65 2c 20 69 74 20 72 65 74 75 72 6e 73  wise, it returns
35bf0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
35c00 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  nt sqlite3PagerM
35c10 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a 70  ovepage(Pager *p
35c20 50 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70  Pager, DbPage *p
35c30 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 69  Pg, Pgno pgno, i
35c40 6e 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a 20 20  nt isCommit){.  
35c50 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 20  PgHdr *pPgOld;  
35c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35c70 54 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 6f  The page being o
35c80 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20  verwritten. */. 
35c90 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67   Pgno needSyncPg
35ca0 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  no = 0;       /*
35cb0 20 4f 6c 64 20 76 61 6c 75 65 20 6f 66 20 70 50   Old value of pP
35cc0 67 2d 3e 70 67 6e 6f 2c 20 69 66 20 73 79 6e 63  g->pgno, if sync
35cd0 20 69 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   is required */.
35ce0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
35cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35d00 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
35d10 0a 20 20 50 67 6e 6f 20 6f 72 69 67 50 67 6e 6f  .  Pgno origPgno
35d20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35d30 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  /* The original 
35d40 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a  page number */..
35d50 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
35d60 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  Ref>0 );..  /* I
35d70 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 61 62  n order to be ab
35d80 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  le to rollback, 
35d90 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
35da0 61 62 61 73 65 20 6d 75 73 74 20 6a 6f 75 72 6e  abase must journ
35db0 61 6c 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  al.  ** the page
35dc0 20 77 65 20 61 72 65 20 6d 6f 76 69 6e 67 20 66   we are moving f
35dd0 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rom..  */.  if( 
35de0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 72 63 20  MEMDB ){.    rc 
35df0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
35e00 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20 69 66  ite(pPg);.    if
35e10 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
35e20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
35e30 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 6d 6f  he page being mo
35e40 76 65 64 20 69 73 20 64 69 72 74 79 20 61 6e 64  ved is dirty and
35e50 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 73 61   has not been sa
35e60 76 65 64 20 62 79 20 74 68 65 20 6c 61 74 65 73  ved by the lates
35e70 74 0a 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74  t.  ** savepoint
35e80 2c 20 74 68 65 6e 20 73 61 76 65 20 74 68 65 20  , then save the 
35e90 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73  current contents
35ea0 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 74   of the page int
35eb0 6f 20 74 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d  o the .  ** sub-
35ec0 6a 6f 75 72 6e 61 6c 20 6e 6f 77 2e 20 54 68 69  journal now. Thi
35ed0 73 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  s is required to
35ee0 20 68 61 6e 64 6c 65 20 74 68 65 20 66 6f 6c 6c   handle the foll
35ef0 6f 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a  owing scenario:.
35f00 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 42 45 47 49    **.  **   BEGI
35f10 4e 3b 0a 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75  N;.  **     <jou
35f20 72 6e 61 6c 20 70 61 67 65 20 58 2c 20 74 68 65  rnal page X, the
35f30 6e 20 6d 6f 64 69 66 79 20 69 74 20 69 6e 20 6d  n modify it in m
35f40 65 6d 6f 72 79 3e 0a 20 20 2a 2a 20 20 20 20 20  emory>.  **     
35f50 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20  SAVEPOINT one;. 
35f60 20 2a 2a 20 20 20 20 20 20 20 3c 4d 6f 76 65 20   **       <Move 
35f70 70 61 67 65 20 58 20 74 6f 20 6c 6f 63 61 74 69  page X to locati
35f80 6f 6e 20 59 3e 0a 20 20 2a 2a 20 20 20 20 20 52  on Y>.  **     R
35f90 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a  OLLBACK TO one;.
35fa0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 61 67    **.  ** If pag
35fb0 65 20 58 20 77 65 72 65 20 6e 6f 74 20 77 72 69  e X were not wri
35fc0 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d  tten to the sub-
35fd0 6a 6f 75 72 6e 61 6c 20 68 65 72 65 2c 20 69 74  journal here, it
35fe0 20 77 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20   would not.  ** 
35ff0 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 72  be possible to r
36000 65 73 74 6f 72 65 20 69 74 73 20 63 6f 6e 74 65  estore its conte
36010 6e 74 73 20 77 68 65 6e 20 74 68 65 20 22 52 4f  nts when the "RO
36020 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 22 0a 20  LLBACK TO one". 
36030 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65   ** statement we
36040 72 65 20 69 73 20 70 72 6f 63 65 73 73 65 64 2e  re is processed.
36050 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73 75 62 6a 6f  .  **.  ** subjo
36060 75 72 6e 61 6c 50 61 67 65 28 29 20 6d 61 79 20  urnalPage() may 
36070 6e 65 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  need to allocate
36080 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20   space to store 
36090 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 74 6f 0a 20  pPg->pgno into. 
360a0 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   ** one or more 
360b0 73 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63  savepoint bitvec
360c0 73 2e 20 54 68 69 73 20 69 73 20 74 68 65 20 72  s. This is the r
360d0 65 61 73 6f 6e 20 74 68 69 73 20 66 75 6e 63 74  eason this funct
360e0 69 6f 6e 0a 20 20 2a 2a 20 6d 61 79 20 72 65 74  ion.  ** may ret
360f0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
36100 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
36110 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
36120 52 54 59 0a 20 20 20 26 26 20 73 75 62 6a 52 65  RTY.   && subjRe
36130 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 0a  quiresPage(pPg).
36140 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21     && SQLITE_OK!
36150 3d 28 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61  =(rc = subjourna
36160 6c 50 61 67 65 28 70 50 67 29 29 0a 20 20 29 7b  lPage(pPg)).  ){
36170 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
36180 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43    }..  PAGERTRAC
36190 45 28 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65  E(("MOVE %d page
361a0 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64   %d (needSync=%d
361b0 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22  ) moves to %d\n"
361c0 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44  , .      PAGERID
361d0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
361e0 67 6e 6f 2c 20 28 70 50 67 2d 3e 66 6c 61 67 73  gno, (pPg->flags
361f0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
36200 29 3f 31 3a 30 2c 20 70 67 6e 6f 29 29 3b 0a 20  )?1:0, pgno));. 
36210 20 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20   IOTRACE(("MOVE 
36220 25 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61  %p %d %d\n", pPa
36230 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ger, pPg->pgno, 
36240 70 67 6e 6f 29 29 0a 0a 20 20 2f 2a 20 49 66 20  pgno))..  /* If 
36250 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64  the journal need
36260 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64  s to be sync()ed
36270 20 62 65 66 6f 72 65 20 70 61 67 65 20 70 50 67   before page pPg
36280 2d 3e 70 67 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20  ->pgno can.  ** 
36290 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 73  be written to, s
362a0 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69  tore pPg->pgno i
362b0 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  n local variable
362c0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20   needSyncPgno.. 
362d0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
362e0 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  isCommit flag is
362f0 20 73 65 74 2c 20 74 68 65 72 65 20 69 73 20 6e   set, there is n
36300 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  o need to rememb
36310 65 72 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  er that.  ** the
36320 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74   journal needs t
36330 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65  o be sync()ed be
36340 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61  fore database pa
36350 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20 0a 20 20  ge pPg->pgno .  
36360 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ** can be writte
36370 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72  n to. The caller
36380 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f   has already pro
36390 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69  mised not to wri
363a0 74 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20  te to it..  */. 
363b0 20 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73   if( (pPg->flags
363c0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
363d0 29 20 26 26 20 21 69 73 43 6f 6d 6d 69 74 20 29  ) && !isCommit )
363e0 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67  {.    needSyncPg
363f0 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  no = pPg->pgno;.
36400 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
36410 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c  InJournal(pPg) |
36420 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  | pPg->pgno>pPag
36430 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
36440 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
36450 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
36460 49 52 54 59 20 29 3b 0a 20 20 20 20 61 73 73 65  IRTY );.    asse
36470 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
36480 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Sync );.  }..  /
36490 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20 63  * If the cache c
364a0 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20 77  ontains a page w
364b0 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  ith page-number 
364c0 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a  pgno, remove it.
364d0 20 20 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68 61    ** from its ha
364e0 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20  sh chain. Also, 
364f0 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  if the PgHdr.nee
36500 64 53 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f  dSync was set fo
36510 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e  r .  ** page pgn
36520 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f  o before the 'mo
36530 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69  ve' operation, i
36540 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  t needs to be re
36550 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72  tained .  ** for
36560 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20   the page moved 
36570 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50  there..  */.  pP
36580 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48  g->flags &= ~PGH
36590 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20  DR_NEED_SYNC;.  
365a0 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c  pPgOld = pager_l
365b0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
365c0 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  no);.  assert( !
365d0 70 50 67 4f 6c 64 20 7c 7c 20 70 50 67 4f 6c 64  pPgOld || pPgOld
365e0 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 20 20 69  ->nRef==1 );.  i
365f0 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20  f( pPgOld ){.   
36600 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 28   pPg->flags |= (
36610 70 50 67 4f 6c 64 2d 3e 66 6c 61 67 73 26 50 47  pPgOld->flags&PG
36620 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3b 0a  HDR_NEED_SYNC);.
36630 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
36640 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  .      /* Do not
36650 20 64 69 73 63 61 72 64 20 70 61 67 65 73 20 66   discard pages f
36660 72 6f 6d 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  rom an in-memory
36670 20 64 61 74 61 62 61 73 65 20 73 69 6e 63 65 20   database since 
36680 77 65 20 6d 69 67 68 74 0a 20 20 20 20 20 20 2a  we might.      *
36690 2a 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61  * need to rollba
366a0 63 6b 20 6c 61 74 65 72 2e 20 20 4a 75 73 74 20  ck later.  Just 
366b0 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 6f 75  move the page ou
366c0 74 20 6f 66 20 74 68 65 20 77 61 79 2e 20 2a 2f  t of the way. */
366d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
366e0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
366f0 69 64 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  id );.      sqli
36700 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50  te3PcacheMove(pP
36710 67 4f 6c 64 2c 20 70 50 61 67 65 72 2d 3e 64 62  gOld, pPager->db
36720 53 69 7a 65 2b 31 29 3b 0a 20 20 20 20 7d 65 6c  Size+1);.    }el
36730 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
36740 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 4f  3PcacheDrop(pPgO
36750 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ld);.    }.  }..
36760 20 20 6f 72 69 67 50 67 6e 6f 20 3d 20 70 50 67    origPgno = pPg
36770 2d 3e 70 67 6e 6f 3b 0a 20 20 73 71 6c 69 74 65  ->pgno;.  sqlite
36780 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67 2c  3PcacheMove(pPg,
36790 20 70 67 6e 6f 29 3b 0a 20 20 73 71 6c 69 74 65   pgno);.  sqlite
367a0 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
367b0 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d  (pPg);.  pPager-
367c0 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b  >dbModified = 1;
367d0 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63  ..  if( needSync
367e0 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Pgno ){.    /* I
367f0 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69  f needSyncPgno i
36800 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
36810 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
36820 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20  e needs to be . 
36830 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62     ** sync()ed b
36840 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
36850 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74  s written to dat
36860 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20  abase file page 
36870 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20  needSyncPgno..  
36880 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20    ** Currently, 
36890 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69  no such page exi
368a0 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d  sts in the page-
368b0 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20  cache and the . 
368c0 20 20 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e 61     ** "is journa
368d0 6c 65 64 22 20 62 69 74 76 65 63 20 66 6c 61 67  led" bitvec flag
368e0 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54   has been set. T
368f0 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20  his needs to be 
36900 72 65 6d 65 64 69 65 64 20 62 79 0a 20 20 20 20  remedied by.    
36910 2a 2a 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 70  ** loading the p
36920 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
36930 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74  er-cache and set
36940 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e  ting the PgHdr.n
36950 65 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20  eedSync .    ** 
36960 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  flag..    **.   
36970 20 2a 2a 20 49 66 20 74 68 65 20 61 74 74 65 6d   ** If the attem
36980 70 74 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 70  pt to load the p
36990 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
369a0 65 2d 63 61 63 68 65 20 66 61 69 6c 73 2c 20 28  e-cache fails, (
369b0 64 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20  due.    ** to a 
369c0 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66  malloc() or IO f
369d0 61 69 6c 75 72 65 29 2c 20 63 6c 65 61 72 20 74  ailure), clear t
369e0 68 65 20 62 69 74 20 69 6e 20 74 68 65 20 70 49  he bit in the pI
369f0 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a  nJournal[].    *
36a00 2a 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69  * array. Otherwi
36a10 73 65 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  se, if the page 
36a20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 77 72  is loaded and wr
36a30 69 74 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20  itten again in. 
36a40 20 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73     ** this trans
36a50 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62  action, it may b
36a60 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
36a70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
36a80 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74 20  efore.    ** it 
36a90 69 73 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74  is synced into t
36aa0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
36ab0 20 54 68 69 73 20 77 61 79 2c 20 69 74 20 6d 61   This way, it ma
36ac0 79 20 65 6e 64 20 75 70 20 69 6e 0a 20 20 20 20  y end up in.    
36ad0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
36ae0 69 6c 65 20 74 77 69 63 65 2c 20 62 75 74 20 74  ile twice, but t
36af0 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f  hat is not a pro
36b00 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  blem..    **.   
36b10 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50   ** The sqlite3P
36b20 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d  agerGet() call m
36b30 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75  ay cause the jou
36b40 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f  rnal to sync. So
36b50 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
36b60 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  e the Pager.need
36b70 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
36b80 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   too..    */.   
36b90 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a   PgHdr *pPgHdr;.
36ba0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
36bb0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
36bc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36bd0 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
36be0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26   needSyncPgno, &
36bf0 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28  pPgHdr);.    if(
36c00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
36c10 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64  {.      if( need
36c20 53 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65 72  SyncPgno<=pPager
36c30 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a  ->dbOrigSize ){.
36c40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
36c50 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
36c60 65 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  e!=0 );.        
36c70 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 6c 65  sqlite3BitvecCle
36c80 61 72 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  ar(pPager->pInJo
36c90 75 72 6e 61 6c 2c 20 6e 65 65 64 53 79 6e 63 50  urnal, needSyncP
36ca0 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 70 54 6d  gno, pPager->pTm
36cb0 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 7d  pSpace);.      }
36cc0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
36cd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
36ce0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
36cf0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
36d00 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20  ager->noSync==0 
36d10 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  && !MEMDB );.   
36d20 20 70 50 67 48 64 72 2d 3e 66 6c 61 67 73 20 7c   pPgHdr->flags |
36d30 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
36d40 43 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  C;.    sqlite3Pc
36d50 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
36d60 67 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  gHdr);.    sqlit
36d70 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
36d80 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  Hdr);.  }..  /*.
36d90 20 20 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d    ** For an in-m
36da0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
36db0 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72  make sure the or
36dc0 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
36dd0 69 6e 75 65 73 0a 20 20 2a 2a 20 74 6f 20 65 78  inues.  ** to ex
36de0 69 73 74 2c 20 69 6e 20 63 61 73 65 20 74 68 65  ist, in case the
36df0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65   transaction nee
36e00 64 73 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e  ds to roll back.
36e10 20 20 55 73 65 20 70 50 67 4f 6c 64 0a 20 20 2a    Use pPgOld.  *
36e20 2a 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61  * as the origina
36e30 6c 20 70 61 67 65 20 73 69 6e 63 65 20 69 74 20  l page since it 
36e40 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
36e50 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 20 20 2a 2f   allocated..  */
36e60 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
36e70 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
36e80 65 4d 6f 76 65 28 70 50 67 4f 6c 64 2c 20 6f 72  eMove(pPgOld, or
36e90 69 67 50 67 6e 6f 29 3b 0a 20 20 20 20 73 71 6c  igPgno);.    sql
36ea0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
36eb0 50 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20 72  PgOld);.  }..  r
36ec0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
36ed0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
36ee0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
36ef0 72 20 74 6f 20 74 68 65 20 64 61 74 61 20 66 6f  r to the data fo
36f00 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
36f10 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  page..*/.void *s
36f20 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
36f30 74 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ta(DbPage *pPg){
36f40 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
36f50 6e 52 65 66 3e 30 20 7c 7c 20 70 50 67 2d 3e 70  nRef>0 || pPg->p
36f60 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a  Pager->memDb );.
36f70 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 44    return pPg->pD
36f80 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ata;.}../*.** Re
36f90 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
36fa0 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74  o the Pager.nExt
36fb0 72 61 20 62 79 74 65 73 20 6f 66 20 22 65 78 74  ra bytes of "ext
36fc0 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c  ra" space .** al
36fd0 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69  located along wi
36fe0 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64  th the specified
36ff0 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a   page..*/.void *
37000 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
37010 78 74 72 61 28 44 62 50 61 67 65 20 2a 70 50 67  xtra(DbPage *pPg
37020 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  ){.  return pPg-
37030 3e 70 45 78 74 72 61 3b 0a 7d 0a 0a 2f 2a 0a 2a  >pExtra;.}../*.*
37040 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f  * Get/set the lo
37050 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74  cking-mode for t
37060 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d  his pager. Param
37070 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20  eter eMode must 
37080 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47  be one.** of PAG
37090 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51  ER_LOCKINGMODE_Q
370a0 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b  UERY, PAGER_LOCK
370b0 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f  INGMODE_NORMAL o
370c0 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b  r .** PAGER_LOCK
370d0 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
370e0 45 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65  E. If the parame
370f0 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52  ter is not _QUER
37100 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c  Y, then.** the l
37110 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73  ocking-mode is s
37120 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
37130 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  specified..**.**
37140 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
37150 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 50 41  lue is either PA
37160 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
37170 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47  NORMAL or.** PAG
37180 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
37190 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61  XCLUSIVE, indica
371a0 74 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ting the current
371b0 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74   (possibly updat
371c0 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d  ed).** locking-m
371d0 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
371e0 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d  te3PagerLockingM
371f0 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ode(Pager *pPage
37200 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20  r, int eMode){. 
37210 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d   assert( eMode==
37220 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
37230 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20  E_QUERY.        
37240 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
37250 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
37260 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20  NORMAL.         
37270 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
37280 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
37290 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
372a0 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
372b0 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20  INGMODE_QUERY<0 
372c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
372d0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
372e0 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45  ORMAL>=0 && PAGE
372f0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
37300 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20  CLUSIVE>=0 );.  
37310 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20  if( eMode>=0 && 
37320 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
37330 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  e ){.    pPager-
37340 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
37350 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a   (u8)eMode;.  }.
37360 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50    return (int)pP
37370 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
37380 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ode;.}../*.** Se
37390 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  t the journal-mo
373a0 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  de for this page
373b0 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f  r. Parameter eMo
373c0 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  de must be one o
373d0 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50 41 47 45  f:.**.**    PAGE
373e0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
373f0 4c 45 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52  LETE.**    PAGER
37400 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
37410 4e 43 41 54 45 0a 2a 2a 20 20 20 20 50 41 47 45  NCATE.**    PAGE
37420 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
37430 52 53 49 53 54 0a 2a 2a 20 20 20 20 50 41 47 45  RSIST.**    PAGE
37440 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
37450 46 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  F.**    PAGER_JO
37460 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
37470 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
37480 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 0a 2a 2a 0a  RNALMODE_WAL.**.
37490 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 6d 6f  ** The journalmo
374a0 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  de is set to the
374b0 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64   value specified
374c0 20 69 66 20 74 68 65 20 63 68 61 6e 67 65 20 69   if the change i
374d0 73 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 54 68  s allowed..** Th
374e0 65 20 63 68 61 6e 67 65 20 6d 61 79 20 62 65 20  e change may be 
374f0 64 69 73 61 6c 6c 6f 77 65 64 20 66 6f 72 20 74  disallowed for t
37500 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 61  he following rea
37510 73 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  sons:.**.**   * 
37520 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   An in-memory da
37530 74 61 62 61 73 65 20 63 61 6e 20 6f 6e 6c 79 20  tabase can only 
37540 68 61 76 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c  have its journal
37550 5f 6d 6f 64 65 20 73 65 74 20 74 6f 20 5f 4f 46  _mode set to _OF
37560 46 0a 2a 2a 20 20 20 20 20 20 6f 72 20 5f 4d 45  F.**      or _ME
37570 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  MORY..**.**   * 
37580 20 54 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   Temporary datab
37590 61 73 65 73 20 63 61 6e 6e 6f 74 20 68 61 76 65  ases cannot have
375a0 20 5f 57 41 4c 20 6a 6f 75 72 6e 61 6c 6d 6f 64   _WAL journalmod
375b0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  e..**.** The ret
375c0 75 72 6e 65 64 20 69 6e 64 69 63 61 74 65 20 74  urned indicate t
375d0 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73  he current (poss
375e0 69 62 6c 79 20 75 70 64 61 74 65 64 29 20 6a 6f  ibly updated) jo
375f0 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69  urnal-mode..*/.i
37600 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
37610 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61  etJournalMode(Pa
37620 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
37630 20 65 4d 6f 64 65 29 7b 0a 20 20 75 38 20 65 4f   eMode){.  u8 eO
37640 6c 64 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ld = pPager->jou
37650 72 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 2f 2a 20  rnalMode;    /* 
37660 50 72 69 6f 72 20 6a 6f 75 72 6e 61 6c 6d 6f 64  Prior journalmod
37670 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 65  e */..  /* The e
37680 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 69  Mode parameter i
37690 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 2a  s always valid *
376a0 2f 0a 20 20 61 73 73 65 72 74 28 20 20 20 20 20  /.  assert(     
376b0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
376c0 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
376d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
376e0 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
376f0 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
37700 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  E.            ||
37710 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
37720 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
37730 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  T.            ||
37740 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
37750 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
37760 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
37770 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
37780 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
37790 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
377a0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
377b0 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 0a 20  ODE_MEMORY );.. 
377c0 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77   /* Do not allow
377d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65   the journalmode
377e0 20 6f 66 20 61 20 54 45 4d 50 20 64 61 74 61 62   of a TEMP datab
377f0 61 73 65 20 74 6f 20 62 65 20 63 68 61 6e 67 65  ase to be change
37800 64 20 74 6f 20 57 41 4c 0a 20 20 2a 2f 0a 20 20  d to WAL.  */.  
37810 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
37820 46 69 6c 65 20 26 26 20 65 4d 6f 64 65 3d 3d 50  File && eMode==P
37830 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
37840 5f 57 41 4c 20 29 7b 0a 20 20 20 20 61 73 73 65  _WAL ){.    asse
37850 72 74 28 20 65 4f 6c 64 21 3d 50 41 47 45 52 5f  rt( eOld!=PAGER_
37860 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
37870 29 3b 0a 20 20 20 20 65 4d 6f 64 65 20 3d 20 65  );.    eMode = e
37880 4f 6c 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  Old;.  }..  /* D
37890 6f 20 61 6c 6c 6f 77 20 74 68 65 20 6a 6f 75 72  o allow the jour
378a0 6e 61 6c 6d 6f 64 65 20 6f 66 20 61 6e 20 69 6e  nalmode of an in
378b0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
378c0 20 74 6f 20 62 65 20 73 65 74 20 74 6f 0a 20 20   to be set to.  
378d0 2a 2a 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65  ** anything othe
378e0 72 20 74 68 61 6e 20 4d 45 4d 4f 52 59 20 6f 72  r than MEMORY or
378f0 20 4f 46 46 0a 20 20 2a 2f 0a 20 20 69 66 28 20   OFF.  */.  if( 
37900 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73  MEMDB ){.    ass
37910 65 72 74 28 20 65 4f 6c 64 3d 3d 50 41 47 45 52  ert( eOld==PAGER
37920 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
37930 4f 52 59 20 7c 7c 20 65 4f 6c 64 3d 3d 50 41 47  ORY || eOld==PAG
37940 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
37950 46 46 20 29 3b 0a 20 20 20 20 69 66 28 20 65 4d  FF );.    if( eM
37960 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
37970 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 26 26  ALMODE_MEMORY &&
37980 20 65 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f   eMode!=PAGER_JO
37990 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
379a0 0a 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 65  .      eMode = e
379b0 4f 6c 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Old;.    }.  }..
379c0 20 20 69 66 28 20 65 4d 6f 64 65 21 3d 65 4f 6c    if( eMode!=eOl
379d0 64 20 29 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e  d ){.    /* When
379e0 20 63 68 61 6e 67 69 6e 67 20 62 65 74 77 65 65   changing betwee
379f0 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 73  n rollback modes
37a00 2c 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  , close the jour
37a10 6e 61 6c 20 66 69 6c 65 20 70 72 69 6f 72 0a 20  nal file prior. 
37a20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 68 61     ** to the cha
37a30 6e 67 65 2e 20 20 42 75 74 20 77 68 65 6e 20 63  nge.  But when c
37a40 68 61 6e 67 69 6e 67 20 66 72 6f 6d 20 61 20 72  hanging from a r
37a50 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74 6f 20  ollback mode to 
37a60 57 41 4c 2c 20 6b 65 65 70 0a 20 20 20 20 2a 2a  WAL, keep.    **
37a70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 70 65   the journal ope
37a80 6e 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  n since there is
37a90 20 61 20 72 6f 6c 6c 62 61 63 6b 2d 73 74 79 6c   a rollback-styl
37aa0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
37ab0 20 70 6c 61 79 0a 20 20 20 20 2a 2a 20 75 73 65   play.    ** use
37ac0 64 20 74 6f 20 63 6f 6e 76 65 72 74 20 74 68 65  d to convert the
37ad0 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 73   version numbers
37ae0 20 69 6e 20 74 68 65 20 62 74 72 65 65 20 68 65   in the btree he
37af0 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ader..    */.   
37b00 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
37b10 65 72 2d 3e 6a 66 64 29 20 26 26 20 65 4d 6f 64  er->jfd) && eMod
37b20 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
37b30 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20  MODE_WAL ){.    
37b40 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
37b50 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
37b60 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 61     }..    /* Cha
37b70 6e 67 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nge the journal 
37b80 6d 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61  mode. */.    pPa
37b90 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
37ba0 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 0a 20   = (u8)eMode;.. 
37bb0 20 20 20 2f 2a 20 57 68 65 6e 20 74 72 61 6e 73     /* When trans
37bc0 69 73 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 54  istioning from T
37bd0 52 55 4e 43 41 54 45 20 6f 72 20 50 45 52 53 49  RUNCATE or PERSI
37be0 53 54 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20  ST to any other 
37bf0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d  journal.    ** m
37c00 6f 64 65 20 65 78 63 65 70 74 20 57 41 4c 20 28  ode except WAL (
37c10 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69  and we are not i
37c20 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45  n locking_mode=E
37c30 58 43 4c 55 53 49 56 45 29 20 74 68 65 6e 20 0a  XCLUSIVE) then .
37c40 20 20 20 20 2a 2a 20 64 65 6c 65 74 65 20 74 68      ** delete th
37c50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
37c60 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
37c70 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
37c80 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26  LMODE_TRUNCATE &
37c90 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)==1 );.    as
37ca0 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
37cb0 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
37cc0 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20   & 5)==1 );.    
37cd0 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
37ce0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
37cf0 45 20 26 20 35 29 3d 3d 30 20 29 3b 0a 20 20 20  E & 5)==0 );.   
37d00 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
37d10 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
37d20 52 59 20 26 20 35 29 3d 3d 34 20 29 3b 0a 20 20  RY & 5)==4 );.  
37d30 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
37d40 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
37d50 20 26 20 35 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 5)==0 );.    
37d60 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
37d70 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 26  OURNALMODE_WAL &
37d80 20 35 29 3d 3d 35 20 29 3b 0a 0a 20 20 20 20 61   5)==5 );..    a
37d90 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
37da0 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
37db0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
37dc0 64 65 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70  de );.    if( !p
37dd0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
37de0 4d 6f 64 65 20 26 26 20 28 65 4f 6c 64 20 26 20  Mode && (eOld & 
37df0 35 29 3d 3d 31 20 26 26 20 28 65 4d 6f 64 65 20  5)==1 && (eMode 
37e00 26 20 31 29 3d 3d 30 20 29 7b 0a 0a 20 20 20 20  & 1)==0 ){..    
37e10 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
37e20 65 20 77 65 20 77 6f 75 6c 64 20 6c 69 6b 65 20  e we would like 
37e30 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
37e40 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 69  urnal file. If i
37e50 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6e 6f  t is.      ** no
37e60 74 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 6e  t possible, then
37e70 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70   that is not a p
37e80 72 6f 62 6c 65 6d 2e 20 44 65 6c 65 74 69 6e 67  roblem. Deleting
37e90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
37ea0 65 0a 20 20 20 20 20 20 2a 2a 20 68 65 72 65 20  e.      ** here 
37eb0 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
37ec0 6f 6e 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a  on only..      *
37ed0 2a 0a 20 20 20 20 20 20 2a 2a 20 42 65 66 6f 72  *.      ** Befor
37ee0 65 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a  e deleting the j
37ef0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 62 74  ournal file, obt
37f00 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
37f10 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 20  ock on the.     
37f20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
37f30 65 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  e. This ensures 
37f40 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
37f50 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c   file is not del
37f60 65 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 77 68  eted.      ** wh
37f70 69 6c 65 20 69 74 20 69 73 20 69 6e 20 75 73 65  ile it is in use
37f80 20 62 79 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   by some other c
37f90 6c 69 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  lient..      */.
37fa0 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53        int rc = S
37fb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
37fc0 69 6e 74 20 73 74 61 74 65 20 3d 20 70 50 61 67  int state = pPag
37fd0 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 20 20 20  er->state;.     
37fe0 20 69 66 28 20 73 74 61 74 65 3c 50 41 47 45 52   if( state<PAGER
37ff0 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 20  _SHARED ){.     
38000 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
38010 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70  agerSharedLock(p
38020 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Pager);.      }.
38030 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
38040 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
38050 48 41 52 45 44 20 29 7b 0a 20 20 20 20 20 20 20  HARED ){.       
38060 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
38070 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
38080 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
38090 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
380a0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b   RESERVED_LOCK);
380b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
380c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
380d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
380e0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
380f0 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
38100 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  ->zJournal, 0);.
38110 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
38120 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
38130 26 26 20 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  && state==PAGER_
38140 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 20 20  SHARED ){.      
38150 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
38160 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  k(pPager->fd, SH
38170 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
38180 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 61 74    }else if( stat
38190 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
381a0 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
381b0 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
381c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
381d0 73 73 65 72 74 28 20 73 74 61 74 65 3d 3d 70 50  ssert( state==pP
381e0 61 67 65 72 2d 3e 73 74 61 74 65 20 29 3b 0a 20  ager->state );. 
381f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
38200 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6a 6f  eturn the new jo
38210 75 72 6e 61 6c 20 6d 6f 64 65 20 2a 2f 0a 20 20  urnal mode */.  
38220 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67  return (int)pPag
38230 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b  er->journalMode;
38240 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
38250 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75   the current jou
38260 72 6e 61 6c 20 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e  rnal mode..*/.in
38270 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  t sqlite3PagerGe
38280 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67  tJournalMode(Pag
38290 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
382a0 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65  eturn (int)pPage
382b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a  r->journalMode;.
382c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
382d0 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65  TRUE if the page
382e0 72 20 69 73 20 69 6e 20 61 20 73 74 61 74 65 20  r is in a state 
382f0 77 68 65 72 65 20 69 74 20 69 73 20 4f 4b 20 74  where it is OK t
38300 6f 20 63 68 61 6e 67 65 20 74 68 65 0a 2a 2a 20  o change the.** 
38310 6a 6f 75 72 6e 61 6c 6d 6f 64 65 2e 20 20 4a 6f  journalmode.  Jo
38320 75 72 6e 61 6c 6d 6f 64 65 20 63 68 61 6e 67 65  urnalmode change
38330 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
38340 6e 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62  n when the datab
38350 61 73 65 0a 2a 2a 20 69 73 20 75 6e 6d 6f 64 69  ase.** is unmodi
38360 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  fied..*/.int sql
38370 69 74 65 33 50 61 67 65 72 4f 6b 54 6f 43 68 61  ite3PagerOkToCha
38380 6e 67 65 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50  ngeJournalMode(P
38390 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
383a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d   if( pPager->dbM
383b0 6f 64 69 66 69 65 64 20 29 20 72 65 74 75 72 6e  odified ) return
383c0 20 30 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e   0;.  if( isOpen
383d0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
383e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
383f0 4f 66 66 3e 30 20 29 20 72 65 74 75 72 6e 20 30  Off>0 ) return 0
38400 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
38410 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74  ./*.** Get/set t
38420 68 65 20 73 69 7a 65 2d 6c 69 6d 69 74 20 75 73  he size-limit us
38430 65 64 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e  ed for persisten
38440 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  t journal files.
38450 0a 2a 2a 0a 2a 2a 20 53 65 74 74 69 6e 67 20 74  .**.** Setting t
38460 68 65 20 73 69 7a 65 20 6c 69 6d 69 74 20 74 6f  he size limit to
38470 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 20 6c 69 6d   -1 means no lim
38480 69 74 20 69 73 20 65 6e 66 6f 72 63 65 64 2e 0a  it is enforced..
38490 2a 2a 20 41 6e 20 61 74 74 65 6d 70 74 20 74 6f  ** An attempt to
384a0 20 73 65 74 20 61 20 6c 69 6d 69 74 20 73 6d 61   set a limit sma
384b0 6c 6c 65 72 20 74 68 61 6e 20 2d 31 20 69 73 20  ller than -1 is 
384c0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 36 34 20  a no-op..*/.i64 
384d0 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72  sqlite3PagerJour
384e0 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 28 50 61 67  nalSizeLimit(Pag
384f0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 36 34 20  er *pPager, i64 
38500 69 4c 69 6d 69 74 29 7b 0a 20 20 69 66 28 20 69  iLimit){.  if( i
38510 4c 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20 20 20  Limit>=-1 ){.   
38520 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
38530 53 69 7a 65 4c 69 6d 69 74 20 3d 20 69 4c 69 6d  SizeLimit = iLim
38540 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  it;.  }.  return
38550 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
38560 53 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a  SizeLimit;.}../*
38570 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
38580 6e 74 65 72 20 74 6f 20 74 68 65 20 70 50 61 67  nter to the pPag
38590 65 72 2d 3e 70 42 61 63 6b 75 70 20 76 61 72 69  er->pBackup vari
385a0 61 62 6c 65 2e 20 54 68 65 20 62 61 63 6b 75 70  able. The backup
385b0 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 6e 20 62 61   module.** in ba
385c0 63 6b 75 70 2e 63 20 6d 61 69 6e 74 61 69 6e 73  ckup.c maintains
385d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
385e0 74 68 69 73 20 76 61 72 69 61 62 6c 65 2e 20 54  this variable. T
385f0 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 75 73  his module.** us
38600 65 73 20 69 74 20 6f 70 61 71 75 65 6c 79 20 61  es it opaquely a
38610 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f  s an argument to
38620 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
38630 73 74 61 72 74 28 29 20 61 6e 64 0a 2a 2a 20 73  start() and.** s
38640 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
38650 74 65 28 29 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 71  te() only..*/.sq
38660 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 2a 73  lite3_backup **s
38670 71 6c 69 74 65 33 50 61 67 65 72 42 61 63 6b 75  qlite3PagerBacku
38680 70 50 74 72 28 50 61 67 65 72 20 2a 70 50 61 67  pPtr(Pager *pPag
38690 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 26 70  er){.  return &p
386a0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 3b 0a  Pager->pBackup;.
386b0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
386c0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
386d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
386e0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  s called when th
386f0 65 20 75 73 65 72 20 69 6e 76 6f 6b 65 73 20 22  e user invokes "
38700 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e  PRAGMA checkpoin
38710 74 22 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  t"..*/.int sqlit
38720 65 33 50 61