/ Hex Artifact Content
Login

Artifact 39be42c3234a4ea51ddf185a47a91f31a0439fd1:


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 50 61 67 65 72  ./*.** The Pager
1480: 2e 65 53 74 61 74 65 20 76 61 72 69 61 62 6c 65  .eState variable
1490: 20 73 74 6f 72 65 73 20 74 68 65 20 63 75 72 72   stores the curr
14a0: 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66 20 61  ent 'state' of a
14b0: 20 70 61 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67   pager. A.** pag
14c0: 65 72 20 6d 61 79 20 62 65 20 69 6e 20 61 6e 79  er may be in any
14d0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 65 76 65   one of the seve
14e0: 6e 20 73 74 61 74 65 73 20 73 68 6f 77 6e 20 69  n states shown i
14f0: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  n the following.
1500: 2a 2a 20 73 74 61 74 65 20 64 69 61 67 72 61 6d  ** state diagram
1510: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  ..**.**         
1520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1530: 20 20 20 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b     OPEN <------+
1540: 2d 2d 2d 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20  ------+.**      
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1560: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1570: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1590: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
15a0: 20 20 20 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a       |      |.**
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45  ---------> READE
15d0: 52 2d 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c  R-------+      |
15e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
15f0: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1600: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1610: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1620: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1630: 20 20 20 20 56 20 20 20 20 20 20 20 20 20 20 20      V           
1640: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
1650: 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d          |<------
1660: 2d 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d  -WRITER_LOCKED--
1670: 2d 2d 2d 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20  ----> ERROR.**  
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1690: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5e 20 20               ^  
16b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16c0: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
16d0: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
16e0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
16f0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49       |<------WRI
1700: 54 45 52 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d  TER_CACHEMOD----
1710: 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20  ---->|.**       
1720: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1730: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
1740: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
1750: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1760: 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20            V     
1770: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c                |<
1790: 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42  -------WRITER_DB
17a0: 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a  MOD---------->|.
17b0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
17c0: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
17d0: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |               
17e0: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
17f0: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
1800: 20 20 20 56 20 20 20 20 20 20 20 20 20 20 20 20     V            
1810: 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20      |.**        
1820: 20 20 20 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57         +<------W
1830: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d  RITER_FINISHED--
1840: 2d 2d 2d 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a  ------>+.**.**.*
1850: 2a 20 4c 69 73 74 20 6f 66 20 73 74 61 74 65 20  * List of state 
1860: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
1870: 74 68 65 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d  the C [function]
1880: 20 74 68 61 74 20 70 65 72 66 6f 72 6d 73 20 65   that performs e
1890: 61 63 68 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50  ach:.** .**   OP
18a0: 45 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EN              
18b0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
18c0: 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50         [sqlite3P
18d0: 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a  agerSharedLock].
18e0: 2a 2a 20 20 20 52 45 41 44 45 52 20 20 20 20 20  **   READER     
18f0: 20 20 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20         -> OPEN  
1900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70                [p
1910: 61 67 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a  ager_unlock].**.
1920: 2a 2a 20 20 20 52 45 41 44 45 52 20 20 20 20 20  **   READER     
1930: 20 20 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52         -> WRITER
1940: 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 5b 73  _LOCKED       [s
1950: 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
1960: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f  ].**   WRITER_LO
1970: 43 4b 45 44 20 20 20 20 20 2d 3e 20 57 52 49 54  CKED     -> WRIT
1980: 45 52 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20  ER_CACHEMOD     
1990: 5b 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72  [pager_open_jour
19a0: 6e 61 6c 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52  nal].**   WRITER
19b0: 5f 43 41 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57  _CACHEMOD   -> W
19c0: 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20  RITER_DBMOD     
19d0: 20 20 20 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d     [syncJournal]
19e0: 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 44 42 4d  .**   WRITER_DBM
19f0: 4f 44 20 20 20 20 20 20 2d 3e 20 57 52 49 54 45  OD      -> WRITE
1a00: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 5b  R_FINISHED     [
1a10: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
1a20: 69 74 50 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20  itPhaseOne].**  
1a30: 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20   WRITER_***     
1a40: 20 20 20 2d 3e 20 52 45 41 44 45 52 20 20 20 20     -> READER    
1a50: 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72            [pager
1a60: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
1a70: 5d 0a 2a 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52  ].**.**   WRITER
1a80: 5f 2a 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 45  _***        -> E
1a90: 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 20  RROR            
1aa0: 20 20 20 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d     [pager_error]
1ab0: 0a 2a 2a 20 20 20 45 52 52 4f 52 20 20 20 20 20  .**   ERROR     
1ac0: 20 20 20 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20          -> OPEN 
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
1ae0: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a  pager_unlock].**
1af0: 20 0a 2a 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a   .**.**  OPEN:.*
1b00: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
1b10: 72 20 73 74 61 72 74 73 20 75 70 20 69 6e 20 74  r starts up in t
1b20: 68 69 73 20 73 74 61 74 65 2e 20 4e 6f 74 68 69  his state. Nothi
1b30: 6e 67 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ng is guaranteed
1b40: 20 69 6e 20 74 68 69 73 0a 2a 2a 20 20 20 20 73   in this.**    s
1b50: 74 61 74 65 20 2d 20 74 68 65 20 66 69 6c 65 20  tate - the file 
1b60: 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
1b70: 65 20 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65  e locked and the
1b80: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69   database size i
1b90: 73 0a 2a 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e  s.**    unknown.
1ba0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 61   The database ma
1bb0: 79 20 6e 6f 74 20 62 65 20 72 65 61 64 20 6f 72  y not be read or
1bc0: 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20   written..**.** 
1bd0: 20 20 20 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20     * No read or 
1be0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1bf0: 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20  n is active..** 
1c00: 20 20 20 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f     * Any lock, o
1c10: 72 20 6e 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c  r no lock at all
1c20: 2c 20 6d 61 79 20 62 65 20 68 65 6c 64 20 6f 6e  , may be held on
1c30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1c40: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  le..**    * The 
1c50: 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69  dbSize, dbOrigSi
1c60: 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a  ze and dbFileSiz
1c70: 65 20 76 61 72 69 61 62 6c 65 73 20 6d 61 79 20  e variables may 
1c80: 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a  not be trusted..
1c90: 2a 2a 0a 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a  **.**  READER:.*
1ca0: 2a 0a 2a 2a 20 20 20 20 49 6e 20 74 68 69 73 20  *.**    In this 
1cb0: 73 74 61 74 65 20 61 6c 6c 20 74 68 65 20 72 65  state all the re
1cc0: 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 72  quirements for r
1cd0: 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
1ce0: 61 73 65 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f  ase in .**    ro
1cf0: 6c 6c 62 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29  llback (non-WAL)
1d00: 20 6d 6f 64 65 20 61 72 65 20 6d 65 74 2e 20 55   mode are met. U
1d10: 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
1d20: 69 73 20 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a  is (or recently.
1d30: 2a 2a 20 20 20 20 77 61 73 29 20 69 6e 20 65 78  **    was) in ex
1d40: 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20  clusive-locking 
1d50: 6d 6f 64 65 2c 20 61 20 75 73 65 72 2d 6c 65 76  mode, a user-lev
1d60: 65 6c 20 72 65 61 64 20 74 72 61 6e 73 61 63 74  el read transact
1d70: 69 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70  ion is .**    op
1d80: 65 6e 2e 20 54 68 65 20 64 61 74 61 62 61 73 65  en. The database
1d90: 20 73 69 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69   size is known i
1da0: 6e 20 74 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a  n this state..**
1db0: 0a 2a 2a 20 20 20 20 41 20 63 6f 6e 6e 65 63 74  .**    A connect
1dc0: 69 6f 6e 20 72 75 6e 6e 69 6e 67 20 77 69 74 68  ion running with
1dd0: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f   locking_mode=no
1de0: 72 6d 61 6c 20 65 6e 74 65 72 73 20 74 68 69 73  rmal enters this
1df0: 20 73 74 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20   state when.**  
1e00: 20 20 69 74 20 6f 70 65 6e 73 20 61 20 72 65 61    it opens a rea
1e10: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  d-transaction on
1e20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
1e30: 64 20 72 65 74 75 72 6e 73 20 74 6f 20 73 74 61  d returns to sta
1e40: 74 65 0a 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66  te.**    OPEN af
1e50: 74 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61  ter the read-tra
1e60: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70  nsaction is comp
1e70: 6c 65 74 65 64 2e 20 48 6f 77 65 76 65 72 20 61  leted. However a
1e80: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20   connection.**  
1e90: 20 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63    running in loc
1ea0: 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
1eb0: 69 76 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74  ive (including t
1ec0: 65 6d 70 20 64 61 74 61 62 61 73 65 73 29 20 72  emp databases) r
1ed0: 65 6d 61 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20  emains in.**    
1ee0: 74 68 69 73 20 73 74 61 74 65 20 65 76 65 6e 20  this state even 
1ef0: 61 66 74 65 72 20 74 68 65 20 72 65 61 64 2d 74  after the read-t
1f00: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c  ransaction is cl
1f10: 6f 73 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77  osed. The only w
1f20: 61 79 0a 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69  ay.**    a locki
1f30: 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
1f40: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e  e connection can
1f50: 20 74 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d   transition from
1f60: 20 52 45 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a   READER to OPEN.
1f70: 2a 2a 20 20 20 20 69 73 20 76 69 61 20 74 68 65  **    is via the
1f80: 20 45 52 52 4f 52 20 73 74 61 74 65 20 28 73 65   ERROR state (se
1f90: 65 20 62 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a  e below)..** .**
1fa0: 20 20 20 20 2a 20 41 20 72 65 61 64 20 74 72 61      * A read tra
1fb0: 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  nsaction may be 
1fc0: 61 63 74 69 76 65 20 28 62 75 74 20 61 20 77 72  active (but a wr
1fd0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1fe0: 63 61 6e 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a  cannot)..**    *
1ff0: 20 41 20 53 48 41 52 45 44 20 6f 72 20 67 72 65   A SHARED or gre
2000: 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ater lock is hel
2010: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2020: 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20  e file..**    * 
2030: 54 68 65 20 64 62 53 69 7a 65 20 76 61 72 69 61  The dbSize varia
2040: 62 6c 65 20 6d 61 79 20 62 65 20 74 72 75 73 74  ble may be trust
2050: 65 64 20 28 65 76 65 6e 20 69 66 20 61 20 75 73  ed (even if a us
2060: 65 72 2d 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a  er-level read .*
2070: 2a 20 20 20 20 20 20 74 72 61 6e 73 61 63 74 69  *      transacti
2080: 6f 6e 20 69 73 20 6e 6f 74 20 61 63 74 69 76 65  on is not active
2090: 29 2e 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a  ). The dbOrigSiz
20a0: 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65  e and dbFileSize
20b0: 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20   variables.**   
20c0: 20 20 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72     may not be tr
20d0: 75 73 74 65 64 20 61 74 20 74 68 69 73 20 70 6f  usted at this po
20e0: 69 6e 74 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  int..**    * If 
20f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
2100: 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20  a WAL database, 
2110: 74 68 65 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e  then the WAL con
2120: 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e  nection is open.
2130: 0a 2a 2a 20 20 20 20 2a 20 45 76 65 6e 20 69 66  .**    * Even if
2140: 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
2150: 69 6f 6e 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c  ion is not open,
2160: 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
2170: 64 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20  d that .**      
2180: 74 68 65 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d  there is no hot-
2190: 6a 6f 75 72 6e 61 6c 20 69 6e 20 74 68 65 20 66  journal in the f
21a0: 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a  ile-system..**.*
21b0: 2a 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  *  WRITER_LOCKED
21c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70  :.**.**    The p
21d0: 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68  ager moves to th
21e0: 69 73 20 73 74 61 74 65 20 66 72 6f 6d 20 52 45  is state from RE
21f0: 41 44 45 52 20 77 68 65 6e 20 61 20 77 72 69 74  ADER when a writ
2200: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e-transaction.**
2210: 20 20 20 20 69 73 20 66 69 72 73 74 20 6f 70 65      is first ope
2220: 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ned on the datab
2230: 61 73 65 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c  ase. In WRITER_L
2240: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2250: 20 6c 6f 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65   locks .**    re
2260: 71 75 69 72 65 64 20 74 6f 20 73 74 61 72 74 20  quired to start 
2270: 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
2280: 69 6f 6e 20 61 72 65 20 68 65 6c 64 2c 20 62 75  ion are held, bu
2290: 74 20 6e 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20  t no actual .** 
22a0: 20 20 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73     modifications
22b0: 20 74 6f 20 74 68 65 20 63 61 63 68 65 20 6f 72   to the cache or
22c0: 20 64 61 74 61 62 61 73 65 20 68 61 76 65 20 74   database have t
22d0: 61 6b 65 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a  aken place..**.*
22e0: 2a 20 20 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b  *    In rollback
22f0: 20 6d 6f 64 65 2c 20 61 20 52 45 53 45 52 56 45   mode, a RESERVE
2300: 44 20 6f 72 20 28 69 66 20 74 68 65 20 74 72 61  D or (if the tra
2310: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65  nsaction was ope
2320: 6e 65 64 20 77 69 74 68 20 0a 2a 2a 20 20 20 20  ned with .**    
2330: 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 29  BEGIN EXCLUSIVE)
2340: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2350: 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  is obtained on t
2360: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2370: 20 77 68 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69   when.**    movi
2380: 6e 67 20 74 6f 20 74 68 69 73 20 73 74 61 74 65  ng to this state
2390: 2c 20 62 75 74 20 74 68 65 20 6a 6f 75 72 6e 61  , but the journa
23a0: 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 77 72  l file is not wr
23b0: 69 74 74 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e  itten to or open
23c0: 65 64 20 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20  ed .**    to in 
23d0: 74 68 69 73 20 73 74 61 74 65 2e 20 49 66 20 74  this state. If t
23e0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
23f0: 73 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  s committed or r
2400: 6f 6c 6c 65 64 20 62 61 63 6b 20 77 68 69 6c 65  olled back while
2410: 20 0a 2a 2a 20 20 20 20 69 6e 20 57 52 49 54 45   .**    in WRITE
2420: 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 2c 20  R_LOCKED state, 
2430: 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71 75  all that is requ
2440: 69 72 65 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63  ired is to unloc
2450: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  k the database .
2460: 2a 2a 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  **    file..**.*
2470: 2a 20 20 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65  *    IN WAL mode
2480: 2c 20 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54  , WalBeginWriteT
2490: 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 69 73 20  ransaction() is 
24a0: 63 61 6c 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74  called to lock t
24b0: 68 65 20 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20  he log file..** 
24c0: 20 20 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63     If the connec
24d0: 74 69 6f 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20  tion is running 
24e0: 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  with locking_mod
24f0: 65 3d 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 20  e=exclusive, an 
2500: 61 74 74 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73  attempt.**    is
2510: 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20   made to obtain 
2520: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
2530: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2540: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  e file..**.**   
2550: 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73   * A write trans
2560: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
2570: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2580: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
2590: 70 65 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d  pen in rollback-
25a0: 6d 6f 64 65 2c 20 61 20 52 45 53 45 52 56 45 44  mode, a RESERVED
25b0: 20 6f 72 20 67 72 65 61 74 65 72 20 0a 2a 2a 20   or greater .** 
25c0: 20 20 20 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c       lock is hel
25d0: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
25e0: 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20  e file..**    * 
25f0: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2600: 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c  n is open in WAL
2610: 2d 6d 6f 64 65 2c 20 61 20 57 41 4c 20 77 72 69  -mode, a WAL wri
2620: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  te transaction.*
2630: 2a 20 20 20 20 20 20 69 73 20 6f 70 65 6e 20 28  *      is open (
2640: 69 2e 65 2e 20 73 71 6c 69 74 65 33 57 61 6c 42  i.e. sqlite3WalB
2650: 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63  eginWriteTransac
2660: 74 69 6f 6e 28 29 20 68 61 73 20 62 65 65 6e 20  tion() has been 
2670: 73 75 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20  successfully.** 
2680: 20 20 20 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a       called)..**
2690: 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65      * The dbSize
26a0: 2c 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64  , dbOrigSize and
26b0: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
26c0: 61 62 6c 65 73 20 61 72 65 20 61 6c 6c 20 76 61  ables are all va
26d0: 6c 69 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  lid..**    * The
26e0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
26f0: 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61 76   pager cache hav
2700: 65 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66  e not been modif
2710: 69 65 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ied..**    * The
2720: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61   journal file ma
2730: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
2740: 6f 70 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f  open..**    * No
2750: 74 68 69 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20  thing (not even 
2760: 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
2770: 29 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74  ) has been writt
2780: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
2790: 6c 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52  l..**.**  WRITER
27a0: 5f 43 41 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a  _CACHEMOD:.**.**
27b0: 20 20 20 20 41 20 70 61 67 65 72 20 6d 6f 76 65      A pager move
27c0: 73 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f  s from WRITER_LO
27d0: 43 4b 45 44 20 73 74 61 74 65 20 74 6f 20 74 68  CKED state to th
27e0: 69 73 20 73 74 61 74 65 20 77 68 65 6e 20 61 20  is state when a 
27f0: 70 61 67 65 20 69 73 0a 2a 2a 20 20 20 20 66 69  page is.**    fi
2800: 72 73 74 20 6d 6f 64 69 66 69 65 64 20 62 79 20  rst modified by 
2810: 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 2e  the upper layer.
2820: 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64   In rollback mod
2830: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2840: 6c 65 0a 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e  le.**    is open
2850: 65 64 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  ed (if it is not
2860: 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 20 61   already open) a
2870: 6e 64 20 61 20 68 65 61 64 65 72 20 77 72 69 74  nd a header writ
2880: 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20  ten to the.**   
2890: 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 54 68   start of it. Th
28a0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
28b0: 6f 6e 20 64 69 73 6b 20 68 61 73 20 6e 6f 74 20  on disk has not 
28c0: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
28d0: 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74  *.**    * A writ
28e0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
28f0: 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a   active..**    *
2900: 20 41 20 52 45 53 45 52 56 45 44 20 6f 72 20 67   A RESERVED or g
2910: 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 68  reater lock is h
2920: 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
2930: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  ase file..**    
2940: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
2950: 6c 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  le is open and t
2960: 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20  he first header 
2970: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
2980: 20 0a 2a 2a 20 20 20 20 20 20 74 6f 20 69 74 2c   .**      to it,
2990: 20 62 75 74 20 74 68 65 20 68 65 61 64 65 72 20   but the header 
29a0: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e  has not been syn
29b0: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20  ced to disk..** 
29c0: 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74     * The content
29d0: 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 63 61  s of the page ca
29e0: 63 68 65 20 68 61 76 65 20 62 65 65 6e 20 6d 6f  che have been mo
29f0: 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57  dified..**.**  W
2a00: 52 49 54 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a  RITER_DBMOD:.**.
2a10: 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20  **    The pager 
2a20: 74 72 61 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d  transitions from
2a30: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
2a40: 20 69 6e 74 6f 20 57 52 49 54 45 52 5f 44 42 4d   into WRITER_DBM
2a50: 4f 44 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 77  OD state.**    w
2a60: 68 65 6e 20 69 74 20 6d 6f 64 69 66 69 65 73 20  hen it modifies 
2a70: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2a80: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a90: 65 2e 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f  e. WAL connectio
2aa0: 6e 73 0a 2a 2a 20 20 20 20 6e 65 76 65 72 20 65  ns.**    never e
2ab0: 6e 74 65 72 20 74 68 69 73 20 73 74 61 74 65 20  nter this state 
2ac0: 28 73 69 6e 63 65 20 74 68 65 79 20 64 6f 20 6e  (since they do n
2ad0: 6f 74 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61  ot modify the da
2ae0: 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20  tabase file,.** 
2af0: 20 20 20 6a 75 73 74 20 74 68 65 20 6c 6f 67 20     just the log 
2b00: 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  file)..**.**    
2b10: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2b20: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2b30: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2b40: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
2b50: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
2b60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b70: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  le..**    * The 
2b80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2b90: 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72  open and the fir
2ba0: 73 74 20 68 65 61 64 65 72 20 68 61 73 20 62 65  st header has be
2bb0: 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20  en written .**  
2bc0: 20 20 20 20 61 6e 64 20 73 79 6e 63 65 64 20 74      and synced t
2bd0: 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20  o disk..**    * 
2be0: 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  The contents of 
2bf0: 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 68  the page cache h
2c00: 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  ave been modifie
2c10: 64 20 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a  d (and possibly.
2c20: 2a 2a 20 20 20 20 20 20 77 72 69 74 74 65 6e 20  **      written 
2c30: 74 6f 20 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20  to disk)..**.** 
2c40: 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
2c50: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73  :.**.**    It is
2c60: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
2c70: 72 20 61 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69  r a WAL connecti
2c80: 6f 6e 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73  on to enter this
2c90: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   state..**.**   
2ca0: 20 41 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65   A rollback-mode
2cb0: 20 70 61 67 65 72 20 63 68 61 6e 67 65 73 20 74   pager changes t
2cc0: 6f 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  o WRITER_FINISHE
2cd0: 44 20 73 74 61 74 65 20 66 72 6f 6d 20 57 52 49  D state from WRI
2ce0: 54 45 52 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20  TER_DBMOD.**    
2cf0: 73 74 61 74 65 20 61 66 74 65 72 20 74 68 65 20  state after the 
2d00: 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
2d10: 6f 6e 20 68 61 73 20 62 65 65 6e 20 73 75 63 63  on has been succ
2d20: 65 73 73 66 75 6c 6c 79 20 77 72 69 74 74 65 6e  essfully written
2d30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20   into the.**    
2d40: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
2d50: 6e 20 74 68 69 73 20 73 74 61 74 65 20 74 68 65  n this state the
2d60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
2d70: 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 73 69   be committed si
2d80: 6d 70 6c 79 0a 2a 2a 20 20 20 20 62 79 20 66 69  mply.**    by fi
2d90: 6e 61 6c 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75  nalizing the jou
2da0: 72 6e 61 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20  rnal file. Once 
2db0: 69 6e 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48  in WRITER_FINISH
2dc0: 45 44 20 73 74 61 74 65 2c 20 69 74 20 69 73 20  ED state, it is 
2dd0: 0a 2a 2a 20 20 20 20 6e 6f 74 20 70 6f 73 73 69  .**    not possi
2de0: 62 6c 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  ble to modify th
2df0: 65 20 64 61 74 61 62 61 73 65 20 66 75 72 74 68  e database furth
2e00: 65 72 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  er. At this poin
2e10: 74 2c 20 74 68 65 20 75 70 70 65 72 20 0a 2a 2a  t, the upper .**
2e20: 20 20 20 20 6c 61 79 65 72 20 6d 75 73 74 20 65      layer must e
2e30: 69 74 68 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20  ither commit or 
2e40: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  rollback the tra
2e50: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
2e60: 20 20 20 2a 20 41 20 77 72 69 74 65 20 74 72 61     * A write tra
2e70: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
2e80: 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45  ve..**    * An E
2e90: 58 43 4c 55 53 49 56 45 20 6f 72 20 67 72 65 61  XCLUSIVE or grea
2ea0: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2eb0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2ec0: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41   file..**    * A
2ed0: 6c 6c 20 77 72 69 74 69 6e 67 20 61 6e 64 20 73  ll writing and s
2ee0: 79 6e 63 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61  yncing of journa
2ef0: 6c 20 61 6e 64 20 64 61 74 61 62 61 73 65 20 64  l and database d
2f00: 61 74 61 20 68 61 73 20 66 69 6e 69 73 68 65 64  ata has finished
2f10: 2e 0a 2a 2a 20 20 20 20 20 20 49 66 20 6e 6f 20  ..**      If no 
2f20: 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 61  error occured, a
2f30: 6c 6c 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20  ll that remains 
2f40: 69 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  is to finalize t
2f50: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a  he journal to.**
2f60: 20 20 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65        commit the
2f70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
2f80: 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63   an error did oc
2f90: 63 75 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  cur, the caller 
2fa0: 77 69 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20  will need.**    
2fb0: 20 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68    to rollback th
2fc0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a  e transaction. .
2fd0: 2a 2a 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a  **.**  ERROR:.**
2fe0: 0a 2a 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52  .**    The ERROR
2ff0: 20 73 74 61 74 65 20 69 73 20 65 6e 74 65 72 65   state is entere
3000: 64 20 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20  d when an IO or 
3010: 64 69 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20  disk-full error 
3020: 28 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20  (including.**   
3030: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
3040: 4d 45 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61  MEM) occurs at a
3050: 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f   point in the co
3060: 64 65 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74  de that makes it
3070: 20 0a 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c   .**    difficul
3080: 74 20 74 6f 20 62 65 20 73 75 72 65 20 74 68 61  t to be sure tha
3090: 74 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  t the in-memory 
30a0: 70 61 67 65 72 20 73 74 61 74 65 20 28 63 61 63  pager state (cac
30b0: 68 65 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a  he contents, .**
30c0: 20 20 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e      db size etc.
30d0: 29 20 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74  ) are consistent
30e0: 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e   with the conten
30f0: 74 73 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73  ts of the file-s
3100: 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ystem..**.**    
3110: 54 65 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20  Temporary pager 
3120: 66 69 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20  files may enter 
3130: 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
3140: 20 62 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   but in-memory p
3150: 61 67 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e  agers.**    cann
3160: 6f 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72  ot..**.**    For
3170: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20   example, if an 
3180: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
3190: 77 68 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67  while performing
31a0: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a   a rollback, .**
31b0: 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73      the contents
31c0: 20 6f 66 20 74 68 65 20 70 61 67 65 2d 63 61 63   of the page-cac
31d0: 68 65 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69  he may be left i
31e0: 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
31f0: 74 20 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41  t state..**    A
3200: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
3210: 77 6f 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f  would be dangero
3220: 75 73 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63  us to change bac
3230: 6b 20 74 6f 20 52 45 41 44 45 52 20 73 74 61 74  k to READER stat
3240: 65 0a 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61  e.**    (as usua
3250: 6c 6c 79 20 68 61 70 70 65 6e 73 20 61 66 74 65  lly happens afte
3260: 72 20 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41  r a rollback). A
3270: 6e 79 20 73 75 62 73 65 71 75 65 6e 74 20 72 65  ny subsequent re
3280: 61 64 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20  aders might.**  
3290: 20 20 72 65 70 6f 72 74 20 64 61 74 61 62 61 73    report databas
32a0: 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75  e corruption (du
32b0: 65 20 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69  e to the inconsi
32c0: 73 74 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e  stent cache), an
32d0: 64 20 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20  d if.**    they 
32e0: 75 70 67 72 61 64 65 20 74 6f 20 77 72 69 74 65  upgrade to write
32f0: 72 73 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61  rs, they may ina
3300: 64 76 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75  dvertently corru
3310: 70 74 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  pt the database.
3320: 2a 2a 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61  **    file. To a
3330: 76 6f 69 64 20 74 68 69 73 20 68 61 7a 61 72 64  void this hazard
3340: 2c 20 74 68 65 20 70 61 67 65 72 20 73 77 69 74  , the pager swit
3350: 63 68 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52  ches into the ER
3360: 52 4f 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20  ROR state.**    
3370: 69 6e 73 74 65 61 64 20 6f 66 20 52 45 41 44 45  instead of READE
3380: 52 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68  R following such
3390: 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
33a0: 20 20 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20      Once it has 
33b0: 65 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f  entered the ERRO
33c0: 52 20 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74  R state, any att
33d0: 65 6d 70 74 20 74 6f 20 75 73 65 20 74 68 65 20  empt to use the 
33e0: 70 61 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72  pager.**    to r
33f0: 65 61 64 20 6f 72 20 77 72 69 74 65 20 64 61 74  ead or write dat
3400: 61 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  a returns an err
3410: 6f 72 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20  or. Eventually, 
3420: 6f 6e 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20  once all .**    
3430: 6f 75 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e  outstanding tran
3440: 73 61 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65  sactions have be
3450: 65 6e 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68  en abandoned, th
3460: 65 20 70 61 67 65 72 20 69 73 20 61 62 6c 65 20  e pager is able 
3470: 74 6f 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74  to.**    transit
3480: 69 6f 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e  ion back to OPEN
3490: 20 73 74 61 74 65 2c 20 64 69 73 63 61 72 64 69   state, discardi
34a0: 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
34b0: 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61  of the .**    pa
34c0: 67 65 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79  ge-cache and any
34d0: 20 6f 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79   other in-memory
34e0: 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73 61   state at the sa
34f0: 6d 65 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68  me time. Everyth
3500: 69 6e 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c  ing.**    is rel
3510: 6f 61 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20  oaded from disk 
3520: 28 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61  (and, if necessa
3530: 72 79 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ry, hot-journal 
3540: 72 6f 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65  rollback peforme
3550: 64 29 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20  d).**    when a 
3560: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
3570: 20 69 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20   is next opened 
3580: 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28 74 72  on the pager (tr
3590: 61 6e 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20  ansitioning.**  
35a0: 20 20 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f    the pager into
35b0: 20 52 45 41 44 45 52 20 73 74 61 74 65 29 2e 20   READER state). 
35c0: 41 74 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68  At that point th
35d0: 65 20 73 79 73 74 65 6d 20 68 61 73 20 72 65 63  e system has rec
35e0: 6f 76 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72  overed .**    fr
35f0: 6f 6d 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a  om the error..**
3600: 0a 2a 2a 20 20 20 20 53 70 65 63 69 66 69 63 61  .**    Specifica
3610: 6c 6c 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a  lly, the pager j
3620: 75 6d 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52  umps into the ER
3630: 52 4f 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a  ROR state if:.**
3640: 0a 2a 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65  .**      1. An e
3650: 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
3660: 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72  e attempting a r
3670: 6f 6c 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61  ollback. This ha
3680: 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20  ppens in.**     
3690: 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c      function sql
36a0: 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
36b0: 6b 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  k()..**.**      
36c0: 32 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  2. An error occu
36d0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
36e0: 69 6e 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  ing to finalize 
36f0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  a journal file.*
3700: 2a 20 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77  *         follow
3710: 69 6e 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20  ing a commit in 
3720: 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33  function sqlite3
3730: 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
3740: 54 77 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  Two()..**.**    
3750: 20 20 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63    3. An error oc
3760: 63 75 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d  curs while attem
3770: 70 74 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74  pting to write t
3780: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72  o the journal or
3790: 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 61 74 61  .**         data
37a0: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e  base file in fun
37b0: 63 74 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73  ction pagerStres
37c0: 73 28 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  s() in order to 
37d0: 66 72 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20  free up.**      
37e0: 20 20 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a     memory..**.**
37f0: 20 20 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73      In other cas
3800: 65 73 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73  es, the error is
3810: 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
3820: 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54   b-tree layer. T
3830: 68 65 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20  he b-tree.**    
3840: 6c 61 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d  layer then attem
3850: 70 74 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  pts a rollback o
3860: 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65  peration. If the
3870: 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   error condition
3880: 20 0a 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73   .**    persists
3890: 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e 74 65  , the pager ente
38a0: 72 73 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  rs the ERROR sta
38b0: 74 65 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e  te via condition
38c0: 20 28 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a   (1) above..**.*
38d0: 2a 20 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28  *    Condition (
38e0: 33 29 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  3) is necessary 
38f0: 62 65 63 61 75 73 65 20 69 74 20 63 61 6e 20 62  because it can b
3900: 65 20 74 72 69 67 67 65 72 65 64 20 62 79 20 61  e triggered by a
3910: 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20   read-only.**   
3920: 20 73 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75   statement execu
3930: 74 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 61  ted within a tra
3940: 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69  nsaction. In thi
3950: 73 20 63 61 73 65 2c 20 69 66 20 74 68 65 20 65  s case, if the e
3960: 72 72 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20  rror.**    code 
3970: 77 65 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75  were simply retu
3980: 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
3990: 2c 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79  , the b-tree lay
39a0: 65 72 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20  er would not.** 
39b0: 20 20 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79     automatically
39c0: 20 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62   attempt a rollb
39d0: 61 63 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d  ack, as it assum
39e0: 65 73 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72  es that an error
39f0: 20 69 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64   in a.**    read
3a00: 2d 6f 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20  -only statement 
3a10: 63 61 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65  cannot leave the
3a20: 20 70 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74   pager in an int
3a30: 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73  ernally inconsis
3a40: 74 65 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74  tent .**    stat
3a50: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68  e..**.**    * Th
3a60: 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  e Pager.errCode 
3a70: 76 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 20  variable is set 
3a80: 74 6f 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  to something oth
3a90: 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
3aa0: 4b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65  K..**    * There
3ab0: 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   are one or more
3ac0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
3ad0: 65 72 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73  erences to pages
3ae0: 20 28 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20   (after the.**  
3af0: 20 20 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e      last referen
3b00: 63 65 20 69 73 20 64 72 6f 70 70 65 64 20 74 68  ce is dropped th
3b10: 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d  e pager should m
3b20: 6f 76 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e  ove back to OPEN
3b30: 20 73 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a   state)..**    *
3b40: 20 54 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   The pager is no
3b50: 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  t an in-memory p
3b60: 61 67 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a  ager..**    .**.
3b70: 2a 2a 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  ** Notes:.**.** 
3b80: 20 20 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e    * A pager is n
3b90: 65 76 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44  ever in WRITER_D
3ba0: 42 4d 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46  BMOD or WRITER_F
3bb0: 49 4e 49 53 48 45 44 20 73 74 61 74 65 20 69 66  INISHED state if
3bc0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e   the.**     conn
3bd0: 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69  ection is open i
3be0: 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41  n WAL mode. A WA
3bf0: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  L connection is 
3c00: 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a  always in one.**
3c10: 20 20 20 20 20 6f 66 20 74 68 65 20 66 69 72 73       of the firs
3c20: 74 20 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a  t four states..*
3c30: 2a 0a 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c  *.**   * Normall
3c40: 79 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  y, a connection 
3c50: 6f 70 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76  open in exclusiv
3c60: 65 20 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20  e mode is never 
3c70: 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a  in PAGER_OPEN.**
3c80: 20 20 20 20 20 73 74 61 74 65 2e 20 54 68 65 72       state. Ther
3c90: 65 20 61 72 65 20 74 77 6f 20 65 78 63 65 70 74  e are two except
3ca0: 69 6f 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c  ions: immediatel
3cb0: 79 20 61 66 74 65 72 20 65 78 63 6c 75 73 69 76  y after exclusiv
3cc0: 65 2d 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20  e-mode has.**   
3cd0: 20 20 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e    been turned on
3ce0: 20 28 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79   (and before any
3cf0: 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
3d00: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
3d10: 0a 2a 2a 20 20 20 20 20 65 78 65 63 75 74 65 64  .**     executed
3d20: 29 2c 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20  ), and when the 
3d30: 70 61 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67  pager is leaving
3d40: 20 74 68 65 20 22 65 72 72 6f 72 20 73 74 61 74   the "error stat
3d50: 65 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65  e"..**.**   * Se
3d60: 65 20 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70  e also: assert_p
3d70: 61 67 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f  ager_state()..*/
3d80: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f  .#define PAGER_O
3d90: 50 45 4e 20 20 20 20 20 20 20 20 20 20 20 20 20  PEN             
3da0: 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50       0.#define P
3db0: 41 47 45 52 5f 52 45 41 44 45 52 20 20 20 20 20  AGER_READER     
3dc0: 20 20 20 20 20 20 20 20 20 20 20 31 0a 23 64 65             1.#de
3dd0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3de0: 52 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20  R_LOCKED        
3df0: 20 32 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   2.#define PAGER
3e00: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
3e10: 20 20 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65         3.#define
3e20: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
3e30: 4d 4f 44 20 20 20 20 20 20 20 20 20 20 34 0a 23  MOD          4.#
3e40: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49  define PAGER_WRI
3e50: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20  TER_FINISHED    
3e60: 20 20 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47     5.#define PAG
3e70: 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20  ER_ERROR        
3e80: 20 20 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a           6../*.*
3e90: 2a 20 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63  * The Pager.eLoc
3ea0: 6b 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c  k variable is al
3eb0: 6d 6f 73 74 20 61 6c 77 61 79 73 20 73 65 74 20  most always set 
3ec0: 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a  to one of the .*
3ed0: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b  * following lock
3ee0: 69 6e 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f  ing-states, acco
3ef0: 72 64 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63  rding to the loc
3f00: 6b 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64  k currently held
3f10: 20 6f 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   on.** the datab
3f20: 61 73 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43  ase file: NO_LOC
3f30: 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20  K, SHARED_LOCK, 
3f40: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72  RESERVED_LOCK or
3f50: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e   EXCLUSIVE_LOCK.
3f60: 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c  .** This variabl
3f70: 65 20 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20  e is kept up to 
3f80: 64 61 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72  date as locks ar
3f90: 65 20 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65  e taken and rele
3fa0: 61 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70  ased by.** the p
3fb0: 61 67 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64  agerLockDb() and
3fc0: 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29   pagerUnlockDb()
3fd0: 20 77 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a   wrappers..**.**
3fe0: 20 49 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63   If the VFS xLoc
3ff0: 6b 28 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29  k() or xUnlock()
4000: 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
4010: 72 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  r other than SQL
4020: 49 54 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65  ITE_BUSY.** (i.e
4030: 2e 20 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c  . one of the SQL
4040: 49 54 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70  ITE_IOERR subtyp
4050: 65 73 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63  es), it is not c
4060: 6c 65 61 72 20 77 68 65 74 68 65 72 20 6f 72 20  lear whether or 
4070: 6e 6f 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61  not.** the opera
4080: 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73  tion was success
4090: 66 75 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69  ful. In these ci
40a0: 72 63 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65  rcumstances page
40b0: 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a  rLockDb() and.**
40c0: 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29   pagerUnlockDb()
40d0: 20 74 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61   take a conserva
40e0: 74 69 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20  tive approach - 
40f0: 65 4c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20  eLock is always 
4100: 75 70 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20  updated.** when 
4110: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69  unlocking the fi
4120: 6c 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64  le, and only upd
4130: 61 74 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e  ated when lockin
4140: 67 20 74 68 65 20 66 69 6c 65 20 69 66 20 74 68  g the file if th
4150: 65 0a 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73  e.** VFS call is
4160: 20 73 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69   successful. Thi
4170: 73 20 77 61 79 2c 20 74 68 65 20 50 61 67 65 72  s way, the Pager
4180: 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20  .eLock variable 
4190: 6d 61 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f  may be set.** to
41a0: 20 61 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76   a less exclusiv
41b0: 65 20 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20  e (lower) value 
41c0: 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68  than the lock th
41d0: 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68  at is actually h
41e0: 65 6c 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79  eld.** at the sy
41f0: 73 74 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20  stem level, but 
4200: 69 74 20 69 73 20 6e 65 76 65 72 20 73 65 74 20  it is never set 
4210: 74 6f 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73  to a more exclus
4220: 69 76 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  ive value..**.**
4230: 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79   This is usually
4240: 20 73 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e   safe. If an xUn
4250: 6c 6f 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70  lock fails or ap
4260: 70 65 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74  pears to fail, t
4270: 68 65 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20  here may .** be 
4280: 61 20 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20  a few redundant 
4290: 78 4c 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72  xLock() calls or
42a0: 20 61 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68   a lock may be h
42b0: 65 6c 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74  eld for longer t
42c0: 68 61 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c  han.** required,
42d0: 20 62 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61   but nothing rea
42e0: 6c 6c 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  lly goes wrong..
42f0: 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74  **.** The except
4300: 69 6f 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20  ion is when the 
4310: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
4320: 20 75 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65   unlocked as the
4330: 20 70 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20   pager moves.** 
4340: 66 72 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50  from ERROR to OP
4350: 45 4e 20 73 74 61 74 65 2e 20 41 74 20 74 68 69  EN state. At thi
4360: 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61  s point there ma
4370: 79 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  y be a hot-journ
4380: 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74  al file .** in t
4390: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74  he file-system t
43a0: 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
43b0: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20  rolled back (as 
43c0: 70 61 72 74 20 6f 66 20 61 20 4f 50 45 4e 2d 3e  part of a OPEN->
43d0: 53 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69  SHARED.** transi
43e0: 74 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d  tion, by the sam
43f0: 65 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f  e pager or any o
4400: 74 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61  ther). If the ca
4410: 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a  ll to xUnlock().
4420: 2a 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73  ** fails at this
4430: 20 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70   point and the p
4440: 61 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c  ager is left hol
4450: 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ding an EXCLUSIV
4460: 45 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20  E lock, this.** 
4470: 63 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20  can confuse the 
4480: 63 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65  call to xCheckRe
4490: 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c  servedLock() cal
44a0: 6c 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20  l made later as 
44b0: 70 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a  part.** of hot-j
44c0: 6f 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e  ournal detection
44d0: 2e 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65  ..**.** xCheckRe
44e0: 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20  servedLock() is 
44f0: 64 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72  defined as retur
4500: 6e 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68  ning true "if th
4510: 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
4520: 44 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20  D .** lock held 
4530: 62 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  by this process 
4540: 6f 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20  or any others". 
4550: 53 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  So xCheckReserve
4560: 64 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65  dLock may .** re
4570: 74 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73  turn true becaus
4580: 65 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73  e the caller its
4590: 65 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  elf is holding a
45a0: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
45b0: 20 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74   (but.** doesn't
45c0: 20 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65   know it because
45d0: 20 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65   of a previous e
45e0: 72 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29  rror in xUnlock)
45f0: 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
4600: 73 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  s.** a hot-journ
4610: 61 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b  al may be mistak
4620: 65 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c  en for a journal
4630: 20 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62   being created b
4640: 79 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74  y an active.** t
4650: 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e  ransaction in an
4660: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63  other process, c
4670: 61 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f  ausing SQLite to
4680: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
4690: 61 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f  atabase.** witho
46a0: 75 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61  ut rolling it ba
46b0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72  ck..**.** To wor
46c0: 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69  k around this, i
46d0: 66 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c  f a call to xUnl
46e0: 6f 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e  ock() fails when
46f0: 20 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a   unlocking the.*
4700: 2a 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68  * database in th
4710: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50  e ERROR state, P
4720: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
4730: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
4740: 4b 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79  K. It.** is only
4750: 20 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f   changed back to
4760: 20 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20   a real locking 
4770: 73 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75  state after a su
4780: 63 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a  ccessful call.**
4790: 20 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53   to xLock(EXCLUS
47a0: 49 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20  IVE). Also, the 
47b0: 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f  code to do the O
47c0: 50 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74  PEN->SHARED stat
47d0: 65 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20  e transition.** 
47e0: 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20  omits the check 
47f0: 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
4800: 6c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b  l if Pager.eLock
4810: 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   is set to UNKNO
4820: 57 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b  WN_LOCK .** lock
4830: 2e 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73  . Instead, it as
4840: 73 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72  sumes a hot-jour
4850: 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f  nal exists and o
4860: 62 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53  btains an EXCLUS
4870: 49 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74  IVE.** lock on t
4880: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
4890: 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
48a0: 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  ng to roll it ba
48b0: 63 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e  ck. See function
48c0: 0a 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c  .** PagerSharedL
48d0: 6f 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64  ock() for more d
48e0: 65 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67  etail..**.** Pag
48f0: 65 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c  er.eLock may onl
4900: 79 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e  y be set to UNKN
4910: 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68  OWN_LOCK when th
4920: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a  e pager is in .*
4930: 2a 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61  * PAGER_OPEN sta
4940: 74 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55  te..*/.#define U
4950: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20  NKNOWN_LOCK     
4960: 20 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c             (EXCL
4970: 55 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f  USIVE_LOCK+1)../
4980: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
4990: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
49a0: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
49b0: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
49c0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
49d0: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
49e0: 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c  EC1(P,D,N,X,E) \
49f0: 0a 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64  .    if( P->xCod
4a00: 65 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28  ec && P->xCodec(
4a10: 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29  P->pCodec,D,N,X)
4a20: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65  ==0 ){ E; }.# de
4a30: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
4a40: 4e 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69  N,X,E,O) \.    i
4a50: 66 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20  f( P->xCodec==0 
4a60: 29 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d  ){ O=(char*)D; }
4a70: 65 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28  else \.    if( (
4a80: 4f 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f  O=(char*)(P->xCo
4a90: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c  dec(P->pCodec,D,
4aa0: 4e 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20  N,X)))==0 ){ E; 
4ab0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
4ac0: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c   CODEC1(P,D,N,X,
4ad0: 45 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  E)   /* NO-OP */
4ae0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
4af0: 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d  (P,D,N,X,E,O) O=
4b00: 28 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a  (char*)D.#endif.
4b10: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
4b20: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f  um allowed secto
4b30: 72 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49  r size. 64KiB. I
4b40: 66 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a  f the xSectorsiz
4b50: 65 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72  e() method .** r
4b60: 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c  eturns a value l
4b70: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c  arger than this,
4b80: 20 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52   then MAX_SECTOR
4b90: 5f 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e  _SIZE is used in
4ba0: 73 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63  stead..** This c
4bb0: 6f 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79  ould conceivably
4bc0: 20 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f   cause corruptio
4bd0: 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f  n following a po
4be0: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a  wer failure on.*
4bf0: 2a 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e  * such a system.
4c00: 20 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74   This is current
4c10: 6c 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74  ly an undocument
4c20: 65 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65  ed limit..*/.#de
4c30: 66 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f  fine MAX_SECTOR_
4c40: 53 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a  SIZE 0x10000../*
4c50: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
4c60: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
4c70: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
4c80: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
4c90: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
4ca0: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
4cb0: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
4cc0: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
4cd0: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
4ce0: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
4cf0: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
4d00: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
4d10: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
4d20: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
4d30: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
4d40: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
4d50: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
4d60: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
4d70: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
4d80: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
4d90: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
4da0: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
4db0: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
4dc0: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
4dd0: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
4de0: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
4df0: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
4e00: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
4e10: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
4e20: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
4e30: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
4e40: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
4e50: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
4e60: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
4e70: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
4e80: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
4e90: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
4ea0: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
4eb0: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
4ec0: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
4ed0: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
4ee0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
4ef0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
4f00: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
4f10: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
4f20: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
4f30: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
4f40: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
4f50: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
4f60: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
4f70: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
4f80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4f90: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
4fa0: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
4fb0: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
4fc0: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
4fd0: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
4fe0: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
4ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5000: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
5010: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
5020: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
5030: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
5040: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
5050: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
5060: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
5070: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5080: 4d 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57  MIT_WAL.  u32 aW
5090: 61 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50  alData[WAL_SAVEP
50a0: 4f 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20  OINT_NDATA];    
50b0: 20 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70      /* WAL savep
50c0: 6f 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  oint context */.
50d0: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
50e0: 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63   A open page cac
50f0: 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  he is an instanc
5100: 65 20 6f 66 20 73 74 72 75 63 74 20 50 61 67 65  e of struct Page
5110: 72 2e 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e  r. A description
5120: 20 6f 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74   of.** some of t
5130: 68 65 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e  he more importan
5140: 74 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c  t member variabl
5150: 65 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  es follows:.**.*
5160: 2a 20 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20  * eState.**.**  
5170: 20 54 68 65 20 63 75 72 72 65 6e 74 20 27 73 74   The current 'st
5180: 61 74 65 27 20 6f 66 20 74 68 65 20 70 61 67 65  ate' of the page
5190: 72 20 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68  r object. See th
51a0: 65 20 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74  e comment and st
51b0: 61 74 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d  ate.**   diagram
51c0: 20 61 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73   above for a des
51d0: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
51e0: 70 61 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a  pager state..**.
51f0: 2a 2a 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20  ** eLock.**.**  
5200: 20 46 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64   For a real on-d
5210: 69 73 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68  isk database, th
5220: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68  e current lock h
5230: 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
5240: 61 73 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20  ase file -.**   
5250: 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f  NO_LOCK, SHARED_
5260: 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c  LOCK, RESERVED_L
5270: 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45  OCK or EXCLUSIVE
5280: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46  _LOCK..**.**   F
5290: 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f  or a temporary o
52a0: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  r in-memory data
52b0: 62 61 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66  base (neither of
52c0: 20 77 68 69 63 68 20 72 65 71 75 69 72 65 20 61   which require a
52d0: 6e 79 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20  ny.**   locks), 
52e0: 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  this variable is
52f0: 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45   always set to E
5300: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53  XCLUSIVE_LOCK. S
5310: 69 6e 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64  ince such.**   d
5320: 61 74 61 62 61 73 65 73 20 61 6c 77 61 79 73 20  atabases always 
5330: 68 61 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75  have Pager.exclu
5340: 73 69 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69  siveMode==1, thi
5350: 73 20 74 72 69 63 6b 73 20 74 68 65 20 70 61 67  s tricks the pag
5360: 65 72 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e  er.**   logic in
5370: 74 6f 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74  to thinking that
5380: 20 69 74 20 61 6c 72 65 61 64 79 20 68 61 73 20   it already has 
5390: 61 6c 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74  all the locks it
53a0: 20 77 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20   will ever.**   
53b0: 6e 65 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61  need (and no rea
53c0: 73 6f 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74  son to release t
53d0: 68 65 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e  hem)..**.**   In
53e0: 20 73 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20   some (obscure) 
53f0: 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74  circumstances, t
5400: 68 69 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79  his variable may
5410: 20 61 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a   also be set to.
5420: 2a 2a 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  **   UNKNOWN_LOC
5430: 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  K. See the comme
5440: 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
5450: 66 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f  fine of UNKNOWN_
5460: 4c 4f 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65  LOCK for.**   de
5470: 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61  tails..**.** cha
5480: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a  ngeCountDone.**.
5490: 2a 2a 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61  **   This boolea
54a0: 6e 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  n variable is us
54b0: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
54c0: 74 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d  that the change-
54d0: 63 6f 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74  counter .**   (t
54e0: 68 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72  he 4-byte header
54f0: 20 66 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f   field at byte o
5500: 66 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20  ffset 24 of the 
5510: 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 69  database file) i
5520: 73 20 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61  s .**   not upda
5530: 74 65 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74  ted more often t
5540: 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a  han necessary. .
5550: 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65  **.**   It is se
5560: 74 20 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74  t to true when t
5570: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
5580: 72 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  r field is updat
5590: 65 64 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20  ed, which .**   
55a0: 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
55b0: 69 66 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  if an exclusive 
55c0: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20  lock is held on 
55d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
55e0: 65 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c  e..**   It is cl
55f0: 65 61 72 65 64 20 28 73 65 74 20 74 6f 20 66 61  eared (set to fa
5600: 6c 73 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e  lse) whenever an
5610: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
5620: 69 73 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75  is .**   relinqu
5630: 69 73 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74  ished on the dat
5640: 61 62 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68  abase file. Each
5650: 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74   time a transact
5660: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
5670: 2c 0a 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67  ,.**   The chang
5680: 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
5690: 69 73 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66  is inspected. If
56a0: 20 69 74 20 69 73 20 74 72 75 65 2c 20 74 68 65   it is true, the
56b0: 20 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70   work of.**   up
56c0: 64 61 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67  dating the chang
56d0: 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69  e-counter is omi
56e0: 74 74 65 64 20 66 6f 72 20 74 68 65 20 63 75 72  tted for the cur
56f0: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
5700: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d  ..**.**   This m
5710: 65 63 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74  echanism means t
5720: 68 61 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67  hat when running
5730: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
5740: 64 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  de, a connection
5750: 20 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79   .**   need only
5760: 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
5770: 67 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c  ge-counter once,
5780: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74   for the first t
5790: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
57a0: 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
57b0: 20 73 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a   setMaster.**.**
57c0: 20 20 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d     When PagerCom
57d0: 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73  mitPhaseOne() is
57e0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69   called to commi
57f0: 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  t a transaction,
5800: 20 69 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72   it may.**   (or
5810: 20 6d 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66   may not) specif
5820: 79 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  y a master-journ
5830: 61 6c 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72  al name to be wr
5840: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a  itten into the .
5850: 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  **   journal fil
5860: 65 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 73  e before it is s
5870: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
5880: 2a 0a 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f  *.**   Whether o
5890: 72 20 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20  r not a journal 
58a0: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  file contains a 
58b0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
58c0: 6f 69 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a  ointer affects .
58d0: 2a 2a 20 20 20 74 68 65 20 77 61 79 20 69 6e 20  **   the way in 
58e0: 77 68 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61  which the journa
58f0: 6c 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69  l file is finali
5900: 7a 65 64 20 61 66 74 65 72 20 74 68 65 20 74 72  zed after the tr
5910: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a  ansaction is .**
5920: 20 20 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20     committed or 
5930: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e  rolled back when
5940: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75   running in "jou
5950: 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53  rnal_mode=PERSIS
5960: 54 22 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66  T" mode..**   If
5970: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
5980: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
5990: 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61   a master-journa
59a0: 6c 20 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73  l pointer, it is
59b0: 0a 2a 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20  .**   finalized 
59c0: 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74  by overwriting t
59d0: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
59e0: 20 68 65 61 64 65 72 20 77 69 74 68 20 7a 65 72   header with zer
59f0: 6f 65 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20  oes. If.**   it 
5a00: 64 6f 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d  does contain a m
5a10: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f  aster-journal po
5a20: 69 6e 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  inter the journa
5a30: 6c 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69  l file is finali
5a40: 7a 65 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75  zed .**   by tru
5a50: 6e 63 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65  ncating it to ze
5a60: 72 6f 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61  ro bytes, just a
5a70: 73 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  s if the connect
5a80: 69 6f 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72  ion were .**   r
5a90: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5aa0: 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65  al_mode=truncate
5ab0: 22 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  " mode..**.**   
5ac0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68  Journal files th
5ad0: 61 74 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65  at contain maste
5ae0: 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
5af0: 72 73 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e  rs cannot be fin
5b00: 61 6c 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70  alized.**   simp
5b10: 6c 79 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e  ly by overwritin
5b20: 67 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  g the first jour
5b30: 6e 61 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20  nal-header with 
5b40: 7a 65 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a  zeroes, as the.*
5b50: 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  *   master journ
5b60: 61 6c 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64  al pointer could
5b70: 20 69 6e 74 65 72 66 65 72 65 20 77 69 74 68 20   interfere with 
5b80: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
5b90: 62 61 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20  back of any.**  
5ba0: 20 73 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e   subsequently in
5bb0: 74 65 72 72 75 70 74 65 64 20 74 72 61 6e 73 61  terrupted transa
5bc0: 63 74 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65  ction that reuse
5bd0: 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
5be0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  le..**.**   The 
5bf0: 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 20  flag is cleared 
5c00: 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a  as soon as the j
5c10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66  ournal file is f
5c20: 69 6e 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72  inalized (either
5c30: 0a 2a 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f  .**   by PagerCo
5c40: 6d 6d 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20  mmitPhaseTwo or 
5c50: 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20  PagerRollback). 
5c60: 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70  If an IO error p
5c70: 72 65 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20  revents the.**  
5c80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72   journal file fr
5c90: 6f 6d 20 62 65 69 6e 67 20 73 75 63 63 65 73 73  om being success
5ca0: 66 75 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c  fully finalized,
5cb0: 20 74 68 65 20 73 65 74 4d 61 73 74 65 72 20 66   the setMaster f
5cc0: 6c 61 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61  lag.**   is clea
5cd0: 72 65 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20  red anyway (and 
5ce0: 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d  the pager will m
5cf0: 6f 76 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61  ove to ERROR sta
5d00: 74 65 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74  te)..**.** doNot
5d10: 53 70 69 6c 6c 2c 20 64 6f 4e 6f 74 53 79 6e 63  Spill, doNotSync
5d20: 53 70 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68  Spill.**.**   Th
5d30: 65 73 65 20 74 77 6f 20 62 6f 6f 6c 65 61 6e 20  ese two boolean 
5d40: 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f  variables contro
5d50: 6c 20 74 68 65 20 62 65 68 61 76 69 6f 75 72 20  l the behaviour 
5d60: 6f 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 0a  of cache-spills.
5d70: 2a 2a 20 20 20 28 63 61 6c 6c 73 20 6d 61 64 65  **   (calls made
5d80: 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20 6d   by the pcache m
5d90: 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67  odule to the pag
5da0: 65 72 53 74 72 65 73 73 28 29 20 72 6f 75 74 69  erStress() routi
5db0: 6e 65 20 74 6f 0a 2a 2a 20 20 20 77 72 69 74 65  ne to.**   write
5dc0: 20 63 61 63 68 65 64 20 64 61 74 61 20 74 6f 20   cached data to 
5dd0: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
5de0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65  in order to free
5df0: 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a   up memory)..**.
5e00: 2a 2a 20 20 20 57 68 65 6e 20 64 6f 4e 6f 74 53  **   When doNotS
5e10: 70 69 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  pill is non-zero
5e20: 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  , writing to the
5e30: 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70   database from p
5e40: 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20  agerStress().** 
5e50: 20 20 69 73 20 64 69 73 61 62 6c 65 64 20 61 6c    is disabled al
5e60: 74 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20 69  together. This i
5e70: 73 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79  s done in a very
5e80: 20 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68   obscure case th
5e90: 61 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70  at.**   comes up
5ea0: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
5eb0: 74 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20  t rollback that 
5ec0: 72 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61  requires the pca
5ed0: 63 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20  che module.**   
5ee0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
5ef0: 77 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e  w page to preven
5f00: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
5f10: 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72  le from being wr
5f20: 69 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65  itten.**   while
5f30: 20 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61   it is being tra
5f40: 76 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69  versed by code i
5f50: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
5f60: 28 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49 66 20  ()..** .**   If 
5f70: 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69  doNotSyncSpill i
5f80: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74  s non-zero, writ
5f90: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
5fa0: 61 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74  ase from pagerSt
5fb0: 72 65 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 70  ress().**   is p
5fc0: 65 72 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79  ermitted, but sy
5fd0: 6e 63 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ncing the journa
5fe0: 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 2e 20 54  l file is not. T
5ff0: 68 69 73 20 66 6c 61 67 20 69 73 20 73 65 74 0a  his flag is set.
6000: 2a 2a 20 20 20 62 79 20 73 71 6c 69 74 65 33 50  **   by sqlite3P
6010: 61 67 65 72 57 72 69 74 65 28 29 20 77 68 65 6e  agerWrite() when
6020: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
6030: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20   sector-size is 
6040: 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 20  larger than.**  
6050: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61   the database pa
6060: 67 65 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72  ge-size in order
6070: 20 74 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f   to prevent a jo
6080: 75 72 6e 61 6c 20 73 79 6e 63 20 66 72 6f 6d 20  urnal sync from 
6090: 68 61 70 70 65 6e 69 6e 67 20 0a 2a 2a 20 20 20  happening .**   
60a0: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 6a  in between the j
60b0: 6f 75 72 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77  ournalling of tw
60c0: 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 73  o pages on the s
60d0: 61 6d 65 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a  ame sector. .**.
60e0: 2a 2a 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a  ** subjInMemory.
60f0: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20  **.**   This is 
6100: 61 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  a boolean variab
6110: 6c 65 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65  le. If true, the
6120: 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 73  n any required s
6130: 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  ub-journal.**   
6140: 69 73 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20  is opened as an 
6150: 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
6160: 6c 20 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65  l file. If false
6170: 2c 20 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79  , then in-memory
6180: 0a 2a 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61  .**   sub-journa
6190: 6c 73 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64  ls are only used
61a0: 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   for in-memory p
61b0: 61 67 65 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ager files..**.*
61c0: 2a 20 20 20 54 68 69 73 20 76 61 72 69 61 62 6c  *   This variabl
61d0: 65 20 69 73 20 75 70 64 61 74 65 64 20 62 79 20  e is updated by 
61e0: 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
61f0: 65 61 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20  each time a new 
6200: 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72 61 6e  .**   write-tran
6210: 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65  saction is opene
6220: 64 2e 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c  d..**.** dbSize,
6230: 20 64 62 4f 72 69 67 53 69 7a 65 2c 20 64 62 46   dbOrigSize, dbF
6240: 69 6c 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20  ileSize.**.**   
6250: 56 61 72 69 61 62 6c 65 20 64 62 53 69 7a 65 20  Variable dbSize 
6260: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
6270: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
6280: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
6290: 6c 65 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 76  le..**   It is v
62a0: 61 6c 69 64 20 69 6e 20 50 41 47 45 52 5f 52 45  alid in PAGER_RE
62b0: 41 44 45 52 20 61 6e 64 20 68 69 67 68 65 72 20  ADER and higher 
62c0: 73 74 61 74 65 73 20 28 61 6c 6c 20 73 74 61 74  states (all stat
62d0: 65 73 20 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a  es except for.**
62e0: 20 20 20 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f     OPEN and ERRO
62f0: 52 29 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53  R). .**.**   dbS
6300: 69 7a 65 20 69 73 20 73 65 74 20 62 61 73 65 64  ize is set based
6310: 20 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20   on the size of 
6320: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6330: 65 2c 20 77 68 69 63 68 20 6d 61 79 20 62 65 20  e, which may be 
6340: 0a 2a 2a 20 20 20 6c 61 72 67 65 72 20 74 68 61  .**   larger tha
6350: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
6360: 65 20 64 61 74 61 62 61 73 65 20 28 74 68 65 20  e database (the 
6370: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 61 74 20  value stored at 
6380: 6f 66 66 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f  offset.**   28 o
6390: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
63a0: 65 61 64 65 72 20 62 79 20 74 68 65 20 62 74 72  eader by the btr
63b0: 65 65 29 2e 20 49 66 20 74 68 65 20 73 69 7a 65  ee). If the size
63c0: 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20   of the file.** 
63d0: 20 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65    is not an inte
63e0: 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  ger multiple of 
63f0: 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74  the page-size, t
6400: 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
6410: 69 6e 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69  in.**   dbSize i
6420: 73 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28  s rounded down (
6430: 69 2e 65 2e 20 61 20 35 4b 42 20 66 69 6c 65 20  i.e. a 5KB file 
6440: 77 69 74 68 20 32 4b 20 70 61 67 65 2d 73 69 7a  with 2K page-siz
6450: 65 20 68 61 73 20 64 62 53 69 7a 65 3d 3d 32 29  e has dbSize==2)
6460: 2e 0a 2a 2a 20 20 20 45 78 63 65 70 74 2c 20 61  ..**   Except, a
6470: 6e 79 20 66 69 6c 65 20 74 68 61 74 20 69 73 20  ny file that is 
6480: 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 62  greater than 0 b
6490: 79 74 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20  ytes in size is 
64a0: 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20 20 20  considered.**   
64b0: 74 6f 20 68 61 76 65 20 61 74 20 6c 65 61 73 74  to have at least
64c0: 20 6f 6e 65 20 70 61 67 65 2e 20 28 69 2e 65 2e   one page. (i.e.
64d0: 20 61 20 31 4b 42 20 66 69 6c 65 20 77 69 74 68   a 1KB file with
64e0: 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 6c 65   2K page-size le
64f0: 61 64 73 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69  ads.**   to dbSi
6500: 7a 65 3d 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  ze==1)..**.**   
6510: 44 75 72 69 6e 67 20 61 20 77 72 69 74 65 2d 74  During a write-t
6520: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 70  ransaction, if p
6530: 61 67 65 73 20 77 69 74 68 20 70 61 67 65 2d 6e  ages with page-n
6540: 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 20 74  umbers greater t
6550: 68 61 6e 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20  han.**   dbSize 
6560: 61 72 65 20 6d 6f 64 69 66 69 65 64 20 69 6e 20  are modified in 
6570: 74 68 65 20 63 61 63 68 65 2c 20 64 62 53 69 7a  the cache, dbSiz
6580: 65 20 69 73 20 75 70 64 61 74 65 64 20 61 63 63  e is updated acc
6590: 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53  ordingly..**   S
65a0: 69 6d 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65  imilarly, if the
65b0: 20 64 61 74 61 62 61 73 65 20 69 73 20 74 72 75   database is tru
65c0: 6e 63 61 74 65 64 20 75 73 69 6e 67 20 50 61 67  ncated using Pag
65d0: 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
65e0: 29 2c 20 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20  ), .**   dbSize 
65f0: 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a  is updated..**.*
6600: 2a 20 20 20 56 61 72 69 61 62 6c 65 73 20 64 62  *   Variables db
6610: 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46  OrigSize and dbF
6620: 69 6c 65 53 69 7a 65 20 61 72 65 20 76 61 6c 69  ileSize are vali
6630: 64 20 69 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20  d in states .** 
6640: 20 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c    PAGER_WRITER_L
6650: 4f 43 4b 45 44 20 61 6e 64 20 68 69 67 68 65 72  OCKED and higher
6660: 2e 20 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20  . dbOrigSize is 
6670: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64 62  a copy of the db
6680: 53 69 7a 65 0a 2a 2a 20 20 20 76 61 72 69 61 62  Size.**   variab
6690: 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  le at the start 
66a0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
66b0: 6f 6e 2e 20 49 74 20 69 73 20 75 73 65 64 20 64  on. It is used d
66c0: 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a  uring rollback,.
66d0: 2a 2a 20 20 20 61 6e 64 20 74 6f 20 64 65 74 65  **   and to dete
66e0: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
66f0: 20 6e 6f 74 20 70 61 67 65 73 20 6e 65 65 64 20   not pages need 
6700: 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64  to be journalled
6710: 20 62 65 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69   before.**   bei
6720: 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  ng modified..**.
6730: 2a 2a 20 20 20 54 68 72 6f 75 67 68 6f 75 74 20  **   Throughout 
6740: 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
6750: 69 6f 6e 2c 20 64 62 46 69 6c 65 53 69 7a 65 20  ion, dbFileSize 
6760: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a  contains the siz
6770: 65 20 6f 66 0a 2a 2a 20 20 20 74 68 65 20 66 69  e of.**   the fi
6780: 6c 65 20 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61  le on disk in pa
6790: 67 65 73 2e 20 49 74 20 69 73 20 73 65 74 20 74  ges. It is set t
67a0: 6f 20 61 20 63 6f 70 79 20 6f 66 20 64 62 53 69  o a copy of dbSi
67b0: 7a 65 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20  ze when the.**  
67c0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
67d0: 6f 6e 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e  on is first open
67e0: 65 64 2c 20 61 6e 64 20 75 70 64 61 74 65 64 20  ed, and updated 
67f0: 77 68 65 6e 20 56 46 53 20 63 61 6c 6c 73 20 61  when VFS calls a
6800: 72 65 20 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20  re made.**   to 
6810: 77 72 69 74 65 20 6f 72 20 74 72 75 6e 63 61 74  write or truncat
6820: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
6830: 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a  ile on disk. .**
6840: 0a 2a 2a 20 20 20 54 68 65 20 6f 6e 6c 79 20 72  .**   The only r
6850: 65 61 73 6f 6e 20 74 68 65 20 64 62 46 69 6c 65  eason the dbFile
6860: 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69 73  Size variable is
6870: 20 72 65 71 75 69 72 65 64 20 69 73 20 74 6f 20   required is to 
6880: 73 75 70 70 72 65 73 73 20 0a 2a 2a 20 20 20 75  suppress .**   u
6890: 6e 6e 65 63 65 73 73 61 72 79 20 63 61 6c 6c 73  nnecessary calls
68a0: 20 74 6f 20 78 54 72 75 6e 63 61 74 65 28 29 20   to xTruncate() 
68b0: 61 66 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67  after committing
68c0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
68d0: 49 66 2c 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61  If, .**   when a
68e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
68f0: 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 20 64  committed, the d
6900: 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62  bFileSize variab
6910: 6c 65 20 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a  le indicates .**
6920: 20 20 20 74 68 61 74 20 74 68 65 20 64 61 74 61     that the data
6930: 62 61 73 65 20 66 69 6c 65 20 69 73 20 6c 61 72  base file is lar
6940: 67 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74  ger than the dat
6950: 61 62 61 73 65 20 69 6d 61 67 65 20 28 50 61 67  abase image (Pag
6960: 65 72 2e 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20  er.dbSize), .** 
6970: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6980: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68  () is called. Th
6990: 65 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  e pager_truncate
69a0: 28 29 20 63 61 6c 6c 20 75 73 65 73 20 78 46 69  () call uses xFi
69b0: 6c 65 73 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f  lesize().**   to
69c0: 20 6d 65 61 73 75 72 65 20 74 68 65 20 64 61 74   measure the dat
69d0: 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
69e0: 73 6b 2c 20 61 6e 64 20 74 68 65 6e 20 74 72 75  sk, and then tru
69f0: 6e 63 61 74 65 73 20 69 74 20 69 66 20 72 65 71  ncates it if req
6a00: 75 69 72 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69  uired..**   dbFi
6a10: 6c 65 53 69 7a 65 20 69 73 20 6e 6f 74 20 75 73  leSize is not us
6a20: 65 64 20 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  ed when rolling 
6a30: 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69  back a transacti
6a40: 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  on. In this case
6a50: 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e  .**   pager_trun
6a60: 63 61 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  cate() is called
6a70: 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79   unconditionally
6a80: 20 28 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68   (which means th
6a90: 65 72 65 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20  ere may be.**   
6aa0: 61 20 63 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73  a call to xFiles
6ab0: 69 7a 65 28 29 20 74 68 61 74 20 69 73 20 6e 6f  ize() that is no
6ac0: 74 20 73 74 72 69 63 74 6c 79 20 72 65 71 75 69  t strictly requi
6ad0: 72 65 64 29 2e 20 49 6e 20 65 69 74 68 65 72 20  red). In either 
6ae0: 63 61 73 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72  case,.**   pager
6af0: 5f 74 72 75 6e 63 61 74 65 28 29 20 6d 61 79 20  _truncate() may 
6b00: 63 61 75 73 65 20 74 68 65 20 66 69 6c 65 20 74  cause the file t
6b10: 6f 20 62 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72  o become smaller
6b20: 20 6f 72 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a   or larger..**.*
6b30: 2a 20 64 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a  * dbHintSize.**.
6b40: 2a 2a 20 20 20 54 68 65 20 64 62 48 69 6e 74 53  **   The dbHintS
6b50: 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69 73 20  ize variable is 
6b60: 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68  used to limit th
6b70: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c  e number of call
6b80: 73 20 6d 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74  s made to.**   t
6b90: 68 65 20 56 46 53 20 78 46 69 6c 65 43 6f 6e 74  he VFS xFileCont
6ba0: 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  rol(FCNTL_SIZE_H
6bb0: 49 4e 54 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a  INT) method. .**
6bc0: 0a 2a 2a 20 20 20 64 62 48 69 6e 74 53 69 7a 65  .**   dbHintSize
6bd0: 20 69 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70   is set to a cop
6be0: 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65 20  y of the dbSize 
6bf0: 76 61 72 69 61 62 6c 65 20 77 68 65 6e 20 61 0a  variable when a.
6c00: 2a 2a 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73  **   write-trans
6c10: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64  action is opened
6c20: 20 28 61 74 20 74 68 65 20 73 61 6d 65 20 74 69   (at the same ti
6c30: 6d 65 20 61 73 20 64 62 46 69 6c 65 53 69 7a 65  me as dbFileSize
6c40: 20 61 6e 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67   and.**   dbOrig
6c50: 53 69 7a 65 29 2e 20 49 66 20 74 68 65 20 78 46  Size). If the xF
6c60: 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c  ileControl(FCNTL
6c70: 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68  _SIZE_HINT) meth
6c80: 6f 64 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a  od is called,.**
6c90: 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73     dbHintSize is
6ca0: 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68   increased to th
6cb0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
6cc0: 73 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  s that correspon
6cd0: 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69  d to the.**   si
6ce0: 7a 65 2d 68 69 6e 74 20 70 61 73 73 65 64 20 74  ze-hint passed t
6cf0: 6f 20 74 68 65 20 6d 65 74 68 6f 64 20 63 61 6c  o the method cal
6d00: 6c 2e 20 53 65 65 20 70 61 67 65 72 5f 77 72 69  l. See pager_wri
6d10: 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20 66 6f  te_pagelist() fo
6d20: 72 20 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e  r .**   details.
6d30: 0a 2a 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a  .**.** errCode.*
6d40: 2a 0a 2a 2a 20 20 20 54 68 65 20 50 61 67 65 72  *.**   The Pager
6d50: 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c  .errCode variabl
6d60: 65 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75  e is only ever u
6d70: 73 65 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52  sed in PAGER_ERR
6d80: 4f 52 20 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20  OR state. It.** 
6d90: 20 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f    is set to zero
6da0: 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20 73 74   in all other st
6db0: 61 74 65 73 2e 20 49 6e 20 50 41 47 45 52 5f 45  ates. In PAGER_E
6dc0: 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65  RROR state, Page
6dd0: 72 2e 65 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20  r.errCode .**   
6de0: 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  is always set to
6df0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51   SQLITE_FULL, SQ
6e00: 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e  LITE_IOERR or on
6e10: 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  e of the SQLITE_
6e20: 49 4f 45 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20  IOERR_XXX .**   
6e30: 73 75 62 2d 63 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a  sub-codes..**.**
6e40: 20 20 20 49 66 20 50 61 67 65 72 2e 65 72 72 43     If Pager.errC
6e50: 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 53 51  ode is set to SQ
6e60: 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e  LITE_IOERR or on
6e70: 65 20 6f 66 20 69 74 73 20 73 75 62 63 6f 64 65  e of its subcode
6e80: 73 2c 20 74 68 65 6e 0a 2a 2a 20 20 20 74 68 69  s, then.**   thi
6e90: 73 20 76 61 6c 75 65 20 69 73 20 69 6d 6d 65 64  s value is immed
6ea0: 69 61 74 65 6c 79 20 72 65 74 75 72 6e 65 64 20  iately returned 
6eb0: 77 68 65 6e 20 65 76 65 72 20 61 6e 79 20 73 71  when ever any sq
6ec0: 6c 69 74 65 33 50 61 67 65 72 58 58 58 28 29 20  lite3PagerXXX() 
6ed0: 6d 65 74 68 6f 64 0a 2a 2a 20 20 20 74 68 61 74  method.**   that
6ee0: 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
6ef0: 72 20 63 6f 64 65 20 69 73 20 63 61 6c 6c 65 64  r code is called
6f00: 2e 20 49 66 20 69 74 20 69 73 20 73 65 74 20 74  . If it is set t
6f10: 6f 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 0a 2a  o SQLITE_FULL,.*
6f20: 2a 20 20 20 74 68 65 6e 20 69 74 20 69 73 20 72  *   then it is r
6f30: 65 74 75 72 6e 65 64 20 77 68 65 6e 65 76 65 72  eturned whenever
6f40: 20 61 6e 79 20 73 75 63 68 20 73 71 6c 69 74 65   any such sqlite
6f50: 33 50 61 67 65 72 58 58 58 28 29 20 6d 65 74 68  3PagerXXX() meth
6f60: 6f 64 20 65 78 63 65 70 74 0a 2a 2a 20 20 20 66  od except.**   f
6f70: 6f 72 20 50 61 67 65 72 41 63 71 75 69 72 65 28  or PagerAcquire(
6f80: 29 20 6f 72 20 50 61 67 65 72 4c 6f 6f 6b 75 70  ) or PagerLookup
6f90: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
6fa0: 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 52 65 76 69  .**   TODO: Revi
6fb0: 65 77 20 74 68 65 20 53 51 4c 49 54 45 5f 46 55  ew the SQLITE_FU
6fc0: 4c 4c 2f 50 61 67 65 72 41 63 71 75 69 72 65 28  LL/PagerAcquire(
6fd0: 29 20 65 78 63 65 70 74 69 6f 6e 2e 20 49 73 20  ) exception. Is 
6fe0: 69 74 20 61 20 67 6f 6f 64 20 69 64 65 61 3f 0a  it a good idea?.
6ff0: 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 73 6f  **         If so
7000: 2c 20 61 72 65 20 74 68 65 72 65 20 62 75 67 73  , are there bugs
7010: 20 77 68 65 72 65 62 79 20 73 68 61 72 65 64 2d   whereby shared-
7020: 63 61 63 68 65 20 63 6c 69 65 6e 74 73 20 63 61  cache clients ca
7030: 6e 20 73 65 65 20 0a 2a 2a 20 20 20 20 20 20 20  n see .**       
7040: 20 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20 64 61    uncommitted da
7050: 74 61 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  ta when the page
7060: 72 20 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f  r is in the ERRO
7070: 52 20 73 74 61 74 65 3f 0a 2a 2a 0a 2a 2f 0a 73  R state?.**.*/.s
7080: 74 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20  truct Pager {.  
7090: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
70a0: 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  s;          /* O
70b0: 53 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75  S functions to u
70c0: 73 65 20 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75  se for IO */.  u
70d0: 38 20 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b  8 exclusiveMode;
70e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f             /* Bo
70f0: 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c  olean. True if l
7100: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43  ocking_mode==EXC
7110: 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a  LUSIVE */.  u8 j
7120: 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20  ournalMode;     
7130: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
7140: 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f 55 52  f the PAGER_JOUR
7150: 4e 41 4c 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73  NALMODE_* values
7160: 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72   */.  u8 useJour
7170: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
7180: 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62    /* Use a rollb
7190: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74  ack journal on t
71a0: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  his file */.  u8
71b0: 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20   noReadlock;    
71c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
71d0: 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20 6f 62  not bother to ob
71e0: 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a  tain readlocks *
71f0: 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20  /.  u8 noSync;  
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7210: 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74  /* Do not sync t
7220: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72  he journal if tr
7230: 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53  ue */.  u8 fullS
7240: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7250: 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20      /* Do extra 
7260: 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75  syncs of the jou
7270: 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e  rnal for robustn
7280: 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63  ess */.  u8 sync
7290: 5f 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  _flags;         
72a0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53       /* One of S
72b0: 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59  YNC_NORMAL or SY
72c0: 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20  NC_FULL */.  u8 
72d0: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
72e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
72f0: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
7300: 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75  rary file */.  u
7310: 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20  8 readOnly;     
7320: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
7330: 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e  ue for a read-on
7340: 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ly database */. 
7350: 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20   u8 memDb;      
7360: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7370: 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20  True to inhibit 
7380: 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a  all file I/O */.
7390: 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
73a0: 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69  ing block contai
73b0: 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d  ns those class m
73c0: 65 6d 62 65 72 73 20 74 68 61 74 20 61 72 65 20  embers that are 
73d0: 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a  dynamically.  **
73e0: 20 6d 6f 64 69 66 69 65 64 20 64 75 72 69 6e 67   modified during
73f0: 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f   normal operatio
7400: 6e 73 2e 20 54 68 65 20 6f 74 68 65 72 20 76 61  ns. The other va
7410: 72 69 61 62 6c 65 73 20 69 6e 20 74 68 69 73 20  riables in this 
7420: 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61  structure.  ** a
7430: 72 65 20 65 69 74 68 65 72 20 63 6f 6e 73 74 61  re either consta
7440: 6e 74 20 74 68 72 6f 75 67 68 6f 75 74 20 74 68  nt throughout th
7450: 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 20 74 68  e lifetime of th
7460: 65 20 70 61 67 65 72 2c 20 6f 72 20 65 6c 73 65  e pager, or else
7470: 0a 20 20 2a 2a 20 75 73 65 64 20 74 6f 20 73 74  .  ** used to st
7480: 6f 72 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ore configuratio
7490: 6e 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61  n parameters tha
74a0: 74 20 61 66 66 65 63 74 20 74 68 65 20 77 61 79  t affect the way
74b0: 20 74 68 65 20 70 61 67 65 72 20 0a 20 20 2a 2a   the pager .  **
74c0: 20 6f 70 65 72 61 74 65 73 2e 0a 20 20 2a 2a 0a   operates..  **.
74d0: 20 20 2a 2a 20 54 68 65 20 27 73 74 61 74 65 27    ** The 'state'
74e0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 64 65 73   variable is des
74f0: 63 72 69 62 65 64 20 69 6e 20 6d 6f 72 65 20 64  cribed in more d
7500: 65 74 61 69 6c 20 61 6c 6f 6e 67 20 77 69 74 68  etail along with
7510: 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 63 72 69   the.  ** descri
7520: 70 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 76 61  ptions of the va
7530: 6c 75 65 73 20 69 74 20 6d 61 79 20 74 61 6b 65  lues it may take
7540: 20 2d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20   - PAGER_UNLOCK 
7550: 65 74 63 2e 20 4d 61 6e 79 20 6f 66 20 74 68 65  etc. Many of the
7560: 0a 20 20 2a 2a 20 6f 74 68 65 72 20 76 61 72 69  .  ** other vari
7570: 61 62 6c 65 73 20 69 6e 20 74 68 69 73 20 62 6c  ables in this bl
7580: 6f 63 6b 20 61 72 65 20 64 65 73 63 72 69 62 65  ock are describe
7590: 64 20 69 6e 20 74 68 65 20 63 6f 6d 6d 65 6e 74  d in the comment
75a0: 20 64 69 72 65 63 74 6c 79 20 0a 20 20 2a 2a 20   directly .  ** 
75b0: 61 62 6f 76 65 20 74 68 69 73 20 63 6c 61 73 73  above this class
75c0: 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 20 20 2a   definition..  *
75d0: 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20 20  /.  u8 eState;  
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75f0: 2f 2a 20 50 61 67 65 72 20 73 74 61 74 65 20 28  /* Pager state (
7600: 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c 20 57 52  OPEN, READER, WR
7610: 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a  ITER_LOCKED..) *
7620: 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20 20  /.  u8 eLock;   
7630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7640: 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b 20  /* Current lock 
7650: 68 65 6c 64 20 6f 6e 20 64 61 74 61 62 61 73 65  held on database
7660: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63 68   file */.  u8 ch
7670: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20 20  angeCountDone;  
7680: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61 66         /* Set af
7690: 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67  ter incrementing
76a0: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
76b0: 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d  ter */.  u8 setM
76c0: 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
76d0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
76e0: 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62  a m-j name has b
76f0: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  een written to j
7700: 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f  rnl */.  u8 doNo
7710: 74 53 70 69 6c 6c 3b 20 20 20 20 20 20 20 20 20  tSpill;         
7720: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
7730: 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 77  pill the cache w
7740: 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a  hen non-zero */.
7750: 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 53 70    u8 doNotSyncSp
7760: 69 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ill;          /*
7770: 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 73 70 69   Do not do a spi
7780: 6c 6c 20 74 68 61 74 20 72 65 71 75 69 72 65 73  ll that requires
7790: 20 6a 72 6e 6c 20 73 79 6e 63 20 2a 2f 0a 20 20   jrnl sync */.  
77a0: 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b  u8 subjInMemory;
77b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
77c0: 72 75 65 20 74 6f 20 75 73 65 20 69 6e 2d 6d 65  rue to use in-me
77d0: 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  mory sub-journal
77e0: 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 53 69  s */.  Pgno dbSi
77f0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
7800: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7810: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
7820: 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  abase */.  Pgno 
7830: 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20 20 20  dbOrigSize;     
7840: 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65         /* dbSize
7850: 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72   before the curr
7860: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
7870: 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69 6c 65  */.  Pgno dbFile
7880: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
7890: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
78a0: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
78b0: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
78c0: 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65 3b 20 20  no dbHintSize;  
78d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
78e0: 75 65 20 70 61 73 73 65 64 20 74 6f 20 46 43 4e  ue passed to FCN
78f0: 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 63 61 6c  TL_SIZE_HINT cal
7900: 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f  l */.  int errCo
7910: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
7920: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76     /* One of sev
7930: 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72  eral kinds of er
7940: 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  rors */.  int nR
7950: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
7960: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20 6a        /* Pages j
7970: 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63 65 20  ournalled since 
7980: 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20 77 72  last j-header wr
7990: 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32 20 63  itten */.  u32 c
79a0: 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20  ksumInit;       
79b0: 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d         /* Quasi-
79c0: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64  random value add
79d0: 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63  ed to every chec
79e0: 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20 6e 53  ksum */.  u32 nS
79f0: 75 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  ubRec;          
7a00: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7a10: 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69 74 74  of records writt
7a20: 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72 6e 61  en to sub-journa
7a30: 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  l */.  Bitvec *p
7a40: 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  InJournal;      
7a50: 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f     /* One bit fo
7a60: 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74  r each page in t
7a70: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
7a80: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
7a90: 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20 20 20  le *fd;         
7aa0: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
7ab0: 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62 61 73  ptor for databas
7ac0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
7ad0: 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20  ile *jfd;       
7ae0: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
7af0: 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e 20 6a  iptor for main j
7b00: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69  ournal */.  sqli
7b10: 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64 3b 20  te3_file *sjfd; 
7b20: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
7b30: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 73  descriptor for s
7b40: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  ub-journal */.  
7b50: 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20  i64 journalOff; 
7b60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7b70: 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f 66 66  urrent write off
7b80: 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  set in the journ
7b90: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
7ba0: 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20 20   journalHdr;    
7bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
7bc0: 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76 69   offset to previ
7bd0: 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ous journal head
7be0: 65 72 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  er */.  i64 jour
7bf0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
7c00: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69      /* Size limi
7c10: 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  t for persistent
7c20: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
7c30: 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69  /.  PagerSavepoi
7c40: 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20  nt *aSavepoint; 
7c50: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69  /* Array of acti
7c60: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f  ve savepoints */
7c70: 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e  .  int nSavepoin
7c80: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
7c90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
7ca0: 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69  ents in aSavepoi
7cb0: 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64  nt[] */.  char d
7cc0: 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20  bFileVers[16];  
7cd0: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73        /* Changes
7ce0: 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61   whenever databa
7cf0: 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20  se file changes 
7d00: 2a 2f 0a 20 20 75 33 32 20 73 65 63 74 6f 72 53  */.  u32 sectorS
7d10: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
7d20: 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74   /* Assumed sect
7d30: 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72  or size during r
7d40: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 75 31  ollback */..  u1
7d50: 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20  6 nExtra;       
7d60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
7d70: 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
7d80: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
7d90: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 31 36  ry page */.  i16
7da0: 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20   nReserve;      
7db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7dc0: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
7dd0: 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65 61 63  es at end of eac
7de0: 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32 20  h page */.  u32 
7df0: 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20  vfsFlags;       
7e00: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
7e10: 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66 73   for sqlite3_vfs
7e20: 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e  .xOpen() */.  in
7e30: 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20  t pageSize;     
7e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7e50: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
7e60: 61 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  a page */.  Pgno
7e70: 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20 20   mxPgno;        
7e80: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
7e90: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20  um allowed size 
7ea0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
7eb0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
7ec0: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
7ed0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
7ee0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
7ef0: 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
7f00: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
7f10: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  * Name of the jo
7f20: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
7f30: 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
7f40: 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46  er)(void*); /* F
7f50: 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20  unction to call 
7f60: 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76  when busy */.  v
7f70: 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  oid *pBusyHandle
7f80: 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f  rArg;      /* Co
7f90: 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66  ntext argument f
7fa0: 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  or xBusyHandler 
7fb0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
7fc0: 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74  _TEST.  int nHit
7fd0: 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20  , nMiss;        
7fe0: 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74      /* Cache hit
7ff0: 73 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f  s and missing */
8000: 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57  .  int nRead, nW
8010: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f  rite;          /
8020: 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73  * Database pages
8030: 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f   read/written */
8040: 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28  .#endif.  void (
8050: 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61  *xReiniter)(DbPa
8060: 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68  ge*); /* Call th
8070: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
8080: 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20  reloading pages 
8090: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
80a0: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69  _HAS_CODEC.  voi
80b0: 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
80c0: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
80d0: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
80e0: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
80f0: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ata */.  void (*
8100: 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28  xCodecSizeChng)(
8110: 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20  void*,int,int); 
8120: 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70 61 67  /* Notify of pag
8130: 65 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 2a  e size changes *
8140: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  /.  void (*xCode
8150: 63 46 72 65 65 29 28 76 6f 69 64 2a 29 3b 20 20  cFree)(void*);  
8160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
8170: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65  structor for the
8180: 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64   codec */.  void
8190: 20 2a 70 43 6f 64 65 63 3b 20 20 20 20 20 20 20   *pCodec;       
81a0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
81b0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f   argument to xCo
81c0: 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a  dec... methods *
81d0: 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20  /.#endif.  char 
81e0: 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20  *pTmpSpace;     
81f0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e         /* Pager.
8200: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
8210: 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20  f space for tmp 
8220: 75 73 65 20 2a 2f 0a 20 20 50 43 61 63 68 65 20  use */.  PCache 
8230: 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20  *pPCache;       
8240: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8250: 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62  to page cache ob
8260: 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
8270: 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
8280: 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  p;    /* Pointer
8290: 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f   to list of ongo
82a0: 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65  ing backup proce
82b0: 73 73 65 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20  sses */.#ifndef 
82c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
82d0: 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20    Wal *pWal;    
82e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
82f0: 20 57 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   Write-ahead log
8300: 20 75 73 65 64 20 62 79 20 22 6a 6f 75 72 6e 61   used by "journa
8310: 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20  l_mode=wal" */. 
8320: 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20   char *zWal;    
8330: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8340: 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77 72  File name for wr
8350: 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f  ite-ahead log */
8360: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
8370: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
8380: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
8390: 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75   hold counters u
83a0: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
83b0: 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79  ng purposes only
83c0: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
83d0: 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  es do not exist 
83e0: 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74  in.** a non-test
83f0: 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73  ing build.  Thes
8400: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
8410: 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e  not thread-safe.
8420: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
8430: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
8440: 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
8450: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
8460: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
8470: 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
8480: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
8490: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
84a0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20  count = 0;   /* 
84b0: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
84c0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
84d0: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
84e0: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
84f0: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
8500: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
8510: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
8520: 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50  al */.# define P
8530: 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b  AGER_INCR(v)  v+
8540: 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  +.#else.# define
8550: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23   PAGER_INCR(v).#
8560: 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a  endif..../*.** J
8570: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67  ournal files beg
8580: 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  in with the foll
8590: 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69  owing magic stri
85a0: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a  ng.  The data.**
85b0: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
85c0: 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20  om /dev/random. 
85d0: 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79   It is used only
85e0: 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65   as a sanity che
85f0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  ck..**.** Since 
8600: 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74  version 2.8.0, t
8610: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
8620: 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74  t contains addit
8630: 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20  ional sanity.** 
8640: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
8650: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f  tion.  If the po
8660: 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20  wer fails while 
8670: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
8680: 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c  eing.** written,
8690: 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72   semi-random gar
86a0: 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20  bage data might 
86b0: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f  appear in the jo
86c0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66  urnal.** file af
86d0: 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73  ter power is res
86e0: 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74  tored.  If an at
86f0: 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61  tempt is then ma
8700: 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68  de.** to roll th
8710: 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20  e journal back, 
8720: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
8730: 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  ld be corrupted.
8740: 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c    The additional
8750: 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b  .** sanity check
8760: 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61  ing data is an a
8770: 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76  ttempt to discov
8780: 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69  er the garbage i
8790: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
87a0: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
87b0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79  **.** The sanity
87c0: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
87d0: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65  ation for the ne
87e0: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
87f0: 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20   consists.** of 
8800: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
8810: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f  m on each page o
8820: 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65  f data.  The che
8830: 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74  cksum covers bot
8840: 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  h.** the page nu
8850: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61  mber and the pPa
8860: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
8870: 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20  tes of data for 
8880: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69  the page..** Thi
8890: 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69  s cksum is initi
88a0: 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62  alized to a 32-b
88b0: 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  it random value 
88c0: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
88d0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
88e0: 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20  ile right after 
88f0: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
8900: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69   random initiali
8910: 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  zer is important
8920: 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72  ,.** because gar
8930: 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61  bage data that a
8940: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e  ppears at the en
8950: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69  d of a journal i
8960: 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61  s likely.** data
8970: 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69   that was once i
8980: 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  n other files th
8990: 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  at have now been
89a0: 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68   deleted.  If th
89b0: 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74  e.** garbage dat
89c0: 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f  a came from an o
89d0: 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
89e0: 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73  file, the checks
89f0: 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ums might.** be 
8a00: 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79  correct.  But by
8a10: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
8a20: 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61  e checksum to ra
8a30: 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68  ndom value which
8a40: 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74  .** is different
8a50: 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e   for every journ
8a60: 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20  al, we minimize 
8a70: 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74  that risk..*/.st
8a80: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
8a90: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
8aa0: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
8ab0: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
8ac0: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
8ad0: 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d  1, 0x63, 0xd7,.}
8ae0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ;../*.** The siz
8af0: 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68  e of the of each
8b00: 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20   page record in 
8b10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67  the journal is g
8b20: 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66  iven by.** the f
8b30: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a  ollowing macro..
8b40: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
8b50: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
8b60: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
8b70: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
8b80: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
8b90: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
8ba0: 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69  is pager. This i
8bb0: 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61  s usually the sa
8bc0: 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61  me .** size as a
8bd0: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
8be0: 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65  tor. See also se
8bf0: 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a  tSectorSize()..*
8c00: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
8c10: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
8c20: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
8c30: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
8c40: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
8c50: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
8c60: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
8c70: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
8c80: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
8c90: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
8ca0: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
8cb0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
8cc0: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
8cd0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
8ce0: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
8cf0: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
8d00: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
8d10: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
8d20: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
8d30: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
8d40: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
8d50: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
8d60: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
8d70: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
8d80: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
8d90: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
8da0: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
8db0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
8dc0: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
8dd0: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
8de0: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
8df0: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
8e00: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
8e10: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
8e20: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
8e30: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
8e40: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
8e50: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
8e60: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
8e70: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
8e80: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
8e90: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
8ea0: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
8eb0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
8ec0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
8ed0: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
8ee0: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
8ef0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
8f00: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
8f10: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
8f20: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
8f30: 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a  ->pMethods)../*.
8f40: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
8f50: 66 20 74 68 69 73 20 70 61 67 65 72 20 75 73 65  f this pager use
8f60: 73 20 61 20 77 72 69 74 65 2d 61 68 65 61 64 20  s a write-ahead 
8f70: 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f 66 20 74  log instead of t
8f80: 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c  he usual.** roll
8f90: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74  back journal. Ot
8fa0: 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a  herwise false..*
8fb0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
8fc0: 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74 69 63  _OMIT_WAL.static
8fd0: 20 69 6e 74 20 70 61 67 65 72 55 73 65 57 61 6c   int pagerUseWal
8fe0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
8ff0: 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65  .  return (pPage
9000: 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23  r->pWal!=0);.}.#
9010: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
9020: 67 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a 23  gerUseWal(x) 0.#
9030: 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f 6c   define pagerRol
9040: 6c 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23 20  lbackWal(x) 0.# 
9050: 64 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c 46  define pagerWalF
9060: 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79 2c 7a 29  rames(v,w,x,y,z)
9070: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
9080: 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
9090: 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  t(z) SQLITE_OK.#
90a0: 20 64 65 66 69 6e 65 20 70 61 67 65 72 42 65 67   define pagerBeg
90b0: 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
90c0: 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  n(z) SQLITE_OK.#
90d0: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e  endif..#ifndef N
90e0: 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61  DEBUG ./*.** Usa
90f0: 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65  ge:.**.**   asse
9100: 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
9110: 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
9120: 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ;.**.** This fun
9130: 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79 20  ction runs many 
9140: 61 73 73 65 72 74 73 20 74 6f 20 74 72 79 20 74  asserts to try t
9150: 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73 74  o find inconsist
9160: 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65  encies in.** the
9170: 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
9180: 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
9190: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ect..*/.static i
91a0: 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  nt assert_pager_
91b0: 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b  state(Pager *p){
91c0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
91d0: 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74   = p;..  /* Stat
91e0: 65 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 2e  e must be valid.
91f0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
9200: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
9210: 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  PEN.       || p-
9220: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
9230: 45 41 44 45 52 0a 20 20 20 20 20 20 20 7c 7c 20  EADER.       || 
9240: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9250: 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20  _WRITER_LOCKED. 
9260: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9270: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
9280: 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
9290: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
92a0: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
92b0: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
92c0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
92d0: 54 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20  TER_FINISHED.   
92e0: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
92f0: 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20  ==PAGER_ERROR.  
9300: 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c  );..  /* Regardl
9310: 65 73 73 20 6f 66 20 74 68 65 20 63 75 72 72 65  ess of the curre
9320: 6e 74 20 73 74 61 74 65 2c 20 61 20 74 65 6d 70  nt state, a temp
9330: 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  -file connection
9340: 20 61 6c 77 61 79 73 20 62 65 68 61 76 65 73 0a   always behaves.
9350: 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 68 61    ** as if it ha
9360: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
9370: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
9380: 61 73 65 20 66 69 6c 65 2e 20 49 74 20 6e 65 76  ase file. It nev
9390: 65 72 20 75 70 64 61 74 65 73 0a 20 20 2a 2a 20  er updates.  ** 
93a0: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
93b0: 65 72 20 66 69 65 6c 64 2c 20 73 6f 20 74 68 65  er field, so the
93c0: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
93d0: 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20   flag is always 
93e0: 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  set..  */.  asse
93f0: 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d  rt( p->tempFile=
9400: 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d  =0 || p->eLock==
9410: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
9420: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74  ;.  assert( p->t
9430: 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50  empFile==0 || pP
9440: 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
9450: 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49  tDone );..  /* I
9460: 66 20 74 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c  f the useJournal
9470: 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20   flag is clear, 
9480: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
9490: 20 6d 75 73 74 20 62 65 20 22 4f 46 46 22 2e 20   must be "OFF". 
94a0: 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65  .  ** And if the
94b0: 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73   journal-mode is
94c0: 20 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75 72   "OFF", the jour
94d0: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f  nal file must no
94e0: 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a  t be open..  */.
94f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75    assert( p->jou
9500: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
9510: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
9520: 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  || p->useJournal
9530: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
9540: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
9550: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
9560: 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70  OFF || !isOpen(p
9570: 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20  ->jfd) );..  /* 
9580: 43 68 65 63 6b 20 74 68 61 74 20 4d 45 4d 44 42  Check that MEMDB
9590: 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e   implies noSync.
95a0: 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   And an in-memor
95b0: 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65  y journal. Since
95c0: 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e   .  ** this mean
95d0: 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  s an in-memory p
95e0: 61 67 65 72 20 70 65 72 66 6f 72 6d 73 20 6e 6f  ager performs no
95f0: 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20 63   IO at all, it c
9600: 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72 20  annot encounter 
9610: 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 53 51 4c  .  ** either SQL
9620: 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c  ITE_IOERR or SQL
9630: 49 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67 20  ITE_FULL during 
9640: 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69 6c  rollback or whil
9650: 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20 20  e finalizing .  
9660: 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ** a journal fil
9670: 65 2e 20 28 61 6c 74 68 6f 75 67 68 20 74 68 65  e. (although the
9680: 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
9690: 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  al implementatio
96a0: 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74 75  n may .  ** retu
96b0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
96c0: 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68 65 20  NOMEM while the 
96d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
96e0: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 29 2e 20  being written). 
96f0: 49 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 72  It .  ** is ther
9700: 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69 62  efore not possib
9710: 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  le for an in-mem
9720: 6f 72 79 20 70 61 67 65 72 20 74 6f 20 65 6e 74  ory pager to ent
9730: 65 72 20 74 68 65 20 45 52 52 4f 52 20 0a 20 20  er the ERROR .  
9740: 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20  ** state..  */. 
9750: 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
9760: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53    assert( p->noS
9770: 79 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ync );.    asser
9780: 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  t( p->journalMod
9790: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
97a0: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
97b0: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
97c0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
97d0: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
97e0: 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72      );.    asser
97f0: 74 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41  t( p->eState!=PA
9800: 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e  GER_ERROR && p->
9810: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
9820: 45 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EN );.    assert
9830: 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 29  ( pagerUseWal(p)
9840: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ==0 );.  }..  /*
9850: 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 44   If changeCountD
9860: 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52 45  one is set, a RE
9870: 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67  SERVED lock or g
9880: 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68  reater must be h
9890: 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  eld.  ** on the 
98a0: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  file..  */.  ass
98b0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68 61  ert( pPager->cha
98c0: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20  ngeCountDone==0 
98d0: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
98e0: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
98f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
9900: 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c  eLock!=PENDING_L
9910: 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  OCK );..  switch
9920: 28 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  ( p->eState ){. 
9930: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f 50     case PAGER_OP
9940: 45 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  EN:.      assert
9950: 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
9960: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9970: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
9980: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
9990: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
99a0: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
99b0: 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
99c0: 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
99d0: 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ile );.      bre
99e0: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
99f0: 47 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20 20  GER_READER:.    
9a00: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9a10: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
9a20: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
9a30: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d  sert( p->eLock!=
9a40: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
9a50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
9a60: 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
9a70: 4f 43 4b 20 7c 7c 20 70 2d 3e 6e 6f 52 65 61 64  OCK || p->noRead
9a80: 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 62 72  lock );.      br
9a90: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
9aa0: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
9ab0: 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ED:.      assert
9ac0: 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ( p->eLock!=UNKN
9ad0: 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
9ae0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9af0: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
9b00: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66  E_OK );.      if
9b10: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
9b20: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
9b30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
9b40: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
9b50: 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  K );.      }.   
9b60: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9b70: 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65  r->dbSize==pPage
9b80: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b  r->dbOrigSize );
9b90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9ba0: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
9bb0: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e==pPager->dbFil
9bc0: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  eSize );.      a
9bd0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
9be0: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
9bf0: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
9c00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9c10: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
9c20: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
9c30: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
9c40: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
9c50: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
9c60: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  t( p->eLock!=UNK
9c70: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
9c80: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9c90: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
9ca0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
9cb0: 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
9cc0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
9cd0: 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73     /* It is poss
9ce0: 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75  ible that if jou
9cf0: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65  rnal_mode=wal he
9d00: 72 65 20 74 68 61 74 20 6e 65 69 74 68 65 72 20  re that neither 
9d10: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  the.        ** j
9d20: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20  ournal file nor 
9d30: 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65  the WAL file are
9d40: 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70   open. This happ
9d50: 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20  ens during.     
9d60: 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b     ** a rollback
9d70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
9d80: 74 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20  t switches from 
9d90: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66  journal_mode=off
9da0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a  .        ** to j
9db0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e  ournal_mode=wal.
9dc0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
9dd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
9de0: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
9df0: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61  OCK );.        a
9e00: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
9e10: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
9e20: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
9e30: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9e40: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
9e50: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
9e60: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
9e70: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
9e80: 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  WAL .        );.
9e90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
9ea0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
9eb0: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
9ec0: 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a  ->dbFileSize );.
9ed0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9ee0: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
9ef0: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  ==pPager->dbHint
9f00: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72  Size );.      br
9f10: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
9f20: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
9f30: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
9f40: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55   p->eLock==EXCLU
9f50: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
9f60: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9f70: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
9f80: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
9f90: 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
9fa0: 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
9fb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9fc0: 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45  eLock>=EXCLUSIVE
9fd0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
9fe0: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
9ff0: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
a000: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a010: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a020: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
a030: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a040: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a050: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
a060: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
a070: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a080: 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67  dbOrigSize<=pPag
a090: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
a0a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
a0b0: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57      case PAGER_W
a0c0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
a0d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a0e0: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
a0f0: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
a100: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a110: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a120: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a130: 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
a140: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
a150: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
a160: 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20  (p->jfd) .      
a170: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a180: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a190: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a1a0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
a1b0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a1c0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
a1d0: 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  AL .      );.   
a1e0: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
a1f0: 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a  ase PAGER_ERROR:
a200: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
a210: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
a220: 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
a230: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
a240: 65 20 70 61 67 65 72 20 69 66 0a 20 20 20 20 20  e pager if.     
a250: 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61   ** in ERROR sta
a260: 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68  te. Otherwise th
a270: 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68  e pager should h
a280: 61 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70  ave already drop
a290: 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63  ped.      ** bac
a2a0: 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e  k to OPEN state.
a2b0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
a2c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a2d0: 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
a2e0: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a2f0: 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
a300: 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
a310: 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a  ->pPCache)>0 );.
a320: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
a330: 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ..  return 1;.}.
a340: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
a350: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68 75 6d  pointer to a hum
a360: 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72 69  an readable stri
a370: 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63 20 62  ng in a static b
a380: 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e  uffer.** contain
a390: 69 6e 67 20 74 68 65 20 73 74 61 74 65 20 6f 66  ing the state of
a3a0: 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
a3b0: 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  t passed as an a
a3c0: 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a  rgument. This.**
a3d0: 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20   is intended to 
a3e0: 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 64  be used within d
a3f0: 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20 65 78  ebuggers. For ex
a400: 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74  ample, as an alt
a410: 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22  ernative.** to "
a420: 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22 20 69  print *pPager" i
a430: 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64  n gdb:.**.** (gd
a440: 62 29 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20  b) printf "%s", 
a450: 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74  print_pager_stat
a460: 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61  e(pPager).*/.sta
a470: 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f  tic char *print_
a480: 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65  pager_state(Page
a490: 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20  r *p){.  static 
a4a0: 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b  char zRet[1024];
a4b0: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
a4c0: 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65 74 2c  intf(1024, zRet,
a4d0: 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61 6d 65  .      "Filename
a4e0: 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20  :      %s\n".   
a4f0: 20 20 20 22 53 74 61 74 65 3a 20 20 20 20 20 20     "State:      
a500: 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d 25 64     %s errCode=%d
a510: 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a  \n".      "Lock:
a520: 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a            %s\n".
a530: 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d        "Locking m
a540: 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ode:  locking_mo
a550: 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22  de=%s\n".      "
a560: 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a  Journal mode:  j
a570: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e  ournal_mode=%s\n
a580: 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67  ".      "Backing
a590: 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65   store: tempFile
a5a0: 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65  =%d memDb=%d use
a5b0: 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20  Journal=%d\n".  
a5c0: 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20      "Journal:   
a5d0: 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25      journalOff=%
a5e0: 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25  lld journalHdr=%
a5f0: 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22 53 69  lld\n".      "Si
a600: 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64 62 73  ze:          dbs
a610: 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53 69 7a  ize=%d dbOrigSiz
a620: 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a 65 3d  e=%d dbFileSize=
a630: 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d  %d\n".      , p-
a640: 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20  >zFilename.     
a650: 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41   , p->eState==PA
a660: 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20 20 20  GER_OPEN        
a670: 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20      ? "OPEN" :. 
a680: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
a690: 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 20  ==PAGER_READER  
a6a0: 20 20 20 20 20 20 20 20 3f 20 22 52 45 41 44 45          ? "READE
a6b0: 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  R" :.        p->
a6c0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
a6d0: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20  ITER_LOCKED   ? 
a6e0: 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20  "WRITER_LOCKED" 
a6f0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
a700: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
a710: 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52  R_CACHEMOD ? "WR
a720: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a  ITER_CACHEMOD" :
a730: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
a740: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
a750: 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49  _DBMOD    ? "WRI
a760: 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20  TER_DBMOD" :.   
a770: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
a780: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
a790: 49 53 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f  ISHED ? "WRITER_
a7a0: 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20 20 20  FINISHED" :.    
a7b0: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
a7c0: 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20  AGER_ERROR      
a7d0: 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22 20 3a       ? "ERROR" :
a7e0: 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20   "?error?".     
a7f0: 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f   , (int)p->errCo
a800: 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c  de.      , p->eL
a810: 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20  ock==NO_LOCK    
a820: 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22       ? "NO_LOCK"
a830: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
a840: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
a850: 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56 45 44  CK   ? "RESERVED
a860: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
a870: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
a880: 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55 53 49  LOCK  ? "EXCLUSI
a890: 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  VE" :.        p-
a8a0: 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  >eLock==SHARED_L
a8b0: 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41 52 45  OCK     ? "SHARE
a8c0: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
a8d0: 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock==UNKNOWN_L
a8e0: 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57  OCK    ? "UNKNOW
a8f0: 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  N" : "?error?". 
a900: 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73       , p->exclus
a910: 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75  iveMode ? "exclu
a920: 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22  sive" : "normal"
a930: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72  .      , p->jour
a940: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a950: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
a960: 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a  Y   ? "memory" :
a970: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
a980: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a990: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20  OURNALMODE_OFF  
a9a0: 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20      ? "off" :.  
a9b0: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
a9c0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a9d0: 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20  NALMODE_DELETE  
a9e0: 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a 20 20   ? "delete" :.  
a9f0: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
aa00: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
aa10: 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
aa20: 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a 0a 20   ? "persist" :. 
aa30: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
aa40: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
aa50: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
aa60: 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a  E ? "truncate" :
aa70: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
aa80: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
aa90: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20  OURNALMODE_WAL  
aaa0: 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f      ? "wal" : "?
aab0: 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20  error?".      , 
aac0: 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65  (int)p->tempFile
aad0: 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c  , (int)p->memDb,
aae0: 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72   (int)p->useJour
aaf0: 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a  nal.      , p->j
ab00: 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f  ournalOff, p->jo
ab10: 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 2c  urnalHdr.      ,
ab20: 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c   (int)p->dbSize,
ab30: 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53   (int)p->dbOrigS
ab40: 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46  ize, (int)p->dbF
ab50: 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20  ileSize.  );..  
ab60: 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23  return zRet;.}.#
ab70: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
ab80: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69  urn true if it i
ab90: 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77  s necessary to w
aba0: 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69  rite page *pPg i
abb0: 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  nto the sub-jour
abc0: 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e  nal..** A page n
abd0: 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74  eeds to be writt
abe0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  en into the sub-
abf0: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65  journal if there
ac00: 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f   exists one.** o
ac10: 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65  r more open save
ac20: 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68  points for which
ac30: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
ac40: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c  page-number is l
ac50: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
ac60: 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f  l to PagerSavepo
ac70: 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a  int.nOrig, and.*
ac80: 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f  *   * The bit co
ac90: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
aca0: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
acb0: 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20  s not set in.** 
acc0: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
acd0: 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e  nt.pInSavepoint.
ace0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
acf0: 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
ad00: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
ad10: 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e  gno pgno = pPg->
ad20: 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
ad30: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
ad40: 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ger;.  int i;.  
ad50: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
ad60: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
ad70: 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61  ++){.    PagerSa
ad80: 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50  vepoint *p = &pP
ad90: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
ada0: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  [i];.    if( p->
adb0: 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30  nOrig>=pgno && 0
adc0: 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  ==sqlite3BitvecT
add0: 65 73 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f  est(p->pInSavepo
ade0: 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20  int, pgno) ){.  
adf0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
ae00: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
ae10: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
ae20: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
ae30: 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
ae40: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
ae50: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
ae60: 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  nt pageInJournal
ae70: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
ae80: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69  return sqlite3Bi
ae90: 74 76 65 63 54 65 73 74 28 70 50 67 2d 3e 70 50  tvecTest(pPg->pP
aea0: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
aeb0: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a  , pPg->pgno);.}.
aec0: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
aed0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f  -bit integer fro
aee0: 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  m the given file
aef0: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74   descriptor.  St
af00: 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a  ore the integer.
af10: 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20  ** that is read 
af20: 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72  in *pRes.  Retur
af30: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
af40: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64  verything worked
af50: 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  , or an.** error
af60: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
af70: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
af80: 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20  *.** All values 
af90: 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69  are stored on di
afa0: 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e  sk as big-endian
afb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
afc0: 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74  read32bits(sqlit
afd0: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
afe0: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52   offset, u32 *pR
aff0: 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  es){.  unsigned 
b000: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e  char ac[4];.  in
b010: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
b020: 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a  Read(fd, ac, siz
b030: 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29  eof(ac), offset)
b040: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
b050: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
b060: 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  es = sqlite3Get4
b070: 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20  byte(ac);.  }.  
b080: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
b090: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
b0a0: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
b0b0: 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
b0c0: 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79  in big-endian by
b0d0: 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65  te order..*/.#de
b0e0: 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41  fine put32bits(A
b0f0: 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34  ,B)  sqlite3Put4
b100: 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a  byte((u8*)A,B)..
b110: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
b120: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
b130: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
b140: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
b150: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
b160: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  ** on success or
b170: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
b180: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
b190: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
b1a0: 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74  c int write32bit
b1b0: 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
b1c0: 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  fd, i64 offset, 
b1d0: 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72  u32 val){.  char
b1e0: 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62   ac[4];.  put32b
b1f0: 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20  its(ac, val);.  
b200: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
b210: 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c  Write(fd, ac, 4,
b220: 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a   offset);.}../*.
b230: 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ** Unlock the da
b240: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c  tabase file to l
b250: 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63  evel eLock, whic
b260: 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  h must be either
b270: 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53   NO_LOCK.** or S
b280: 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61  HARED_LOCK. Rega
b290: 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
b2a0: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c  r or not the cal
b2b0: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
b2c0: 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65 74 20  * succeeds, set 
b2d0: 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  the Pager.eLock 
b2e0: 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63  variable to matc
b2f0: 68 20 74 68 65 20 28 61 74 74 65 6d 70 74 65 64  h the (attempted
b300: 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  ) new lock..**.*
b310: 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67  * Except, if Pag
b320: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
b330: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
b340: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
b350: 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c  on is.** called,
b360: 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69   do not modify i
b370: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
b380: 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
b390: 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e  fine of .** UNKN
b3a0: 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
b3b0: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74  explanation of t
b3c0: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  his..*/.static i
b3d0: 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62  nt pagerUnlockDb
b3e0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
b3f0: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  int eLock){.  in
b400: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
b410: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  ;..  assert( !pP
b420: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
b430: 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
b440: 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20   eLock==NO_LOCK 
b450: 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  || eLock==SHARED
b460: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
b470: 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  t( eLock!=NO_LOC
b480: 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c  K || pagerUseWal
b490: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
b4a0: 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
b4b0: 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
b4c0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
b4d0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20  Lock>=eLock );. 
b4e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
b4f0: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
b500: 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  fd, eLock);.    
b510: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  if( pPager->eLoc
b520: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
b530: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
b540: 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a  >eLock = eLock;.
b550: 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43      }.    IOTRAC
b560: 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25 64  E(("UNLOCK %p %d
b570: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f  \n", pPager, eLo
b580: 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65 74 75 72  ck)).  }.  retur
b590: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
b5a0: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
b5b0: 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65   file to level e
b5c0: 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74  Lock, which must
b5d0: 20 62 65 20 65 69 74 68 65 72 20 53 48 41 52 45   be either SHARE
b5e0: 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45 52  D_LOCK,.** RESER
b5f0: 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c  VED_LOCK or EXCL
b600: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20 74  USIVE_LOCK. If t
b610: 68 65 20 63 61 6c 6c 65 72 20 69 73 20 73 75 63  he caller is suc
b620: 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65  cessful, set the
b630: 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  .** Pager.eLock 
b640: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
b650: 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74  new locking stat
b660: 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  e. .**.** Except
b670: 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b  , if Pager.eLock
b680: 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   is set to UNKNO
b690: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69  WN_LOCK when thi
b6a0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a  s function is .*
b6b0: 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74  * called, do not
b6c0: 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 6c 65 73   modify it unles
b6d0: 73 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e  s the new lockin
b6e0: 67 20 73 74 61 74 65 20 69 73 20 45 58 43 4c 55  g state is EXCLU
b6f0: 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53  SIVE_LOCK. .** S
b700: 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  ee the comment a
b710: 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65  bove the #define
b720: 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   of UNKNOWN_LOCK
b730: 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
b740: 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73 2e  ion .** of this.
b750: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
b760: 61 67 65 72 4c 6f 63 6b 44 62 28 50 61 67 65 72  agerLockDb(Pager
b770: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c   *pPager, int eL
b780: 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
b790: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
b7a0: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53 48  ssert( eLock==SH
b7b0: 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  ARED_LOCK || eLo
b7c0: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
b7d0: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c  K || eLock==EXCL
b7e0: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
b7f0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  if( pPager->eLoc
b800: 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67 65  k<eLock || pPage
b810: 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57  r->eLock==UNKNOW
b820: 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63  N_LOCK ){.    rc
b830: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
b840: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f  (pPager->fd, eLo
b850: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ck);.    if( rc=
b860: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70  =SQLITE_OK && (p
b870: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  Pager->eLock!=UN
b880: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63  KNOWN_LOCK||eLoc
b890: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
b8a0: 4b 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  K) ){.      pPag
b8b0: 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  er->eLock = eLoc
b8c0: 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  k;.      IOTRACE
b8d0: 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22  (("LOCK %p %d\n"
b8e0: 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29  , pPager, eLock)
b8f0: 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ).    }.  }.  re
b900: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
b910: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
b920: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68  determines wheth
b930: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74  er or not the at
b940: 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
b950: 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62  ization.** can b
b960: 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69 73  e used with this
b970: 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69   pager. The opti
b980: 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20  mization can be 
b990: 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  used if:.**.**  
b9a0: 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (a) the value re
b9b0: 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69  turned by OsDevi
b9c0: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
b9d0: 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74 68  s() indicates th
b9e0: 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74  at.**      a dat
b9f0: 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20 62  abase page may b
ba00: 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63  e written atomic
ba10: 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62  ally, and.**  (b
ba20: 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  ) the value retu
ba30: 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72  rned by OsSector
ba40: 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74  Size() is less t
ba50: 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20  han or equal.** 
ba60: 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67 65       to the page
ba70: 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   size..**.** The
ba80: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
ba90: 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e 61   also always ena
baa0: 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61  bled for tempora
bab0: 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69 73 0a  ry files. It is.
bac0: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 63  ** an error to c
bad0: 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
bae0: 6e 20 69 66 20 70 50 61 67 65 72 20 69 73 20 6f  n if pPager is o
baf0: 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d  pened on an in-m
bb00: 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73  emory.** databas
bb10: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
bb20: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
bb30: 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20 69  not be used, 0 i
bb40: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69  s returned. If i
bb50: 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a  t can be used,.*
bb60: 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  * then the value
bb70: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
bb80: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
bb90: 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69  rnal file when i
bba0: 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f  t.** contains ro
bbb0: 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20  llback data for 
bbc0: 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65  exactly one page
bbd0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
bbe0: 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
bbf0: 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e  _WRITE.static in
bc00: 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  t jrnlBufferSize
bc10: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
bc20: 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
bc30: 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  B );.  if( !pPag
bc40: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
bc50: 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20      int dc;     
bc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc70: 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20        /* Device 
bc80: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
bc90: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 63 74  */.    int nSect
bca0: 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  or;             
bcb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74           /* Sect
bcc0: 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69  or size */.    i
bcd0: 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20 20  nt szPage;      
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcf0: 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f   /* Page size */
bd00: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ..    assert( is
bd10: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
bd20: 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c   );.    dc = sql
bd30: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
bd40: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
bd50: 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65  er->fd);.    nSe
bd60: 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73  ctor = pPager->s
bd70: 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73  ectorSize;.    s
bd80: 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  zPage = pPager->
bd90: 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61  pageSize;..    a
bda0: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
bdb0: 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
bdc0: 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73 73  12>>8));.    ass
bdd0: 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
bde0: 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
bdf0: 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66 28  36>>8));.    if(
be00: 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45 5f   0==(dc&(SQLITE_
be10: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a  IOCAP_ATOMIC|(sz
be20: 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65  Page>>8)) || nSe
be30: 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a  ctor>szPage) ){.
be40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
be50: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
be60: 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  urn JOURNAL_HDR_
be70: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55  SZ(pPager) + JOU
be80: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
be90: 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  r);.}.#endif../*
bea0: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48  .** If SQLITE_CH
beb0: 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66  ECK_PAGES is def
bec0: 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20  ined then we do 
bed0: 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63  some sanity chec
bee0: 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63  king.** on the c
bef0: 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73  ache using a has
bf00: 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  h function.  Thi
bf10: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  s is used for te
bf20: 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62  sting.** and deb
bf30: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
bf40: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
bf50: 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20  ECK_PAGES./*.** 
bf60: 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20  Return a 32-bit 
bf70: 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65  hash of the page
bf80: 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e   data for pPage.
bf90: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
bfa0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e  ager_datahash(in
bfb0: 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65  t nByte, unsigne
bfc0: 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a  d char *pData){.
bfd0: 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a    u32 hash = 0;.
bfe0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
bff0: 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b  =0; i<nByte; i++
c000: 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68  ){.    hash = (h
c010: 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74  ash*1039) + pDat
c020: 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  a[i];.  }.  retu
c030: 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69  rn hash;.}.stati
c040: 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65  c u32 pager_page
c050: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
c060: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67  e){.  return pag
c070: 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
c080: 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e->pPager->pageS
c090: 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ize, (unsigned c
c0a0: 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61  har *)pPage->pDa
c0b0: 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ta);.}.static vo
c0c0: 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67  id pager_set_pag
c0d0: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
c0e0: 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61  ge){.  pPage->pa
c0f0: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
c100: 61 67 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a  agehash(pPage);.
c110: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45  }../*.** The CHE
c120: 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61  CK_PAGE macro ta
c130: 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20  kes a PgHdr* as 
c140: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  an argument. If 
c150: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
c160: 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  ES.** is defined
c170: 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20  , and NDEBUG is 
c180: 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20  not defined, an 
c190: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
c1a0: 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61  nt checks.** tha
c1b0: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69  t the page is ei
c1c0: 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74  ther dirty or st
c1d0: 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20  ill matches the 
c1e0: 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d  calculated page-
c1f0: 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  hash..*/.#define
c200: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63   CHECK_PAGE(x) c
c210: 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74  heckPage(x).stat
c220: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67  ic void checkPag
c230: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
c240: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
c250: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
c260: 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61  assert( !pPg->pa
c270: 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72  geHash || pPager
c280: 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20  ->errCode.      
c290: 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  || (pPg->flags&P
c2a0: 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70  GHDR_DIRTY) || p
c2b0: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
c2c0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
c2d0: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
c2e0: 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61  efine pager_data
c2f0: 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65  hash(X,Y)  0.#de
c300: 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68  fine pager_pageh
c310: 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e  ash(X)  0.#defin
c320: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a  e CHECK_PAGE(x).
c330: 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54  #endif  /* SQLIT
c340: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f  E_CHECK_PAGES */
c350: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
c360: 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  s is called the 
c370: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
c380: 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75   pager pPager mu
c390: 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54  st be open..** T
c3a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
c3b0: 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 61 20  empts to read a 
c3c0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
c3d0: 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  ile name from th
c3e0: 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  e .** end of the
c3f0: 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75   file and, if su
c400: 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73  ccessful, copies
c410: 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20   it into memory 
c420: 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20  supplied .** by 
c430: 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20  the caller. See 
c440: 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77  comments above w
c450: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
c460: 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d  l() for the form
c470: 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74  at.** used to st
c480: 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ore a master jou
c490: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61  rnal file name a
c4a0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
c4b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
c4c0: 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20  ** zMaster must 
c4d0: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
c4e0: 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d  r of at least nM
c4f0: 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f  aster bytes allo
c500: 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  cated by.** the 
c510: 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f  caller. This sho
c520: 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76  uld be sqlite3_v
c530: 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20  fs.mxPathname+1 
c540: 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65  (to ensure there
c550: 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70   is.** enough sp
c560: 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ace to write the
c570: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c580: 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61  name). If the ma
c590: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
c5a0: 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  name in the jour
c5b0: 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68  nal is longer th
c5c0: 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73  an nMaster bytes
c5d0: 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a   (including a.**
c5e0: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
c5f0: 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 68  , then this is h
c600: 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20  andled as if no 
c610: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
c620: 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73  ame.** were pres
c630: 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ent in the journ
c640: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  al..**.** If a m
c650: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
c660: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
c670: 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  nt at the end of
c680: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
c690: 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73  file, then it is
c6a0: 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
c6b0: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
c6c0: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41  to by zMaster. A
c6d0: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
c6e0: 6f 72 20 62 79 74 65 20 69 73 20 61 70 70 65 6e  or byte is appen
c6f0: 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  ded to the buffe
c700: 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  r following the 
c710: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
c720: 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a  l file name..**.
c730: 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65 74 65  ** If it is dete
c740: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d  rmined that no m
c750: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
c760: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
c770: 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30  nt .** zMaster[0
c780: 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  ] is set to 0 an
c790: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
c7a0: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rned..**.** If a
c7b0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
c7c0: 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f  hile reading fro
c7d0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
c7e0: 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a  le, an SQLite.**
c7f0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
c800: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
c810: 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65  ic int readMaste
c820: 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33  rJournal(sqlite3
c830: 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68  _file *pJrnl, ch
c840: 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32  ar *zMaster, u32
c850: 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74   nMaster){.  int
c860: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
c870: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
c880: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20  n code */.  u32 
c890: 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  len;            
c8a0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
c8b0: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73   in bytes of mas
c8c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
c8d0: 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20   */.  i64 szJ;  
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8f0: 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69   /* Total size i
c900: 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e  n bytes of journ
c910: 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f  al file pJrnl */
c920: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
c930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c940: 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c   MJ checksum val
c950: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75  ue read from jou
c960: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b  rnal */.  u32 u;
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c980: 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
c990: 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
c9a0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
c9b0: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a   aMagic[8];   /*
c9c0: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
c9d0: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
c9e0: 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b  er */.  zMaster[
c9f0: 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66  0] = '\0';..  if
ca00: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
ca10: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
ca20: 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a  Size(pJrnl, &szJ
ca30: 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a  )).   || szJ<16.
ca40: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
ca50: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
ca60: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c  s(pJrnl, szJ-16,
ca70: 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65   &len)).   || le
ca80: 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c  n>=nMaster .   |
ca90: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
caa0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
cab0: 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b  rnl, szJ-12, &ck
cac0: 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  sum)).   || SQLI
cad0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
cae0: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
caf0: 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a  , aMagic, 8, szJ
cb00: 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d  -8)).   || memcm
cb10: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
cb20: 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20 20 7c  alMagic, 8).   |
cb30: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
cb40: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
cb50: 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c  (pJrnl, zMaster,
cb60: 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e   len, szJ-16-len
cb70: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
cb80: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
cb90: 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63   See if the chec
cba0: 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65  ksum matches the
cbb0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
cbc0: 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d  name */.  for(u=
cbd0: 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a  0; u<len; u++){.
cbe0: 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61      cksum -= zMa
cbf0: 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69  ster[u];.  }.  i
cc00: 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  f( cksum ){.    
cc10: 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 73  /* If the checks
cc20: 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75  um doesn't add u
cc30: 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d  p, then one or m
cc40: 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20  ore of the disk 
cc50: 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63  sectors.    ** c
cc60: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61  ontaining the ma
cc70: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
cc80: 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74  ename is corrupt
cc90: 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20  ed. This means. 
cca0: 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79     ** definitely
ccb0: 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a   roll back, so j
ccc0: 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
ccd0: 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20  E_OK and report 
cce0: 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d  a (nul).    ** m
ccf0: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
cd00: 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20  lename..    */. 
cd10: 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a     len = 0;.  }.
cd20: 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d    zMaster[len] =
cd30: 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74   '\0';.   .  ret
cd40: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
cd50: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
cd60: 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65  he offset of the
cd70: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
cd80: 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61 74 65   at or immediate
cd90: 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  ly .** following
cda0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 50   the value in pP
cdb0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
cdc0: 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73 65 63  , assuming a sec
cdd0: 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  tor .** size of 
cde0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
cdf0: 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  ze bytes..**.** 
ce00: 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72  i.e for a sector
ce10: 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a   size of 512:.**
ce20: 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75 72  .**   Pager.jour
ce30: 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20 20 20  nalOff          
ce40: 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  Return value.** 
ce50: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
ce60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30  ---------.**   0
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce90: 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20           0.**   
cea0: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
ceb0: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
cec0: 20 20 20 31 30 30 20 20 20 20 20 20 20 20 20 20     100          
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
cee0: 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20 20 20  .**   2000      
cef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf00: 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74  2048.** .*/.stat
cf10: 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64  ic i64 journalHd
cf20: 72 4f 66 66 73 65 74 28 50 61 67 65 72 20 2a 70  rOffset(Pager *p
cf30: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66  Pager){.  i64 of
cf40: 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20  fset = 0;.  i64 
cf50: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  c = pPager->jour
cf60: 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20  nalOff;.  if( c 
cf70: 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  ){.    offset = 
cf80: 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48  ((c-1)/JOURNAL_H
cf90: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20  DR_SZ(pPager) + 
cfa0: 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  1) * JOURNAL_HDR
cfb0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
cfc0: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
cfd0: 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  t%JOURNAL_HDR_SZ
cfe0: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
cff0: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
d000: 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =c );.  assert( 
d010: 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e  (offset-c)<JOURN
d020: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
d030: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66  ) );.  return of
d040: 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  fset;.}../*.** T
d050: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d060: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
d070: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
d080: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
d090: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
d0a0: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
d0b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
d0c0: 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69 74 74  s not been writt
d0d0: 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20  en to.** within 
d0e0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
d0f0: 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66  saction (i.e. if
d100: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
d110: 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f==0)..**.** If 
d120: 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20 6e 6f  doTruncate is no
d130: 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 50 61  n-zero or the Pa
d140: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
d150: 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20 69 73  imit variable is
d160: 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20 74 68  .** set to 0, th
d170: 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  en truncate the 
d180: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
d190: 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69  zero bytes in si
d1a0: 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  ze. Otherwise,.*
d1b0: 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d 62 79  * zero the 28-by
d1c0: 74 65 20 68 65 61 64 65 72 20 61 74 20 74 68 65  te header at the
d1d0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
d1e0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65  urnal file. In e
d1f0: 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20  ither case, .** 
d200: 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
d210: 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  not in no-sync m
d220: 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  ode, sync the jo
d230: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64  urnal file immed
d240: 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72  iately .** after
d250: 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72 75 6e   writing or trun
d260: 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a  cating it..**.**
d270: 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   If Pager.journa
d280: 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20 73 65  lSizeLimit is se
d290: 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65 2c  t to a positive,
d2a0: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c   non-zero value,
d2b0: 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   and.** followin
d2c0: 67 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e  g the truncation
d2d0: 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65 73 63   or zeroing desc
d2e0: 72 69 62 65 64 20 61 62 6f 76 65 20 74 68 65 20  ribed above the 
d2f0: 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  size of the .** 
d300: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
d310: 62 79 74 65 73 20 69 73 20 6c 61 72 67 65 72 20  bytes is larger 
d320: 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c  than this value,
d330: 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74   then truncate t
d340: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
d350: 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72  le to Pager.jour
d360: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79 74  nalSizeLimit byt
d370: 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  es. The journal 
d380: 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  file does.** not
d390: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79 6e 63   need to be sync
d3a0: 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ed following thi
d3b0: 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  s operation..**.
d3c0: 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
d3d0: 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e 64 6f  r occurs, abando
d3e0: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64  n processing and
d3f0: 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f 20 65   return the IO e
d400: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74  rror code..** Ot
d410: 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
d420: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
d430: 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75  atic int zeroJou
d440: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
d450: 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75  Pager, int doTru
d460: 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63  ncate){.  int rc
d470: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
d480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d490: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
d4a0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
d4b0: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
d4c0: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
d4d0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
d4e0: 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63  rnalOff ){.    c
d4f0: 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20  onst i64 iLimit 
d500: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
d510: 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f  lSizeLimit;    /
d520: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
d530: 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54   jsl */..    IOT
d540: 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20  RACE(("JZEROHDR 
d550: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
d560: 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61      if( doTrunca
d570: 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20  te || iLimit==0 
d580: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
d590: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
d5a0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
d5b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d5c0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
d5d0: 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20  har zeroHdr[28] 
d5e0: 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20  = {0};.      rc 
d5f0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
d600: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65  (pPager->jfd, ze
d610: 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65  roHdr, sizeof(ze
d620: 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20  roHdr), 0);.    
d630: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
d640: 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67  LITE_OK && !pPag
d650: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
d660: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d670: 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
d680: 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  fd, SQLITE_SYNC_
d690: 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d  DATAONLY|pPager-
d6a0: 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
d6b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
d6c0: 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74 72  his point the tr
d6d0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
d6e0: 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20 77  mitted but the w
d6f0: 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a  rite lock .    *
d700: 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20  * is still held 
d710: 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  on the file. If 
d720: 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65 20  there is a size 
d730: 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64  limit configured
d740: 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65   for .    ** the
d750: 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72   persistent jour
d760: 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  nal and the jour
d770: 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74  nal file current
d780: 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65  ly consumes more
d790: 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74 68  .    ** space th
d7a0: 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61 6c  an that limit al
d7b0: 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63 61  lows for, trunca
d7c0: 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72 65  te it now. There
d7d0: 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20   is no need.    
d7e0: 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20 66  ** to sync the f
d7f0: 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ile following th
d800: 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20  is operation..  
d810: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
d820: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c  =SQLITE_OK && iL
d830: 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  imit>0 ){.      
d840: 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72 63  i64 sz;.      rc
d850: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
d860: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
d870: 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66  , &sz);.      if
d880: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d890: 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a  && sz>iLimit ){.
d8a0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
d8b0: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
d8c0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d  Pager->jfd, iLim
d8d0: 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  it);.      }.   
d8e0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
d8f0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
d900: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
d910: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
d920: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
d930: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
d940: 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55  l.** header (JOU
d950: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
d960: 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  s) is written in
d970: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
d980: 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75  ile at the.** cu
d990: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a  rrent location..
d9a0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74  **.** The format
d9b0: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
d9c0: 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f   header is as fo
d9d0: 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79  llows:.** - 8 by
d9e0: 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74  tes: Magic ident
d9f0: 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  ifying journal f
da00: 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  ormat..** - 4 by
da10: 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72  tes: Number of r
da20: 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61  ecords in journa
da30: 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63  l, or -1 no-sync
da40: 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20   mode is on..** 
da50: 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f  - 4 bytes: Rando
da60: 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f  m number used fo
da70: 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20  r page hash..** 
da80: 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69  - 4 bytes: Initi
da90: 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65  al database page
daa0: 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62   count..** - 4 b
dab0: 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a  ytes: Sector siz
dac0: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72  e used by the pr
dad0: 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65  ocess that wrote
dae0: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a   this journal..*
daf0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61 74  * - 4 bytes: Dat
db00: 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e  abase page size.
db10: 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64  .** .** Followed
db20: 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   by (JOURNAL_HDR
db30: 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20  _SZ - 28) bytes 
db40: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e  of unused space.
db50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
db60: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50  riteJournalHdr(P
db70: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
db80: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
db90: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
dba0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
dbb0: 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ode */.  char *z
dbc0: 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d  Header = pPager-
dbd0: 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20  >pTmpSpace;  /* 
dbe0: 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65 20  Temporary space 
dbf0: 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68 65  used to build he
dc00: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48  ader */.  u32 nH
dc10: 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  eader = pPager->
dc20: 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a  pageSize;     /*
dc30: 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
dc40: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 48  pointed to by zH
dc50: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
dc60: 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dc80: 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64 65  * Bytes of heade
dc90: 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65 6e  r sector written
dca0: 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20   */.  int ii;   
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
dcd0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
dce0: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
dcf0: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20  Pager->jfd) );  
dd00: 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66      /* Journal f
dd10: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
dd20: 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61  . */..  if( nHea
dd30: 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  der>JOURNAL_HDR_
dd40: 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  SZ(pPager) ){.  
dd50: 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52    nHeader = JOUR
dd60: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
dd70: 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r);.  }..  /* If
dd80: 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
dd90: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64  e savepoints and
dda0: 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65 72   any of them wer
ddb0: 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a 20  e created .  ** 
ddc0: 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72  since the most r
ddd0: 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65  ecent journal he
dde0: 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e  ader was written
ddf0: 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20 20  , update the .  
de00: 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  ** PagerSavepoin
de10: 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65  t.iHdrOffset fie
de20: 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20  lds now..  */.  
de30: 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
de40: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
de50: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   ii++){.    if( 
de60: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
de70: 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65  nt[ii].iHdrOffse
de80: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  t==0 ){.      pP
de90: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
dea0: 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20  [ii].iHdrOffset 
deb0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
dec0: 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lOff;.    }.  }.
ded0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
dee0: 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
def0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
df00: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
df10: 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20  ager);..  /* .  
df20: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  ** Write the nRe
df30: 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75  c Field - the nu
df40: 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
df50: 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77  ords that follow
df60: 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e   this.  ** journ
df70: 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61  al header. Norma
df80: 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69  lly, zero is wri
df90: 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c  tten to this val
dfa0: 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ue at this time.
dfb0: 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20  .  ** After the 
dfc0: 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65  records are adde
dfd0: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
dfe0: 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61   (and the journa
dff0: 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20  l synced, .  ** 
e000: 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  if in full-sync 
e010: 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20  mode), the zero 
e020: 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  is overwritten w
e030: 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d  ith the true num
e040: 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f  ber.  ** of reco
e050: 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75  rds (see syncJou
e060: 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20  rnal())..  **.  
e070: 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65  ** A faster alte
e080: 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72  rnative is to wr
e090: 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74  ite 0xFFFFFFFF t
e0a0: 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  o the nRec field
e0b0: 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64  . When.  ** read
e0c0: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
e0d0: 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73  this value tells
e0e0: 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d   SQLite to assum
e0f0: 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20  e that the.  ** 
e100: 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
e110: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
e120: 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  s valid page rec
e130: 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d  ords. This assum
e140: 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61  ption.  ** is da
e150: 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61  ngerous, as if a
e160: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
e170: 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67  d whilst writing
e180: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
e190: 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79    ** file it may
e1a0: 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61   contain some ga
e1b0: 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72  rbage data. Ther
e1c0: 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72  e are two scenar
e1d0: 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74  ios.  ** where t
e1e0: 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20  his risk can be 
e1f0: 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20  ignored:.  **.  
e200: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
e210: 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73  pager is in no-s
e220: 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70  ync mode. Corrup
e230: 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20  tion can follow 
e240: 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72  a.  **     power
e250: 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73   failure in this
e260: 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20   case anyway..  
e270: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
e280: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
e290: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c  P_SAFE_APPEND fl
e2a0: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20  ag is set. This 
e2b0: 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20  guarantees.  ** 
e2c0: 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65      that garbage
e2d0: 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61   data is never a
e2e0: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a  ppended to the j
e2f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a  ournal file..  *
e300: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
e310: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
e320: 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  | pPager->noSync
e330: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
e340: 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61  ->noSync || (pPa
e350: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
e360: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
e370: 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c  ODE_MEMORY).   |
e380: 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  | (sqlite3OsDevi
e390: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
e3a0: 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51  s(pPager->fd)&SQ
e3b0: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
e3c0: 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20  APPEND) .  ){.  
e3d0: 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72    memcpy(zHeader
e3e0: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
e3f0: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
e400: 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75 74  Magic));.    put
e410: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
e420: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e430: 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66  agic)], 0xffffff
e440: 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ff);.  }else{.  
e450: 20 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65 72    memset(zHeader
e460: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  , 0, sizeof(aJou
e470: 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20  rnalMagic)+4);. 
e480: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e   }..  /* The ran
e490: 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69  dom check-hash i
e4a0: 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20  nitialiser */ . 
e4b0: 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
e4c0: 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65  ess(sizeof(pPage
e4d0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26  r->cksumInit), &
e4e0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
e4f0: 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  t);.  put32bits(
e500: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
e510: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
e520: 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  ], pPager->cksum
e530: 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Init);.  /* The 
e540: 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  initial database
e550: 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32   size */.  put32
e560: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
e570: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
e580: 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+8], pPager->
e590: 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f  dbOrigSize);.  /
e5a0: 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65  * The assumed se
e5b0: 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ctor size for th
e5c0: 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20  is process */.  
e5d0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
e5e0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
e5f0: 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50  alMagic)+12], pP
e600: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
e610: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61 67  );..  /* The pag
e620: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
e630: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
e640: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
e650: 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65 72  gic)+16], pPager
e660: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
e670: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20  /* Initializing 
e680: 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20  the tail of the 
e690: 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e 65  buffer is not ne
e6a0: 63 65 73 73 61 72 79 2e 20 20 45 76 65 72 79 74  cessary.  Everyt
e6b0: 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20  hing.  ** works 
e6c0: 66 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c 6c  find if the foll
e6d0: 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20 69  owing memset() i
e6e0: 73 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74 20  s omitted.  But 
e6f0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a  initializing.  *
e700: 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72 65  * the memory pre
e710: 76 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20 66  vents valgrind f
e720: 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c  rom complaining,
e730: 20 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c 69   so we are willi
e740: 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20  ng to.  ** take 
e750: 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  the performance 
e760: 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  hit..  */.  mems
e770: 65 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  et(&zHeader[size
e780: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
e790: 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20  )+20], 0,.      
e7a0: 20 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a 65     nHeader-(size
e7b0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
e7c0: 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e  )+20));..  /* In
e7d0: 20 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20 6f   theory, it is o
e7e0: 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74 6f  nly necessary to
e7f0: 20 77 72 69 74 65 20 74 68 65 20 32 38 20 62 79   write the 28 by
e800: 74 65 73 20 74 68 61 74 20 74 68 65 20 0a 20 20  tes that the .  
e810: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
e820: 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68  r consumes to th
e830: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
e840: 65 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d  ere. Then increm
e850: 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ent the .  ** Pa
e860: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76  ger.journalOff v
e870: 61 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e  ariable by JOURN
e880: 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68 61  AL_HDR_SZ so tha
e890: 74 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a  t the next .  **
e8a0: 20 72 65 63 6f 72 64 20 69 73 20 77 72 69 74 74   record is writt
e8b0: 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  en to the follow
e8c0: 69 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61 76  ing sector (leav
e8d0: 69 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68 65  ing a gap in the
e8e0: 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20   file.  ** that 
e8f0: 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69 74  will be implicit
e900: 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79 20  ly filled in by 
e910: 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20  the OS)..  **.  
e920: 2a 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68 61  ** However it ha
e930: 73 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72 65  s been discovere
e940: 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73  d that on some s
e950: 79 73 74 65 6d 73 20 74 68 69 73 20 70 61 74 74  ystems this patt
e960: 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65  ern can .  ** be
e970: 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 73   significantly s
e980: 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74 69  lower than conti
e990: 67 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67 20  guously writing 
e9a0: 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65  data to the file
e9b0: 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74  ,.  ** even if t
e9c0: 68 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69 63  hat means explic
e9d0: 69 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74  itly writing dat
e9e0: 61 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f  a to the block o
e9f0: 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c  f .  ** (JOURNAL
ea00: 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79  _HDR_SZ - 28) by
ea10: 74 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f  tes that will no
ea20: 74 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74 68  t be used. So th
ea30: 61 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a 20  at is what.  ** 
ea40: 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20  is done. .  **. 
ea50: 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73 20   ** The loop is 
ea60: 72 65 71 75 69 72 65 64 20 68 65 72 65 20 69 6e  required here in
ea70: 20 63 61 73 65 20 74 68 65 20 73 65 63 74 6f 72   case the sector
ea80: 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20  -size is larger 
ea90: 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64  than the .  ** d
eaa0: 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a  atabase page siz
eab0: 65 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48 65  e. Since the zHe
eac0: 61 64 65 72 20 62 75 66 66 65 72 20 69 73 20 6f  ader buffer is o
ead0: 6e 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53 69  nly Pager.pageSi
eae0: 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e  ze.  ** bytes in
eaf0: 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e   size, more than
eb00: 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   one call to sql
eb10: 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d 61  ite3OsWrite() ma
eb20: 79 20 62 65 20 72 65 71 75 69 72 65 64 0a 20 20  y be required.  
eb30: 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  ** to populate t
eb40: 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
eb50: 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e  l header sector.
eb60: 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72  .  */ .  for(nWr
eb70: 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  ite=0; rc==SQLIT
eb80: 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55  E_OK&&nWrite<JOU
eb90: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
eba0: 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65  er); nWrite+=nHe
ebb0: 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41  ader){.    IOTRA
ebc0: 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
ebd0: 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
ebe0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ebf0: 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20  Hdr, nHeader)). 
ec00: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
ec10: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
ec20: 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65  fd, zHeader, nHe
ec30: 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ader, pPager->jo
ec40: 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61  urnalOff);.    a
ec50: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
ec60: 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61  ournalHdr <= pPa
ec70: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
ec80: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  );.    pPager->j
ec90: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65  ournalOff += nHe
eca0: 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ader;.  }..  ret
ecb0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
ecc0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
ecd0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
ece0: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
ecf0: 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65  ed. A journal he
ed00: 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f  ader file.** (JO
ed10: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
ed20: 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d  es) is read from
ed30: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
ed40: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75  ation in the jou
ed50: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68  rnal.** file. Th
ed60: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
ed70: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
ed80: 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20  l file is given 
ed90: 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f  by.** pPager->jo
eda0: 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f  urnalOff. See co
edb0: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e  mments above fun
edc0: 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e  ction writeJourn
edd0: 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61  alHdr() for.** a
ede0: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
edf0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
ee00: 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  er format..**.**
ee10: 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69   If the header i
ee20: 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75  s read successfu
ee30: 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20 73  lly, *pNRec is s
ee40: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
ee50: 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f   of.** page reco
ee60: 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  rds following th
ee70: 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 70  is header and *p
ee80: 44 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  DbSize is set to
ee90: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
eea0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66  .** database bef
eeb0: 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
eec0: 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61  ion began, in pa
eed0: 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65  ges. Also, pPage
eee0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20  r->cksumInit.** 
eef0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
ef00: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
ef10: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
ef20: 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  . SQLITE_OK is r
ef30: 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68  eturned.** in th
ef40: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
ef50: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
ef60: 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72  ader file appear
ef70: 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65  s to be corrupte
ef80: 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
ef90: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e  s.** returned an
efa0: 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50 44  d *pNRec and *PD
efb0: 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66 69  bSize are undefi
efc0: 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c  ned.  If JOURNAL
efd0: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a  _HDR_SZ bytes.**
efe0: 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20   cannot be read 
eff0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
f000: 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63   file an error c
f010: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
f020: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
f030: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20  eadJournalHdr(. 
f040: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
f050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f060: 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
f070: 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20  .  int isHot,.  
f080: 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c  i64 journalSize,
f090: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f0a0: 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 6e  Size of the open
f0b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
f0c0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
f0d0: 2a 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20 20  *pNRec,         
f0e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
f0f0: 20 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   Value read from
f100: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
f110: 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a  */.  u32 *pDbSiz
f120: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
f130: 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20    /* OUT: Value 
f140: 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  of original data
f150: 62 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64 20  base size field 
f160: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f180: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
f190: 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ode */.  unsigne
f1a0: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
f1b0: 3b 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65  ;     /* A buffe
f1c0: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
f1d0: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
f1e0: 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20  i64 iHdrOff;    
f1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f200: 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61  Offset of journa
f210: 6c 20 68 65 61 64 65 72 20 62 65 69 6e 67 20 72  l header being r
f220: 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ead */..  assert
f230: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
f240: 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a  >jfd) );      /*
f250: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   Journal file mu
f260: 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a  st be open. */..
f270: 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61 67    /* Advance Pag
f280: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f  er.journalOff to
f290: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
f2a0: 65 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20 49  e next sector. I
f2b0: 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e  f the.  ** journ
f2c0: 61 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73  al file is too s
f2d0: 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20 74  mall for there t
f2e0: 6f 20 62 65 20 61 20 68 65 61 64 65 72 20 73 74  o be a header st
f2f0: 6f 72 65 64 20 61 74 20 74 68 69 73 0a 20 20 2a  ored at this.  *
f300: 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20  * point, return 
f310: 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a  SQLITE_DONE..  *
f320: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  /.  pPager->jour
f330: 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c  nalOff = journal
f340: 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
f350: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
f360: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52  >journalOff+JOUR
f370: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
f380: 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65  r) > journalSize
f390: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
f3a0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
f3b0: 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67    iHdrOff = pPag
f3c0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
f3d0: 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68  .  /* Read in th
f3e0: 65 20 66 69 72 73 74 20 38 20 62 79 74 65 73 20  e first 8 bytes 
f3f0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
f400: 65 61 64 65 72 2e 20 49 66 20 74 68 65 79 20 64  eader. If they d
f410: 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a  o not match.  **
f420: 20 74 68 65 20 20 6d 61 67 69 63 20 73 74 72 69   the  magic stri
f430: 6e 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65 20  ng found at the 
f440: 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a 6f  start of each jo
f450: 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72 65  urnal header, re
f460: 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45  turn.  ** SQLITE
f470: 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20  _DONE. If an IO 
f480: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
f490: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
f4a0: 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  de. Otherwise,. 
f4b0: 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a   ** proceed..  *
f4c0: 2f 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c 7c  /.  if( isHot ||
f4d0: 20 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65 72   iHdrOff!=pPager
f4e0: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a  ->journalHdr ){.
f4f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f500: 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
f510: 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65  fd, aMagic, size
f520: 6f 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64 72  of(aMagic), iHdr
f530: 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Off);.    if( rc
f540: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
f550: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
f560: 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  f( memcmp(aMagic
f570: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
f580: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29   sizeof(aMagic))
f590: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
f5a0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
f5b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
f5c0: 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20   Read the first 
f5d0: 74 68 72 65 65 20 33 32 2d 62 69 74 20 66 69 65  three 32-bit fie
f5e0: 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  lds of the journ
f5f0: 61 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20 6e  al header: The n
f600: 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20  Rec.  ** field, 
f610: 74 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69  the checksum-ini
f620: 74 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68 65  tializer and the
f630: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   database size a
f640: 74 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a  t the start.  **
f650: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
f660: 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20 65  ion. Return an e
f670: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
f680: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
f690: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  ..  */.  if( SQL
f6a0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
f6b0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
f6c0: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c  >jfd, iHdrOff+8,
f6d0: 20 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20 53   pNRec)).   || S
f6e0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
f6f0: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
f700: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
f710: 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  12, &pPager->cks
f720: 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53  umInit)).   || S
f730: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
f740: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
f750: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
f760: 31 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20 20  16, pDbSize)).  
f770: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
f780: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
f790: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
f7a0: 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50  =0 ){.    u32 iP
f7b0: 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ageSize;        
f7c0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73         /* Page-s
f7d0: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75  ize field of jou
f7e0: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20  rnal header */. 
f7f0: 20 20 20 75 33 32 20 69 53 65 63 74 6f 72 53 69     u32 iSectorSi
f800: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
f810: 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 66  /* Sector-size f
f820: 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ield of journal 
f830: 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f  header */..    /
f840: 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d  * Read the page-
f850: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
f860: 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  size journal hea
f870: 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20  der fields. */. 
f880: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
f890: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
f8a0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
f8b0: 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65  iHdrOff+20, &iSe
f8c0: 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20  ctorSize)).     
f8d0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
f8e0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
f8f0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
f900: 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69  Off+24, &iPageSi
f910: 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ze)).    ){.    
f920: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
f930: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
f940: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
f950: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
f960: 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
f970: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a  tor-size fields.
f980: 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69      ** are withi
f990: 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27  n range. To be '
f9a0: 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20  in range', both 
f9b0: 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62  values need to b
f9c0: 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a  e a power.    **
f9d0: 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20   of two greater 
f9e0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
f9f0: 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20   512 or 32, and 
fa00: 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e  not greater than
fa10: 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72   their .    ** r
fa20: 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c  espective compil
fa30: 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c  e time maximum l
fa40: 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  imits..    */.  
fa50: 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c    if( iPageSize<
fa60: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
fa70: 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53       || iSectorS
fa80: 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69  ize<32.     || i
fa90: 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  PageSize>SQLITE_
faa0: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c  MAX_PAGE_SIZE ||
fab0: 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58   iSectorSize>MAX
fac0: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20  _SECTOR_SIZE.   
fad0: 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65    || ((iPageSize
fae0: 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d  -1)&iPageSize)!=
faf0: 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72  0   || ((iSector
fb00: 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53  Size-1)&iSectorS
fb10: 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  ize)!=0 .    ){.
fb20: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
fb30: 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65 2d  either the page-
fb40: 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73  size or sector-s
fb50: 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ize in the journ
fb60: 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20  al-header is .  
fb70: 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20      ** invalid, 
fb80: 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
fb90: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65 20   that wrote the 
fba0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d  journal-header m
fbb0: 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20 20  ust have .      
fbc0: 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f 72  ** crashed befor
fbd0: 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61 73  e the header was
fbe0: 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73   synced. In this
fbf0: 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64 69   case stop readi
fc00: 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ng .      ** the
fc10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
fc20: 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  re..      */.   
fc30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fc40: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
fc50: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
fc60: 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74  page-size to mat
fc70: 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ch the value rea
fc80: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
fc90: 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20  al. .    ** Use 
fca0: 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63  a testcase() mac
fcb0: 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ro to make sure 
fcc0: 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  that malloc fail
fcd0: 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20  ure within .    
fce0: 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65 73  ** PagerSetPages
fcf0: 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64 2e  ize() is tested.
fd00: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
fd10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
fd20: 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c  Pagesize(pPager,
fd30: 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d 31 29   &iPageSize, -1)
fd40: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
fd50: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
fd60: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
fd70: 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  the assumed sect
fd80: 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68  or-size to match
fd90: 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20   the value used 
fda0: 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  by .    ** the p
fdb0: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
fdc0: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
fdd0: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
fde0: 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65  l was.    ** cre
fdf0: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
fe00: 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69  s other than thi
fe10: 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73  s one, then this
fe20: 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20   routine.    ** 
fe30: 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
fe40: 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
fe50: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68  r_playback(). Th
fe60: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20  e local value.  
fe70: 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65    ** of Pager.se
fe80: 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74  ctorSize is rest
fe90: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ored at the end 
fea0: 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e  of that routine.
feb0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
fec0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
fed0: 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20   iSectorSize;.  
fee0: 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
fef0: 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
ff00: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
ff10: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
ff20: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
ff30: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
ff40: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
ff50: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
ff60: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
ff70: 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
ff80: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
ff90: 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
ffa0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
ffb0: 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
ffc0: 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
ffd0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
ffe0: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
fff0: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
10000 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
10010 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
10020 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
10030 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
10040 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
10050 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
10060 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
10070 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  rmat is:.**.**  
10080 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45   + 4 bytes: PAGE
10090 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20  R_MJ_PGNO..**   
100a0 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + N bytes: Maste
100b0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
100c0 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20  me in utf-8..** 
100d0 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28    + 4 bytes: N (
100e0 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72  length of master
100f0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
10100 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74   bytes, no nul-t
10110 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20  erminator)..**  
10120 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74   + 4 bytes: Mast
10130 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10140 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b  checksum..**   +
10150 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
10160 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
10170 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
10180 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
10190 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
101a0 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
101b0 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
101c0 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65  al name, where e
101d0 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65  ach byte is inte
101e0 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67  rpreted as a sig
101f0 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65  ned 8-bit intege
10200 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73  r..**.** If zMas
10210 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ter is a NULL po
10220 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f  inter (occurs fo
10230 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
10240 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
10250 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  , .** this call 
10260 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
10270 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d  tatic int writeM
10280 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67  asterJournal(Pag
10290 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
102a0 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
102b0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
102c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102d0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
102e0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ode */.  int nMa
102f0 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ster;           
10300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
10310 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  gth of string zM
10320 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  aster */.  i64 i
10330 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
10340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
10350 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20  ffset of header 
10360 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
10370 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a  */.  i64 jrnlSiz
10380 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10390 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
103a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e   journal file on
103b0 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63   disk */.  u32 c
103c0 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20  ksum = 0;       
103d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
103e0 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e  hecksum of strin
103f0 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20  g zMaster */..  
10400 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
10410 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a  setMaster==0 );.
10420 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
10430 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
10440 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65  ;..  if( !zMaste
10450 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  r .   || pPager-
10460 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
10470 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
10480 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50  MEMORY .   || pP
10490 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
104a0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
104b0 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20  MODE_OFF .  ){. 
104c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
104d0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
104e0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31  r->setMaster = 1
104f0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
10500 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
10510 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
10520 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
10530 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
10540 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43  alOff );..  /* C
10550 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e  alculate the len
10560 67 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64  gth in bytes and
10570 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66   the checksum of
10580 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f   zMaster */.  fo
10590 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61  r(nMaster=0; zMa
105a0 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e  ster[nMaster]; n
105b0 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63  Master++){.    c
105c0 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
105d0 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20  nMaster];.  }.. 
105e0 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
105f0 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
10600 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
10610 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
10620 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
10630 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10640 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
10650 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
10660 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
10670 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
10680 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
10690 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
106a0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
106b0 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
106c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
106d0 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
106e0 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
106f0 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
10700 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10710 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  ff;..  /* Write 
10720 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
10730 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65  al data to the e
10740 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
10750 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20  l file. If.  ** 
10760 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
10770 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
10780 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
10790 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ller..  */.  if(
107a0 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
107b0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
107c0 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50  >jfd, iHdrOff, P
107d0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
107e0 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30  ger)))).   || (0
107f0 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
10800 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
10810 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  >jfd, zMaster, n
10820 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b  Master, iHdrOff+
10830 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  4))).   || (0 !=
10840 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
10850 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10860 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
10870 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20  r, nMaster))).  
10880 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
10890 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
108a0 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
108b0 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b  +4+nMaster+4, ck
108c0 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  sum))).   || (0 
108d0 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
108e0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
108f0 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
10900 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34  ic, 8, iHdrOff+4
10910 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20  +nMaster+8))).  
10920 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
10930 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
10940 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e  journalOff += (n
10950 4d 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f  Master+20);..  /
10960 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
10970 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a  s in peristent-j
10980 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65  ournal mode, the
10990 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a  n the physical .
109a0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c    ** journal-fil
109b0 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73  e may extend pas
109c0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
109d0 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
109e0 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20  name.  ** and 8 
109f0 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64  bytes of magic d
10a00 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ata just written
10a10 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68   to the file. Th
10a20 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67  is is .  ** dang
10a30 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68  erous because th
10a40 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61  e code to rollba
10a50 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
10a60 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   file.  ** will 
10a70 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66  not be able to f
10a80 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a  ind the master-j
10a90 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64  ournal name to d
10aa0 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77  etermine .  ** w
10ab0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
10ac0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74  e journal is hot
10ad0 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73  . .  **.  ** Eas
10ae0 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f  iest thing to do
10af0 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69   in this scenari
10b00 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65  o is to truncate
10b10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   the journal .  
10b20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72  ** file to the r
10b30 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20  equired size..  
10b40 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45  */ .  if( SQLITE
10b50 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK==(rc = sqlit
10b60 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
10b70 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53  ger->jfd, &jrnlS
10b80 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c  ize)).   && jrnl
10b90 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75  Size>pPager->jou
10ba0 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20  rnalOff.  ){.   
10bb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
10bc0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
10bd0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
10be0 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20  rnalOff);.  }.  
10bf0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10c00 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20  .** Find a page 
10c10 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  in the hash tabl
10c20 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65  e given its page
10c30 20 6e 75 6d 62 65 72 2e 20 52 65 74 75 72 6e 0a   number. Return.
10c40 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
10c50 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c  the page or NULL
10c60 20 69 66 20 74 68 65 20 72 65 71 75 65 73 74 65   if the requeste
10c70 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 0a 2a  d page is not .*
10c80 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 6d 65 6d  * already in mem
10c90 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ory..*/.static P
10ca0 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b  gHdr *pager_look
10cb0 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
10cc0 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
10cd0 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20  PgHdr *p;       
10ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cf0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
10d00 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73  e */..  /* It is
10d10 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
10d20 72 20 61 20 63 61 6c 6c 20 74 6f 20 50 63 61 63  r a call to Pcac
10d30 68 65 46 65 74 63 68 28 29 20 77 69 74 68 20 63  heFetch() with c
10d40 72 65 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f 0a  reateFlag==0 to.
10d50 20 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63 65    ** fail, since
10d60 20 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61   no attempt to a
10d70 6c 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69 63 20  llocate dynamic 
10d80 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 6d  memory will be m
10d90 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69  ade..  */.  (voi
10da0 64 29 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  d)sqlite3PcacheF
10db0 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
10dc0 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26  ache, pgno, 0, &
10dd0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  p);.  return p;.
10de0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64  }../*.** Discard
10df0 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
10e00 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d  ents of the in-m
10e10 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68 65  emory page-cache
10e20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10e30 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
10e40 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
10e50 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
10e60 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
10e70 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  kup);.  sqlite3P
10e80 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65  cacheClear(pPage
10e90 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a  r->pPCache);.}..
10ea0 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73  /*.** Free all s
10eb0 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65  tructures in the
10ec0 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
10ed0 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65  t[] array and se
10ee0 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e  t both.** Pager.
10ef0 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50  aSavepoint and P
10f00 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20  ager.nSavepoint 
10f10 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74  to zero. Close t
10f20 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
10f30 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20  * if it is open 
10f40 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
10f50 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76   not in exclusiv
10f60 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  e mode..*/.stati
10f70 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c  c void releaseAl
10f80 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65  lSavepoints(Page
10f90 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
10fa0 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
10fb0 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
10fc0 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  for looping thro
10fd0 75 67 68 20 50 61 67 65 72 2e 61 53 61 76 65 70  ugh Pager.aSavep
10fe0 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69  oint */.  for(ii
10ff0 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
11000 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
11010 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  {.    sqlite3Bit
11020 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
11030 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
11040 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b  ].pInSavepoint);
11050 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
11060 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
11070 65 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d 65  e || sqlite3IsMe
11080 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  mJournal(pPager-
11090 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71  >sjfd) ){.    sq
110a0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
110b0 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a  ger->sjfd);.  }.
110c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
110d0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
110e0 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53  t);.  pPager->aS
110f0 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
11100 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
11110 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nt = 0;.  pPager
11120 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d  ->nSubRec = 0;.}
11130 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
11140 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20  bit number pgno 
11150 69 6e 20 74 68 65 20 50 61 67 65 72 53 61 76 65  in the PagerSave
11160 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
11170 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f  nt .** bitvecs o
11180 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70  f all open savep
11190 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51  oints. Return SQ
111a0 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
111b0 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49  ssful.** or SQLI
111c0 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61  TE_NOMEM if a ma
111d0 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63  lloc failure occ
111e0 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  urs..*/.static i
111f0 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e  nt addToSavepoin
11200 74 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a  tBitvecs(Pager *
11210 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
11220 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20  o){.  int ii;   
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11240 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
11250 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
11260 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f  LITE_OK;       /
11270 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
11280 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ..  for(ii=0; ii
11290 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
112a0 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
112b0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
112c0 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61  p = &pPager->aSa
112d0 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20  vepoint[ii];.   
112e0 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f   if( pgno<=p->nO
112f0 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20  rig ){.      rc 
11300 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  |= sqlite3Bitvec
11310 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f  Set(p->pInSavepo
11320 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  int, pgno);.    
11330 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
11340 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
11350 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
11360 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72  ==SQLITE_OK || r
11370 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
11380 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
11390 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
113a0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
113b0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
113c0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
113d0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e  xclusive mode an
113e0 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20  d not.** in the 
113f0 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68  ERROR state. Oth
11400 65 72 77 69 73 65 2c 20 69 74 20 73 77 69 74 63  erwise, it switc
11410 68 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f  hes the pager to
11420 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73   PAGER_OPEN.** s
11430 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tate..**.** If t
11440 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
11450 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
11460 65 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61  ess mode, the da
11470 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a  tabase file is.*
11480 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c  * completely unl
11490 6f 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69  ocked. If the fi
114a0 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61  le is unlocked a
114b0 6e 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  nd the file-syst
114c0 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65  em does.** not e
114d0 78 68 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c  xhibit the UNDEL
114e0 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
114f0 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a   property, the j
11500 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a  ournal file is.*
11510 2a 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20  * closed (if it 
11520 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20  is open)..**.** 
11530 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
11540 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77  in ERROR state w
11550 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
11560 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
11570 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66   .** contents of
11580 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
11590 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20 62   are discarded b
115a0 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20  efore switching 
115b0 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20  back to .** the 
115c0 4f 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61  OPEN state. Rega
115d0 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
115e0 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  r the pager is i
115f0 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  n exclusive-mode
11600 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20  .** or not, any 
11610 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66  journal file lef
11620 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  t in the file-sy
11630 73 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65  stem will be tre
11640 61 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74  ated.** as a hot
11650 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c  -journal and rol
11660 6c 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78  led back the nex
11670 74 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72  t time a read-tr
11680 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
11690 6f 70 65 6e 65 64 20 28 62 79 20 74 68 69 73 20  opened (by this 
116a0 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20  or by any other 
116b0 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a  connection)..*/.
116c0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
116d0 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a  r_unlock(Pager *
116e0 70 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65  pPager){..  asse
116f0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
11700 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
11710 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67   .       || pPag
11720 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
11730 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c  R_OPEN .       |
11740 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
11750 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20  ==PAGER_ERROR . 
11760 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 69   );..  sqlite3Bi
11770 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
11780 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
11790 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  .  pPager->pInJo
117a0 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c  urnal = 0;.  rel
117b0 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
117c0 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66  s(pPager);..  if
117d0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
117e0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73  ager) ){.    ass
117f0 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61  ert( !isOpen(pPa
11800 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20  ger->jfd) );.   
11810 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
11820 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
11830 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20  ager->pWal);.   
11840 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
11850 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20  = PAGER_OPEN;.  
11860 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65  }else if( !pPage
11870 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
11880 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20   ){.    int rc; 
11890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118a0 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
118b0 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  ode returned by 
118c0 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20  pagerUnlockDb() 
118d0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d  */.    int iDc =
118e0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
118f0 66 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65 76  fd)?sqlite3OsDev
11900 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
11910 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a 30  cs(pPager->fd):0
11920 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
11930 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
11940 6d 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74 69  m support deleti
11950 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73  on of open files
11960 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c  , then.    ** cl
11970 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ose the journal 
11980 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69  file when droppi
11990 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
119a0 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73 65  lock.  Otherwise
119b0 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20  .    ** another 
119c0 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
119d0 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c  journal_mode=del
119e0 65 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74 65  ete might delete
119f0 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
11a00 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
11a10 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  us..    */.    a
11a20 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
11a30 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
11a40 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20     & 5)!=1 );.  
11a50 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
11a60 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
11a70 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b        & 5)!=1 );
11a80 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
11a90 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
11aa0 57 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d 31  WAL      & 5)!=1
11ab0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
11ac0 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
11ad0 44 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35 29  DE_DELETE   & 5)
11ae0 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
11af0 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
11b00 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26  LMODE_TRUNCATE &
11b10 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)==1 );.    as
11b20 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
11b30 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
11b40 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20    & 5)==1 );.   
11b50 20 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53   if( 0==(iDc & S
11b60 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45  QLITE_IOCAP_UNDE
11b70 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
11b80 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70  N).     || 1!=(p
11b90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
11ba0 64 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20  de & 5).    ){. 
11bb0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
11bc0 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
11bd0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11be0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
11bf0 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  in the ERROR sta
11c00 74 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20  te and the call 
11c10 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61  to unlock the da
11c20 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
11c30 6c 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74 68  le fails, set th
11c40 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74  e current lock t
11c50 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20  o UNKNOWN_LOCK. 
11c60 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a  See the comment.
11c70 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 65      ** above the
11c80 20 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b   #define for UNK
11c90 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e  NOWN_LOCK for an
11ca0 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
11cb0 77 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  why this.    ** 
11cc0 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  is necessary..  
11cd0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
11ce0 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
11cf0 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  er, NO_LOCK);.  
11d00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11d10 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65  _OK && pPager->e
11d20 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52  State==PAGER_ERR
11d30 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OR ){.      pPag
11d40 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e  er->eLock = UNKN
11d50 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  OWN_LOCK;.    }.
11d60 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
11d70 72 20 73 74 61 74 65 20 6d 61 79 20 62 65 20 63  r state may be c
11d80 68 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47 45  hanged from PAGE
11d90 52 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45 52  R_ERROR to PAGER
11da0 5f 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20 2a  _OPEN here.    *
11db0 2a 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72 69  * without cleari
11dc0 6e 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  ng the error cod
11dd0 65 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65 6e  e. This is inten
11de0 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72 72  tional - the err
11df0 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 69  or.    ** code i
11e00 73 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74 68  s cleared and th
11e10 65 20 63 61 63 68 65 20 72 65 73 65 74 20 69 6e  e cache reset in
11e20 20 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77   the block below
11e30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
11e40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
11e50 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Code || pPager->
11e60 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
11e70 52 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ROR );.    pPage
11e80 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
11e90 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ne = 0;.    pPag
11ea0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
11eb0 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20  ER_OPEN;.  }..  
11ec0 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72 43  /* If Pager.errC
11ed0 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65 20  ode is set, the 
11ee0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
11ef0 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e  pager cache cann
11f00 6f 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73 74  ot be.  ** trust
11f10 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65  ed. Now that the
11f20 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
11f30 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
11f40 20 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a 20   to the pager,. 
11f50 20 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65 6c   ** it can safel
11f60 79 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20 50  y move back to P
11f70 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e  AGER_OPEN state.
11f80 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   This happens in
11f90 20 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61   both.  ** norma
11fa0 6c 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 2d  l and exclusive-
11fb0 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20  locking mode..  
11fc0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
11fd0 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
11fe0 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
11ff0 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  ;.    pager_rese
12000 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  t(pPager);.    p
12010 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
12020 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
12030 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 70  >tempFile;.    p
12040 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
12050 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20  PAGER_OPEN;.    
12060 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
12070 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
12080 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
12090 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50  nalOff = 0;.  pP
120a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
120b0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
120c0 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d  setMaster = 0;.}
120d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
120e0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
120f0 77 68 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52  whenever an IOER
12100 52 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20  R or FULL error 
12110 74 68 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a  that requires.**
12120 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 74 72   the pager to tr
12130 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68  ansition into th
12140 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61  e ERROR state ma
12150 79 20 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e  y ahve occurred.
12160 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
12170 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
12180 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 72  ter to the pager
12190 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 20   structure, the 
121a0 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65  second .** the e
121b0 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20  rror-code about 
121c0 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
121d0 79 20 61 20 70 61 67 65 72 20 41 50 49 20 66 75  y a pager API fu
121e0 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20  nction. The .** 
121f0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
12200 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
12210 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
12220 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
12230 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
12240 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
12250 69 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  is SQLITE_FULL, 
12260 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20  SQLITE_IOERR or 
12270 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f  one of the.** IO
12280 45 52 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74  ERR sub-codes, t
12290 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73 20  he pager enters 
122a0 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20  the ERROR state 
122b0 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f  and the error co
122c0 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20  de.** is stored 
122d0 69 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  in Pager.errCode
122e0 2e 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65  . While the page
122f0 72 20 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65  r remains in the
12300 20 45 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a   ERROR state,.**
12310 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63   all major API c
12320 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65  alls on the Page
12330 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65  r will immediate
12340 6c 79 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e  ly return Pager.
12350 65 72 72 43 6f 64 65 2e 0a 2a 2a 20 45 78 63 65  errCode..** Exce
12360 70 74 2c 20 69 66 20 74 68 65 20 65 72 72 6f 72  pt, if the error
12370 2d 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f  -code is SQLITE_
12380 46 55 4c 4c 2c 20 63 61 6c 6c 73 20 74 6f 20 50  FULL, calls to P
12390 61 67 65 72 4c 6f 6f 6b 75 70 28 29 20 61 6e 64  agerLookup() and
123a0 0a 2a 2a 20 50 61 67 65 72 41 63 71 75 69 72 65  .** PagerAcquire
123b0 20 61 72 65 20 68 61 6e 64 6c 65 64 20 61 73 20   are handled as 
123c0 69 66 20 74 68 65 20 70 61 67 65 72 20 77 65 72  if the pager wer
123d0 65 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45  e in PAGER_READE
123e0 52 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54  R state..**.** T
123f0 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  he ERROR state i
12400 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
12410 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
12420 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a  e pager-cache .*
12430 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73  * cannot be trus
12440 74 65 64 2e 20 54 68 69 73 20 73 74 61 74 65 20  ted. This state 
12450 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62  can be cleared b
12460 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73  y completely dis
12470 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20  carding .** the 
12480 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
12490 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20  pager-cache. If 
124a0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
124b0 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a  s active when.**
124c0 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
124d0 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20  error occurred, 
124e0 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  then the rollbac
124f0 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65  k journal may ne
12500 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c  ed.** to be repl
12510 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20  ayed to restore 
12520 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
12530 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
12540 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77  e (as if.** it w
12550 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ere a hot-journa
12560 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  l)..*/.static in
12570 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61  t pager_error(Pa
12580 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
12590 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20   rc){.  int rc2 
125a0 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61  = rc & 0xff;.  a
125b0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
125c0 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29  E_OK || !MEMDB )
125d0 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20  ;.  assert(.    
125e0 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
125f0 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de==SQLITE_FULL 
12600 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  ||.       pPager
12610 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
12620 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28  E_OK ||.       (
12630 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
12640 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  & 0xff)==SQLITE_
12650 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28  IOERR.  );.  if(
12660 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   rc2==SQLITE_FUL
12670 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45  L || rc2==SQLITE
12680 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50  _IOERR ){.    pP
12690 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
126a0 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rc;.    pPager->
126b0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  eState = PAGER_E
126c0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
126d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
126e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64  This routine end
126f0 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  s a transaction.
12700 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   A transaction i
12710 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64 20  s usually ended 
12720 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20  by .** either a 
12730 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c  COMMIT or a ROLL
12740 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20  BACK operation. 
12750 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79  This routine may
12760 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61   be called .** a
12770 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  fter rollback of
12780 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20   a hot-journal, 
12790 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  or if an error o
127a0 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e  ccurs while open
127b0 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ing.** the journ
127c0 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74 69  al file or writi
127d0 6e 67 20 74 68 65 20 76 65 72 79 20 66 69 72 73  ng the very firs
127e0 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  t journal-header
127f0 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61 73   of a.** databas
12800 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
12810 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
12820 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
12830 65 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f  ed in PAGER_ERRO
12840 52 20 73 74 61 74 65 2e 20 49 66 20 69 74 20 69  R state. If it i
12850 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50  s called.** in P
12860 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47  AGER_NONE or PAG
12870 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 20  ER_SHARED state 
12880 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c  and the lock hel
12890 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63  d is less.** exc
128a0 6c 75 73 69 76 65 20 74 68 61 6e 20 61 20 52 45  lusive than a RE
128b0 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20  SERVED lock, it 
128c0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
128d0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79  * Otherwise, any
128e0 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
128f0 74 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e  ts are released.
12900 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
12910 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
12920 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22  en, then it is "
12930 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65  finalized". Once
12940 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66   a journal .** f
12950 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e  ile has been fin
12960 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74  alized it is not
12970 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
12980 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b   it to roll back
12990 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69   a .** transacti
129a0 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20  on. Nor will it 
129b0 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  be considered to
129c0 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   be a hot-journa
129d0 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20  l by this.** or 
129e0 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62 61  any other databa
129f0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45  se connection. E
12a00 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75  xactly how a jou
12a10 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65  rnal is finalize
12a20 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20  d.** depends on 
12a30 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
12a40 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
12a50 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
12a60 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65   mode and.** the
12a70 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c   current journal
12a80 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75  -mode (Pager.jou
12a90 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c  rnalMode value),
12aa0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
12ab0 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
12ac0 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20  ==MEMORY.**     
12ad0 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  Journal file des
12ae0 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c  criptor is simpl
12af0 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64  y closed. This d
12b00 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20  estroys an .**  
12b10 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75     in-memory jou
12b20 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  rnal..**.**   jo
12b30 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43  urnalMode==TRUNC
12b40 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ATE.**     Journ
12b50 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  al file is trunc
12b60 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74  ated to zero byt
12b70 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
12b80 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
12b90 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20  =PERSIST.**     
12ba0 54 68 65 20 66 69 72 73 74 20 32 38 20 62 79 74  The first 28 byt
12bb0 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  es of the journa
12bc0 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65  l file are zeroe
12bd0 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61  d. This invalida
12be0 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  tes.**     the f
12bf0 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
12c00 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c  der in the file,
12c10 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65   and hence the e
12c20 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ntire journal.**
12c30 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e       file. An in
12c40 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69  valid journal fi
12c50 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c  le cannot be rol
12c60 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
12c70 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44    journalMode==D
12c80 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65  ELETE.**     The
12c90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
12ca0 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65   closed and dele
12cb0 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ted using sqlite
12cc0 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a  3OsDelete()..**.
12cd0 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70 61  **     If the pa
12ce0 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
12cf0 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
12d00 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66  , this method of
12d10 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20   finalizing.**  
12d20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66     the journal f
12d30 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73 65  ile is never use
12d40 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74  d. Instead, if t
12d50 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69  he journalMode i
12d60 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20  s.**     DELETE 
12d70 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
12d80 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
12d90 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64  de, the method d
12da0 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a  escribed under.*
12db0 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  *     journalMod
12dc0 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75 73  e==PERSIST is us
12dd0 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
12de0 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72  * After the jour
12df0 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  nal is finalized
12e00 2c 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76 65  , the pager move
12e10 73 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45  s to PAGER_READE
12e20 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72  R state..** If r
12e30 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78  unning in non-ex
12e40 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b  clusive rollback
12e50 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20   mode, the lock 
12e60 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 0a  on the file is .
12e70 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f  ** downgraded to
12e80 20 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a   a SHARED_LOCK..
12e90 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
12ea0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
12eb0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  o error occurs. 
12ec0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
12ed0 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79  rs during.** any
12ee0 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61   of the IO opera
12ef0 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a  tions to finaliz
12f00 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
12f10 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65  le or unlock the
12f20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68 65  .** database the
12f30 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
12f40 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
12f50 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66 20  to the user. If 
12f60 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  the .** operatio
12f70 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  n to finalize th
12f80 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
12f90 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ails, then the c
12fa0 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69  ode still.** tri
12fb0 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65  es to unlock the
12fc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
12fd0 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  f not in exclusi
12fe0 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a  ve mode. If the.
12ff0 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74  ** unlock operat
13000 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c  ion fails as wel
13010 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  l, then the firs
13020 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c  t error code rel
13030 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66  ated.** to the f
13040 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75  irst error encou
13050 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72  ntered (the jour
13060 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e  nal finalization
13070 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75   one) is.** retu
13080 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
13090 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  int pager_end_tr
130a0 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
130b0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73  *pPager, int has
130c0 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
130d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
130e0 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
130f0 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66  e from journal f
13100 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72  inalization oper
13110 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ation */.  int r
13120 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  c2 = SQLITE_OK; 
13130 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
13140 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75  e from db file u
13150 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
13160 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68  */..  /* Do noth
13170 69 6e 67 20 69 66 20 74 68 65 20 70 61 67 65 72  ing if the pager
13180 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
13190 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
131a0 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72  nsaction.  ** or
131b0 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
131c0 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73 20  RVED lock. This 
131d0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
131e0 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  called when ther
131f0 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72 69  e.  ** is no wri
13200 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  te-transaction a
13210 63 74 69 76 65 20 62 75 74 20 61 20 52 45 53 45  ctive but a RESE
13220 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  RVED or greater 
13230 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65 6c  lock is.  ** hel
13240 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72 63  d under two circ
13250 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a  umstances:.  **.
13260 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72 20    **   1. After 
13270 61 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f 74  a successful hot
13280 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
13290 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64 20  k, it is called 
132a0 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20 65  with.  **      e
132b0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e  State==PAGER_NON
132c0 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43  E and eLock==EXC
132d0 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a  LUSIVE_LOCK..  *
132e0 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20 61  *.  **   2. If a
132f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
13300 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
13310 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67 20  clusive holding 
13320 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20  an EXCLUSIVE .  
13330 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77 69  **      lock swi
13340 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f  tches back to lo
13350 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
13360 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63 75  l and then execu
13370 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20 20  tes a.  **      
13380 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
13390 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
133a0 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65  is called with e
133b0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
133c0 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20 61  DER .  **      a
133d0 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  nd eLock==EXCLUS
133e0 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68  IVE_LOCK when th
133f0 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
13400 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20  on is closed..  
13410 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  */.  assert( ass
13420 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
13430 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
13440 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
13450 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
13460 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
13470 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 57  ->eState<PAGER_W
13480 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26 20  RITER_LOCKED && 
13490 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45  pPager->eLock<RE
134a0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SERVED_LOCK ){. 
134b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
134c0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65  _OK;.  }..  rele
134d0 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
134e0 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65  (pPager);.  asse
134f0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
13500 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  r->jfd) || pPage
13510 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
13520 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e   );.  if( isOpen
13530 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
13540 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61  .    assert( !pa
13550 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
13560 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  ) );..    /* Fin
13570 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
13580 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  l file. */.    i
13590 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a  f( sqlite3IsMemJ
135a0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
135b0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fd) ){.      ass
135c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
135d0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
135e0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
135f0 52 59 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  RY );.      sqli
13600 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
13610 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c  r->jfd);.    }el
13620 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
13630 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
13640 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
13650 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20  UNCATE ){.      
13660 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
13670 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
13680 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13690 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _OK;.      }else
136a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
136b0 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
136c0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
136d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
136e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
136f0 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ff = 0;.    }els
13700 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
13710 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13720 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
13730 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28 70  SIST.      || (p
13740 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
13750 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Mode && pPager->
13760 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
13770 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
13780 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  AL).    ){.     
13790 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61   rc = zeroJourna
137a0 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73  lHdr(pPager, has
137b0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70  Master);.      p
137c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
137d0 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  f = 0;.    }else
137e0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
137f0 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78  branch may be ex
13800 65 63 75 74 65 64 20 77 69 74 68 20 50 61 67 65  ecuted with Page
13810 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d  r.journalMode==M
13820 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a  EMORY if.      *
13830 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  * a hot-journal 
13840 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20  was just rolled 
13850 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
13860 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  se the journal. 
13870 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f       ** file sho
13880 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e  uld be closed an
13890 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68  d deleted. If th
138a0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72  is connection wr
138b0 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ites to.      **
138c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
138d0 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73  le, it will do s
138e0 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65  o using an in-me
138f0 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20  mory journal. . 
13900 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
13910 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
13920 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13930 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
13940 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20  ETE .           
13950 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
13960 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
13970 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
13980 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
13990 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
139a0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
139b0 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
139c0 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
139d0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
139e0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ->jfd);.      if
139f0 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
13a00 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ile ){.        r
13a10 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
13a20 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
13a30 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
13a40 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 0);.      }.
13a50 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
13a60 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
13a70 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
13a80 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70  heIterateDirty(p
13a90 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
13aa0 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
13ab0 73 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  sh);.#endif.  }.
13ac0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
13ad0 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
13ae0 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
13af0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
13b00 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
13b10 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69  nRec = 0;.  sqli
13b20 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
13b30 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  l(pPager->pPCach
13b40 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  e);.  sqlite3Pca
13b50 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61 67  cheTruncate(pPag
13b60 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61  er->pPCache, pPa
13b70 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a 20  ger->dbSize);.. 
13b80 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
13b90 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
13ba0 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c 20  /* Drop the WAL 
13bb0 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20 61  write-lock, if a
13bc0 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65  ny. Also, if the
13bd0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20   connection was 
13be0 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 69  in .    ** locki
13bf0 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
13c00 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e 6f  e mode but is no
13c10 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74 68   longer, drop th
13c20 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20  e EXCLUSIVE .   
13c30 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e   ** lock held on
13c40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13c50 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  le..    */.    r
13c60 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 45  c2 = sqlite3WalE
13c70 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  ndWriteTransacti
13c80 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
13c90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
13ca0 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  2==SQLITE_OK );.
13cb0 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
13cc0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
13cd0 20 0a 20 20 20 26 26 20 28 21 70 61 67 65 72 55   .   && (!pagerU
13ce0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c  seWal(pPager) ||
13cf0 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75   sqlite3WalExclu
13d00 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d  siveMode(pPager-
13d10 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a  >pWal, 0)).  ){.
13d20 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 55      rc2 = pagerU
13d30 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
13d40 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
13d50 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
13d60 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20  CountDone = 0;. 
13d70 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74   }.  pPager->eSt
13d80 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44  ate = PAGER_READ
13d90 45 52 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65  ER;.  pPager->se
13da0 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20  tMaster = 0;..  
13db0 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
13dc0 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d  TE_OK?rc2:rc);.}
13dd0 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
13de0 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20  a rollback if a 
13df0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
13e00 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b  ctive and unlock
13e10 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
13e20 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  e file. .**.** I
13e30 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  f the pager has 
13e40 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20  already entered 
13e50 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
13e60 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   do not attempt 
13e70 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
13e80 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49   at this time. I
13e90 6e 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e  nstead, pager_un
13ea0 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  lock() is called
13eb0 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f  . The.** call to
13ec0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
13ed0 77 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c  will discard all
13ee0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
13ef0 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20  , unlock.** the 
13f00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
13f10 64 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72  d move the pager
13f20 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74   back to OPEN st
13f30 61 74 65 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a  ate. If this .**
13f40 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 72   means that ther
13f50 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  e is a hot-journ
13f60 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  al left in the f
13f70 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20  ile-system, the 
13f80 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74  next .** connect
13f90 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  ion to obtain a 
13fa0 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
13fb0 68 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20  he pager (which 
13fc0 6d 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29  may be this one)
13fd0 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69   .** will roll i
13fe0 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  t back..**.** If
13ff0 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 6e   the pager has n
14000 6f 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  ot already enter
14010 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
14020 74 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72  te, but an IO or
14030 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  .** malloc error
14040 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61   occurs during a
14050 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
14060 74 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66  this will itself
14070 20 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70   cause .** the p
14080 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68  ager to enter th
14090 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 57  e ERROR state. W
140a0 68 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65  hich will be cle
140b0 61 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63  ared by the.** c
140c0 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c  all to pager_unl
140d0 6f 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69  ock(), as descri
140e0 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74  bed above..*/.st
140f0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
14100 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
14110 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
14120 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
14130 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
14140 4f 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  OR && pPager->eS
14150 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e  tate!=PAGER_OPEN
14160 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
14170 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
14180 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
14190 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
141a0 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
141b0 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  ER_LOCKED ){.   
141c0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
141d0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
141e0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
141f0 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
14200 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14210 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
14220 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
14230 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
14240 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  iveMode ){.     
14250 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14260 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
14270 45 41 44 45 52 20 29 3b 0a 20 20 20 20 20 20 70  EADER );.      p
14280 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
14290 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b  tion(pPager, 0);
142a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67  .    }.  }.  pag
142b0 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
142c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  );.}../*.** Para
142d0 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73 74  meter aData must
142e0 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
142f0 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61  er of pPager->pa
14300 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20  geSize bytes.** 
14310 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65  of data. Compute
14320 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
14330 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74  ecksum based ont
14340 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
14350 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66   the .** page of
14360 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63 75   data and the cu
14370 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70  rrent value of p
14380 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
14390 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
143a0 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b  not a real check
143b0 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c  sum. It is reall
143c0 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f  y just the sum o
143d0 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d  f the .** random
143e0 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28   initial value (
143f0 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
14400 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30 30  t) and every 200
14410 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68  th byte.** of th
14420 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74 61  e page data, sta
14430 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65 20  rting with byte 
14440 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e  offset (pPager->
14450 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a  pageSize%200)..*
14460 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20 69  * Each byte is i
14470 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e  nterpreted as an
14480 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20   8-bit unsigned 
14490 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43  integer..**.** C
144a0 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d  hanging the form
144b0 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  ula used to comp
144c0 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73 75  ute this checksu
144d0 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a  m results in an.
144e0 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  ** incompatible 
144f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
14500 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f  mat..**.** If jo
14510 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e  urnal corruption
14520 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61   occurs due to a
14530 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
14540 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20  the most likely 
14550 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20  .** scenario is 
14560 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20  that one end or 
14570 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
14580 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20   record will be 
14590 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20  changed. .** It 
145a0 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b  is much less lik
145b0 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f  ely that the two
145c0 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75   ends of the jou
145d0 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c  rnal record will
145e0 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61   be.** correct a
145f0 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65  nd the middle be
14600 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c   corrupt.  Thus,
14610 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22   this "checksum"
14620 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75   scheme,.** thou
14630 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70  gh fast and simp
14640 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20  le, catches the 
14650 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69  mostly likely ki
14660 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e  nd of corruption
14670 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
14680 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65  pager_cksum(Page
14690 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
146a0 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75   u8 *aData){.  u
146b0 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65  32 cksum = pPage
146c0 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  r->cksumInit;   
146d0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
146e0 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72  m value to retur
146f0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70  n */.  int i = p
14700 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
14710 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  200;          /*
14720 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
14730 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b  .  while( i>0 ){
14740 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44  .    cksum += aD
14750 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d  ata[i];.    i -=
14760 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   200;.  }.  retu
14770 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a  rn cksum;.}../*.
14780 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75  ** Report the cu
14790 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20  rrent page size 
147a0 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  and number of re
147b0 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63  served bytes bac
147c0 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65  k.** to the code
147d0 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  c..*/.#ifdef SQL
147e0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74  ITE_HAS_CODEC.st
147f0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52  atic void pagerR
14800 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20  eportSize(Pager 
14810 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
14820 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
14830 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50  zeChng ){.    pP
14840 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
14850 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f  Chng(pPager->pCo
14860 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  dec, pPager->pag
14870 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
14880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14890 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e    (int)pPager->n
148a0 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a  Reserve);.  }.}.
148b0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
148c0 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58  agerReportSize(X
148d0 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69  )     /* No-op i
148e0 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  f we do not supp
148f0 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23  ort a codec */.#
14900 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
14910 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  d a single page 
14920 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20  from either the 
14930 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66  journal file (if
14940 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20   isMainJrnl==1) 
14950 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73  or.** from the s
14960 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69  ub-journal (if i
14970 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e  sMainJrnl==0) an
14980 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20  d playback that 
14990 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67  page..** The pag
149a0 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73  e begins at offs
149b0 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f  et *pOffset into
149c0 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a   the file. The *
149d0 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65  pOffset.** value
149e0 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f   is increased to
149f0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
14a00 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
14a10 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
14a20 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  * The main rollb
14a30 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73  ack journal uses
14a40 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65   checksums - the
14a50 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
14a60 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e  al does .** not.
14a70 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
14a80 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
14a90 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61   page record rea
14aa0 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
14ab0 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
14ac0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
14ad0 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
14ae0 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69  ue of Pager.dbSi
14af0 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  ze, then playbac
14b00 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20  k is.** skipped 
14b10 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
14b20 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
14b30 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74   If pDone is not
14b40 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69   NULL, then it i
14b50 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61  s a record of pa
14b60 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c  ges that have al
14b70 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c  ready.** been pl
14b80 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74  ayed back.  If t
14b90 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66  he page at *pOff
14ba0 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  set has already 
14bb0 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
14bc0 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72  .** (if the corr
14bd0 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20  esponding pDone 
14be0 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e  bit is set) then
14bf0 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61   skip the playba
14c00 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ck..** Make sure
14c10 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63   the pDone bit c
14c20 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
14c30 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67  the *pOffset pag
14c40 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f  e is set.** prio
14c50 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a  r to returning..
14c60 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
14c70 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63  e record is succ
14c80 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
14c90 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
14ca0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  rnal file.** and
14cb0 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68   played back, th
14cc0 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  en SQLITE_OK is 
14cd0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
14ce0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
14cf0 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  ** while reading
14d00 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d   the record from
14d10 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
14d20 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65  al file or while
14d30 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74   writing.** to t
14d40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14d50 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
14d60 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
14d70 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a  rned. If data.**
14d80 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
14d90 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
14da0 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
14db0 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f  e but appears to
14dc0 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64   be.** corrupted
14dd0 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
14de0 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20   returned. Data 
14df0 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  is considered co
14e00 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77  rrupted in.** tw
14e10 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a  o circumstances:
14e20 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74  .** .**   * If t
14e30 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e  he record page-n
14e40 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c  umber is illegal
14e50 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f   (0 or PAGER_MJ_
14e60 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a  PGNO), or.**   *
14e70 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   If the record i
14e80 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
14e90 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
14ea0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  n journal file.*
14eb0 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68  *     and the ch
14ec0 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65  ecksum field doe
14ed0 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
14ee0 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a  record content..
14ef0 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66  **.** Neither of
14f00 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61   these two scena
14f10 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c  rios are possibl
14f20 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70  e during a savep
14f30 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  oint rollback..*
14f40 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20  *.** If this is 
14f50 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
14f60 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72  back, then memor
14f70 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65  y may have to be
14f80 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20   dynamically.** 
14f90 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
14fa0 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74  s function. If t
14fb0 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20  his is the case 
14fc0 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f  and an allocatio
14fd0 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49  n fails,.** SQLI
14fe0 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
14ff0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
15000 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
15010 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50  ck_one_page(.  P
15020 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
15030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15040 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20  The pager being 
15050 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
15060 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20   i64 *pOffset,  
15070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15080 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f  * Offset of reco
15090 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a  rd to playback *
150a0 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
150b0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
150c0 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70    /* Bitvec of p
150d0 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61  ages already pla
150e0 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e  yed back */.  in
150f0 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20  t isMainJrnl,   
15100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
15110 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c   -> main journal
15120 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e  . 0 -> sub-journ
15130 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  al. */.  int isS
15140 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 20 20  avepnt          
15150 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
15160 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  or a savepoint r
15170 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20  ollback */.){.  
15180 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
15190 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
151a0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
151b0 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
151c0 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
151d0 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
151e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
151f0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
15200 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
15210 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
15220 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
15230 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
15240 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
15250 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
15260 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20   char *aData;   
15270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15280 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  * Temporary stor
15290 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  age for the page
152a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
152b0 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20  le *jfd;        
152c0 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
152d0 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
152e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
152f0 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65  */.  int isSynce
15300 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
15310 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
15320 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79  urnal page is sy
15330 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nced */..  asser
15340 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e  t( (isMainJrnl&~
15350 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  1)==0 );      /*
15360 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30   isMainJrnl is 0
15370 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
15380 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31  t( (isSavepnt&~1
15390 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  )==0 );       /*
153a0 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20   isSavepnt is 0 
153b0 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
153c0 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20  ( isMainJrnl || 
153d0 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20  pDone );     /* 
153e0 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65  pDone always use
153f0 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d on sub-journal
15400 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  s */.  assert( i
15410 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e  sSavepnt || pDon
15420 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f  e==0 );   /* pDo
15430 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e  ne never used on
15440 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a   non-savepoint *
15450 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61  /..  aData = pPa
15460 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
15470 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20    assert( aData 
15480 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  );         /* Te
15490 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20  mp storage must 
154a0 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
154b0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  n allocated */. 
154c0 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
154d0 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
154e0 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20  || (!isMainJrnl 
154f0 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b  && isSavepnt) );
15500 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68  ..  /* Either th
15510 65 20 73 74 61 74 65 20 69 73 20 67 72 65 61 74  e state is great
15520 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52  er than PAGER_WR
15530 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61  ITER_CACHEMOD (a
15540 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
15550 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20  ** or savepoint 
15560 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74  rollback done at
15570 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 66 20   the request of 
15580 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74  the caller) or t
15590 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f  his is.  ** a ho
155a0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
155b0 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20 68  ck. If it is a h
155c0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
155d0 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20  ack, the pager. 
155e0 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20   ** is in state 
155f0 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61  OPEN and holds a
15600 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
15610 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  . Hot-journal ro
15620 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79  llback.  ** only
15630 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20   reads from the 
15640 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f  main journal, no
15650 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  t the sub-journa
15660 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  l..  */.  assert
15670 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
15680 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
15690 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
156a0 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  | (pPager->eStat
156b0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  e==PAGER_OPEN &&
156c0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
156d0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
156e0 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70    );.  assert( p
156f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
15700 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
15710 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72  EMOD || isMainJr
15720 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  nl );..  /* Read
15730 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
15740 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66   and page data f
15750 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
15760 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20  or sub-journal. 
15770 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e   ** file. Return
15780 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
15790 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20  o the caller if 
157a0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
157b0 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d  rs..  */.  jfd =
157c0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50   isMainJrnl ? pP
157d0 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67  ager->jfd : pPag
157e0 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d  er->sjfd;.  rc =
157f0 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
15800 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f   *pOffset, &pgno
15810 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
15820 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
15830 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
15840 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75  e3OsRead(jfd, (u
15850 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72  8*)aData, pPager
15860 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f  ->pageSize, (*pO
15870 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28  ffset)+4);.  if(
15880 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15890 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
158a0 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72  Offset += pPager
158b0 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b  ->pageSize + 4 +
158c0 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a   isMainJrnl*4;..
158d0 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
158e0 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
158f0 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
15900 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49  important that I
15910 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
15920 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20   thought.  If a 
15930 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
15940 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a  curs while the j
15950 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
15960 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74  written,.  ** it
15970 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76   could cause inv
15980 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20  alid data to be 
15990 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
159a0 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65   journal.  We ne
159b0 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63  ed to.  ** detec
159c0 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64  t this invalid d
159d0 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70  ata (with high p
159e0 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20  robability) and 
159f0 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a  ignore it..  */.
15a00 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c    if( pgno==0 ||
15a10 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
15a20 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
15a30 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53      assert( !isS
15a40 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65  avepnt );.    re
15a50 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
15a60 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
15a70 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64  >(Pgno)pPager->d
15a80 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33  bSize || sqlite3
15a90 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65  BitvecTest(pDone
15aa0 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72  , pgno) ){.    r
15ab0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15ac0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69  .  }.  if( isMai
15ad0 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20  nJrnl ){.    rc 
15ae0 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
15af0 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20  , (*pOffset)-4, 
15b00 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
15b10 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
15b20 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65  .    if( !isSave
15b30 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73  pnt && pager_cks
15b40 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
15b50 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
15b60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
15b70 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
15b80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
15b90 69 73 20 70 61 67 65 20 68 61 73 20 61 6c 72 65  is page has alre
15ba0 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
15bb0 62 79 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67  by before during
15bc0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a   the current.  *
15bd0 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  * rollback, then
15be0 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f   don't bother to
15bf0 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67   play it back ag
15c00 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ain..  */.  if( 
15c10 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73  pDone && (rc = s
15c20 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
15c30 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53  pDone, pgno))!=S
15c40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15c50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
15c60 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e    /* When playin
15c70 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72  g back page 1, r
15c80 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65  estore the nRese
15c90 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f  rve setting.  */
15ca0 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26  .  if( pgno==1 &
15cb0 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72  & pPager->nReser
15cc0 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29  ve!=((u8*)aData)
15cd0 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67  [20] ){.    pPag
15ce0 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28  er->nReserve = (
15cf0 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b  (u8*)aData)[20];
15d00 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74  .    pagerReport
15d10 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
15d20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
15d30 61 67 65 72 20 69 73 20 69 6e 20 43 41 43 48 45  ager is in CACHE
15d40 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20  MOD state, then 
15d50 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20  there must be a 
15d60 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a  copy of this.  *
15d70 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61  * page in the pa
15d80 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68  ger cache. In th
15d90 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64  is case just upd
15da0 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
15db0 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68  che,.  ** not th
15dc0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
15dd0 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66   The page is lef
15de0 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69  t marked dirty i
15df0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a  n this case..  *
15e00 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74  *.  ** An except
15e10 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65  ion to the above
15e20 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61   rule: If the da
15e30 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d  tabase is in no-
15e40 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61  sync mode.  ** a
15e50 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76  nd a page is mov
15e60 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63  ed during an inc
15e70 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
15e80 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
15e90 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e  y.  ** not be in
15ea0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
15eb0 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61  . Later: if a ma
15ec0 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72  lloc() or IO err
15ed0 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64  or occurs.  ** d
15ee0 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65  uring a Movepage
15ef0 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68  () call, then th
15f00 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62  e page may not b
15f10 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20  e in the cache. 
15f20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74   ** either. So t
15f30 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73  he condition des
15f40 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62  cribed in the ab
15f50 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73  ove paragraph is
15f60 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74   not.  ** assert
15f70 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a  ()able..  **.  *
15f80 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f 44  * If in WRITER_D
15f90 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49 4e  BMOD, WRITER_FIN
15fa0 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73 74  ISHED or OPEN st
15fb0 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64  ate, then we upd
15fc0 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  ate the.  ** pag
15fd0 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65  er cache if it e
15fe0 78 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d 61  xists and the ma
15ff0 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  in file. The pag
16000 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64  e is then marked
16010 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79   .  ** not dirty
16020 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f 64  . Since this cod
16030 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75 74  e is only execut
16040 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e  ed in PAGER_OPEN
16050 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20   state for.  ** 
16060 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
16070 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67 75  llback, it is gu
16080 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
16090 65 20 70 61 67 65 2d 63 61 63 68 65 20 69 73 20  e page-cache is 
160a0 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74 68  empty.  ** if th
160b0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f 50  e pager is in OP
160c0 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20  EN state..  **. 
160d0 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31   ** Ticket #1171
160e0 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74  :  The statement
160f0 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
16100 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74  ontain page cont
16110 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  ent that is.  **
16120 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
16130 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
16140 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
16150 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
16160 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75  ..  ** This occu
16170 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  rs when a page i
16180 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  s changed prior 
16190 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
161a0 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  a statement.  **
161b0 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67   then changed ag
161c0 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73  ain within the s
161d0 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20  tatement.  When 
161e0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63  rolling back suc
161f0 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  h a.  ** stateme
16200 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77  nt we must not w
16210 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67  rite to the orig
16220 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e  inal database un
16230 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a  less we know.  *
16240 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68  * for certain th
16250 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  at original page
16260 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79   contents are sy
16270 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61  nced into the ma
16280 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  in rollback.  **
16290 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72   journal.  Other
162a0 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f  wise, a power lo
162b0 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d  ss might leave m
162c0 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e 20  odified data in 
162d0 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
162e0 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61  e file without a
162f0 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72  n entry in the r
16300 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
16310 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65  that can.  ** re
16320 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
16330 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
16340 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f  al form.  Two co
16350 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65  nditions must be
16360 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65  .  ** met before
16370 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
16380 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20  database files. 
16390 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65  (1) the database
163a0 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f   must be.  ** lo
163b0 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e  cked.  (2) we kn
163c0 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ow that the orig
163d0 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
163e0 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65  t is fully synce
163f0 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61  d.  ** in the ma
16400 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65  in journal eithe
16410 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  r because the pa
16420 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
16430 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20  he or else.  ** 
16440 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b  the page is mark
16450 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d  ed as needSync==
16460 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30  0..  **.  ** 200
16470 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61  8-04-14:  When a
16480 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63  ttempting to vac
16490 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61  uum a corrupt da
164a0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a  tabase file, it.
164b0 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65    ** is possible
164c0 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65   to fail a state
164d0 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61  ment on a databa
164e0 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  se that does not
164f0 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a   yet exist..  **
16500 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   Do not attempt 
16510 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74 61  to write if data
16520 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65  base file has ne
16530 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  ver been opened.
16540 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65  .  */.  if( page
16550 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
16560 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a  ){.    pPg = 0;.
16570 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67    }else{.    pPg
16580 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
16590 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
165a0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67   }.  assert( pPg
165b0 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   || !MEMDB );.  
165c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
165d0 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
165e0 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 29 3b 0a  EN || pPg==0 );.
165f0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 50    PAGERTRACE(("P
16600 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20  LAYBACK %d page 
16610 25 64 20 68 61 73 68 28 25 30 38 78 29 20 25 73  %d hash(%08x) %s
16620 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
16630 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
16640 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74   pgno, pager_dat
16650 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61  ahash(pPager->pa
16660 67 65 53 69 7a 65 2c 20 28 75 38 2a 29 61 44 61  geSize, (u8*)aDa
16670 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ta),.           
16680 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69  (isMainJrnl?"mai
16690 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d  n-journal":"sub-
166a0 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a  journal").  ));.
166b0 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
166c0 20 29 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64   ){.    isSynced
166d0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e   = pPager->noSyn
166e0 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c  c || (*pOffset <
166f0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
16700 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  lHdr);.  }else{.
16710 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 28      isSynced = (
16720 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50  pPg==0 || 0==(pP
16730 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
16740 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20  _NEED_SYNC));.  
16750 7d 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d  }.  if( (pPager-
16760 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
16770 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70  RITER_DBMOD || p
16780 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
16790 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26  AGER_OPEN).   &&
167a0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
167b0 66 64 29 0a 20 20 20 26 26 20 69 73 53 79 6e 63  fd).   && isSync
167c0 65 64 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  ed.  ){.    i64 
167d0 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  ofst = (pgno-1)*
167e0 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
167f0 65 53 69 7a 65 3b 0a 20 20 20 20 74 65 73 74 63  eSize;.    testc
16800 61 73 65 28 20 21 69 73 53 61 76 65 70 6e 74 20  ase( !isSavepnt 
16810 26 26 20 70 50 67 21 3d 30 20 26 26 20 28 70 50  && pPg!=0 && (pP
16820 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
16830 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a  EED_SYNC)!=0 );.
16840 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
16850 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
16860 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
16870 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
16880 65 72 2d 3e 66 64 2c 20 28 75 38 2a 29 61 44 61  er->fd, (u8*)aDa
16890 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
168a0 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20  Size, ofst);.   
168b0 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
168c0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
168d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
168e0 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b  FileSize = pgno;
168f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
16900 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29  Pager->pBackup )
16910 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28 70  {.      CODEC1(p
16920 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67  Pager, aData, pg
16930 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45  no, 3, rc=SQLITE
16940 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20 73  _NOMEM);.      s
16950 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
16960 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
16970 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61  up, pgno, (u8*)a
16980 44 61 74 61 29 3b 0a 20 20 20 20 20 20 43 4f 44  Data);.      COD
16990 45 43 32 28 70 50 61 67 65 72 2c 20 61 44 61 74  EC2(pPager, aDat
169a0 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53  a, pgno, 7, rc=S
169b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44 61  QLITE_NOMEM, aDa
169c0 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ta);.    }.  }el
169d0 73 65 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72  se if( !isMainJr
169e0 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a  nl && pPg==0 ){.
169f0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
16a00 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  s a rollback of 
16a10 61 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20  a savepoint and 
16a20 64 61 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69  data was not wri
16a30 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74  tten to.    ** t
16a40 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
16a50 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
16a60 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65  in-memory, there
16a70 20 69 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a   is a potential.
16a80 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20      ** problem. 
16a90 57 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73  When the page is
16aa0 20 6e 65 78 74 20 66 65 74 63 68 65 64 20 62 79   next fetched by
16ab0 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65   the b-tree laye
16ac0 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69  r, it .    ** wi
16ad0 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ll be read from 
16ae0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16af0 65 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20  e, which may or 
16b00 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20  may not be .    
16b10 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20  ** current. .   
16b20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65   **.    ** There
16b30 20 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66   are a couple of
16b40 20 64 69 66 66 65 72 65 6e 74 20 77 61 79 73 20   different ways 
16b50 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e  this can happen.
16b60 20 41 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20   All are quite. 
16b70 20 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57     ** obscure. W
16b80 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73  hen running in s
16b90 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
16ba0 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68   this can only h
16bb0 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66  appen .    ** if
16bc0 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20   the page is on 
16bd0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74  the free-list at
16be0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
16bf0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  e transaction, t
16c00 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c  hen.    ** popul
16c10 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64  ated, then moved
16c20 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61   using sqlite3Pa
16c30 67 65 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20  gerMovepage().. 
16c40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
16c50 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20   solution is to 
16c60 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  add an in-memory
16c70 20 70 61 67 65 20 74 6f 20 74 68 65 20 63 61 63   page to the cac
16c80 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20  he containing.  
16c90 20 20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75    ** the data ju
16ca0 73 74 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  st read from the
16cb0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61   sub-journal. Ma
16cc0 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64  rk the page as d
16cd0 69 72 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64  irty .    ** and
16ce0 20 69 66 20 74 68 65 20 70 61 67 65 72 20 72 65   if the pager re
16cf0 71 75 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c  quires a journal
16d00 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b  -sync, then mark
16d10 20 74 68 65 20 70 61 67 65 20 61 73 20 0a 20 20   the page as .  
16d20 20 20 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61    ** requiring a
16d30 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65   journal-sync be
16d40 66 6f 72 65 20 69 74 20 69 73 20 77 72 69 74 74  fore it is writt
16d50 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  en..    */.    a
16d60 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74  ssert( isSavepnt
16d70 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
16d80 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
16d90 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  ll==0 );.    pPa
16da0 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2b  ger->doNotSpill+
16db0 2b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  +;.    rc = sqli
16dc0 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
16dd0 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70  pPager, pgno, &p
16de0 50 67 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65  Pg, 1);.    asse
16df0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
16e00 74 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20  tSpill==1 );.   
16e10 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
16e20 69 6c 6c 2d 2d 3b 0a 20 20 20 20 69 66 28 20 72  ill--;.    if( r
16e30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
16e40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50  eturn rc;.    pP
16e50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48  g->flags &= ~PGH
16e60 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20  DR_NEED_READ;.  
16e70 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
16e80 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
16e90 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a   }.  if( pPg ){.
16ea0 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73      /* No page s
16eb0 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65 78  hould ever be ex
16ec0 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20  plicitly rolled 
16ed0 62 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20  back that is in 
16ee0 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20  use, except.    
16ef0 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77 68  ** for page 1 wh
16f00 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75  ich is held in u
16f10 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b  se in order to k
16f20 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  eep the lock on 
16f30 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
16f40 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65  ase active. Howe
16f50 76 65 72 20 73 75 63 68 20 61 20 70 61 67 65 20  ver such a page 
16f60 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  may be rolled ba
16f70 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20  ck as a result. 
16f80 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65     ** of an inte
16f90 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c  rnal error resul
16fa0 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d  ting in an autom
16fb0 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20  atic call to.   
16fc0 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
16fd0 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20  Rollback()..    
16fe0 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61  */.    void *pDa
16ff0 74 61 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20  ta;.    pData = 
17000 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20  pPg->pData;.    
17010 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 28 75  memcpy(pData, (u
17020 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72  8*)aData, pPager
17030 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
17040 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
17050 65 72 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28  er(pPg);.    if(
17060 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28   isMainJrnl && (
17070 21 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70  !isSavepnt || *p
17080 4f 66 66 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e  Offset<=pPager->
17090 6a 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20  journalHdr) ){. 
170a0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
170b0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20  ontents of this 
170c0 70 61 67 65 20 77 65 72 65 20 6a 75 73 74 20 72  page were just r
170d0 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65  estored from the
170e0 20 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20   main .      ** 
170f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
17100 65 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d  en its content m
17110 75 73 74 20 62 65 20 61 73 20 74 68 65 79 20 77  ust be as they w
17120 65 72 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20  ere when the .  
17130 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
17140 6f 6e 20 77 61 73 20 66 69 72 73 74 20 6f 70 65  on was first ope
17150 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
17160 65 20 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68  e we can mark th
17170 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  e page.      ** 
17180 61 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20  as clean, since 
17190 74 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f  there will be no
171a0 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 69   need to write i
171b0 74 20 6f 75 74 20 74 6f 20 74 68 65 0a 20 20 20  t out to the.   
171c0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a     ** database..
171d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
171e0 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 65  * There is one e
171f0 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 69 73  xception to this
17200 20 72 75 6c 65 2e 20 49 66 20 74 68 65 20 70 61   rule. If the pa
17210 67 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  ge is being roll
17220 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  ed.      ** back
17230 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 73 61   as part of a sa
17240 76 65 70 6f 69 6e 74 20 28 6f 72 20 73 74 61 74  vepoint (or stat
17250 65 6d 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20  ement) rollback 
17260 66 72 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a  from an .      *
17270 2a 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69  * unsynced porti
17280 6f 6e 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  on of the main j
17290 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
172a0 6e 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65  n it is not safe
172b0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72  .      ** to mar
172c0 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  k the page as cl
172d0 65 61 6e 2e 20 54 68 69 73 20 69 73 20 62 65 63  ean. This is bec
172e0 61 75 73 65 20 6d 61 72 6b 69 6e 67 20 74 68 65  ause marking the
172f0 20 70 61 67 65 20 61 73 0a 20 20 20 20 20 20 2a   page as.      *
17300 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65  * clean will cle
17310 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ar the PGHDR_NEE
17320 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e  D_SYNC flag. Sin
17330 63 65 20 74 68 65 20 70 61 67 65 20 69 73 0a 20  ce the page is. 
17340 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20       ** already 
17350 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
17360 69 6c 65 20 28 72 65 63 6f 72 64 65 64 20 69 6e  ile (recorded in
17370 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
17380 6c 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  l) and.      ** 
17390 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
173a0 59 4e 43 20 66 6c 61 67 20 69 73 20 63 6c 65 61  YNC flag is clea
173b0 72 65 64 2c 20 69 66 20 74 68 65 20 70 61 67 65  red, if the page
173c0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 20   is written to. 
173d0 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69       ** again wi
173e0 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  thin this transa
173f0 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62  ction, it will b
17400 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  e marked as dirt
17410 79 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 74  y but.      ** t
17420 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
17430 4e 43 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74  NC flag will not
17440 20 62 65 20 73 65 74 2e 20 49 74 20 63 6f 75 6c   be set. It coul
17450 64 20 74 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c  d then potential
17460 6c 79 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 77  ly.      ** be w
17470 72 69 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20  ritten out into 
17480 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17490 65 20 62 65 66 6f 72 65 20 69 74 73 20 6a 6f 75  e before its jou
174a0 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20  rnal file.      
174b0 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 73 79  ** segment is sy
174c0 6e 63 65 64 2e 20 49 66 20 61 20 63 72 61 73 68  nced. If a crash
174d0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6f   occurs during o
174e0 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  r following this
174f0 2c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  ,.      ** datab
17500 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d  ase corruption m
17510 61 79 20 65 6e 73 75 65 2e 0a 20 20 20 20 20 20  ay ensue..      
17520 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
17530 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
17540 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 73  ager) );.      s
17550 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
17560 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
17570 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
17580 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
17590 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
175a0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
175b0 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
175c0 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70  /* If this was p
175d0 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74  age 1, then rest
175e0 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ore the value of
175f0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
17600 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69  s..    ** Do thi
17610 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63  s before any dec
17620 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66  oding. */.    if
17630 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
17640 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
17650 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
17660 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d  ((u8*)pData)[24]
17670 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  ,sizeof(pPager->
17680 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
17690 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f    }..    /* Deco
176a0 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74  de the page just
176b0 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20   read from disk 
176c0 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50  */.    CODEC1(pP
176d0 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
176e0 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51  ->pgno, 3, rc=SQ
176f0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20  LITE_NOMEM);.   
17700 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
17710 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a  lease(pPg);.  }.
17720 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17730 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
17740 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e  zMaster is the n
17750 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
17760 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20  journal file. A 
17770 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a  single journal.*
17780 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65  * file that refe
17790 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74  rred to the mast
177a0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
177b0 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f  has just been ro
177c0 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68  lled back..** Th
177d0 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
177e0 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  s if it is possi
177f0 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
17800 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
17810 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f   file,.** and do
17820 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a  es so if it is..
17830 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a  **.** Argument z
17840 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74  Master may point
17850 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70   to Pager.pTmpSp
17860 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66  ace. So that buf
17870 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61  fer is not .** a
17880 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
17890 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
178a0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ction..**.** Whe
178b0 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  n a master journ
178c0 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  al file is creat
178d0 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61  ed, it is popula
178e0 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ted with the nam
178f0 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66  es .** of all of
17900 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e   its child journ
17910 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61  als, one after a
17920 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65  nother, formatte
17930 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65  d as utf-8 .** e
17940 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65  ncoded text. The
17950 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69   end of each chi
17960 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ld journal file 
17970 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61  is marked with a
17980 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61   .** nul-termina
17990 74 6f 72 20 62 79 74 65 20 28 30 78 30 30 29 2e  tor byte (0x00).
179a0 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65   i.e. the entire
179b0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d   contents of a m
179c0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
179d0 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e   file for a tran
179e0 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e  saction involvin
179f0 67 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 20  g two databases 
17a00 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20  might be:.**.** 
17a10 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e    "/home/bill/a.
17a20 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68  db-journal\x00/h
17a30 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f  ome/bill/b.db-jo
17a40 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a  urnal\x00".**.**
17a50 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   A master journa
17a60 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20  l file may only 
17a70 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20  be deleted once 
17a80 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64  all of its child
17a90 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61   .** journals ha
17aa0 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  ve been rolled b
17ab0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
17ac0 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74  function reads t
17ad0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
17ae0 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
17af0 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20  l file into .** 
17b00 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73  memory and loops
17b10 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66   through each of
17b20 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e   the child journ
17b30 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a  al names. For.**
17b40 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   each child jour
17b50 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69  nal, it checks i
17b60 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20  f:.**.**   * if 
17b70 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
17b80 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66  l exists, and if
17b90 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68   so.**   * if th
17ba0 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
17bb0 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72  contains a refer
17bc0 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a  ence to master j
17bd0 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66  ournal .**     f
17be0 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a  ile zMaster.**.*
17bf0 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75  * If a child jou
17c00 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
17c10 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 62  d that matches b
17c20 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69 74 65  oth of the crite
17c30 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68  ria.** above, th
17c40 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
17c50 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  rns without doin
17c60 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65  g anything. Othe
17c70 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20  rwise, if.** no 
17c80 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  such child journ
17c90 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  al can be found,
17ca0 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73   file zMaster is
17cb0 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a   deleted from.**
17cc0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
17cd0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
17ce0 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  Delete()..**.** 
17cf0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77  If an IO error w
17d00 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74  ithin this funct
17d10 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  ion, an error co
17d20 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
17d30 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
17d40 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72   allocates memor
17d50 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c  y by calling sql
17d60 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66  ite3Malloc(). If
17d70 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a   an allocation.*
17d80 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f  * fails, SQLITE_
17d90 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
17da0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
17db0 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63   no IO or malloc
17dc0 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75   errors .** occu
17dd0 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r, SQLITE_OK is 
17de0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
17df0 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74  TODO: This funct
17e00 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20  ion allocates a 
17e10 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20  single block of 
17e20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a  memory to load.*
17e30 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  * the entire con
17e40 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73  tents of the mas
17e50 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
17e60 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a  . This could be.
17e70 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b  ** a couple of k
17e80 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d  ilobytes or so -
17e90 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72   potentially lar
17ea0 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61 67  ger than the pag
17eb0 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73  e .** size..*/.s
17ec0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
17ed0 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20  delmaster(Pager 
17ee0 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
17ef0 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
17f00 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
17f10 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
17f20 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  s;.  int rc;    
17f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17f40 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
17f50 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
17f60 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20  *pMaster;    /* 
17f70 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d  Malloc'd master-
17f80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
17f90 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c  criptor */.  sql
17fa0 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72  ite3_file *pJour
17fb0 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  nal;   /* Malloc
17fc0 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c  'd child-journal
17fd0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
17fe0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
17ff0 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20  terJournal = 0; 
18000 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d  /* Contents of m
18010 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
18020 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73  le */.  i64 nMas
18030 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
18040 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73    /* Size of mas
18050 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18060 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75   */.  char *zJou
18070 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
18080 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e  /* Pointer to on
18090 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e  e journal within
180a0 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68   MJ file */.  ch
180b0 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20  ar *zMasterPtr; 
180c0 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
180d0 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65   to hold MJ file
180e0 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72  name from a jour
180f0 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nal file */.  in
18100 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20 20 20  t nMasterPtr;   
18110 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e          /* Amoun
18120 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63  t of space alloc
18130 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65 72 50  ated to zMasterP
18140 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  tr[] */..  /* Al
18150 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
18160 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e   both the pJourn
18170 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66  al and pMaster f
18180 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e  ile descriptors.
18190 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73  .  ** If success
181a0 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61  ful, open the ma
181b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
181c0 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20  e for reading.. 
181d0 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20   */.  pMaster = 
181e0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
181f0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
18200 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  o(pVfs->szOsFile
18210 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61   * 2);.  pJourna
18220 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  l = (sqlite3_fil
18230 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73  e *)(((u8 *)pMas
18240 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f  ter) + pVfs->szO
18250 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70  sFile);.  if( !p
18260 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63  Master ){.    rc
18270 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
18280 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f  .  }else{.    co
18290 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
182a0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
182b0 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
182c0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
182d0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
182e0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
182f0 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72  zMaster, pMaster
18300 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d  , flags, 0);.  }
18310 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
18320 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
18330 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a  aster_out;..  /*
18340 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65   Load the entire
18350 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18360 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20  file into space 
18370 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20  obtained from.  
18380 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
18390 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
183a0 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
183b0 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74  rnal.   Also obt
183c0 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63 69  ain.  ** suffici
183d0 65 6e 74 20 73 70 61 63 65 20 28 69 6e 20 7a 4d  ent space (in zM
183e0 61 73 74 65 72 50 74 72 29 20 74 6f 20 68 6f 6c  asterPtr) to hol
183f0 64 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d  d the names of m
18400 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e  aster.  ** journ
18410 61 6c 20 66 69 6c 65 73 20 65 78 74 72 61 63 74  al files extract
18420 65 64 20 66 72 6f 6d 20 72 65 67 75 6c 61 72 20  ed from regular 
18430 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c  rollback-journal
18440 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  s..  */.  rc = s
18450 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
18460 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74  (pMaster, &nMast
18470 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
18480 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18490 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
184a0 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50  _out;.  nMasterP
184b0 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  tr = pVfs->mxPat
184c0 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74  hname+1;.  zMast
184d0 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  erJournal = sqli
184e0 74 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e  te3Malloc((int)n
184f0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20  MasterJournal + 
18500 6e 4d 61 73 74 65 72 50 74 72 20 2b 20 31 29 3b  nMasterPtr + 1);
18510 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a  .  if( !zMasterJ
18520 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63  ournal ){.    rc
18530 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
18540 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73  .    goto delmas
18550 74 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a  ter_out;.  }.  z
18560 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61  MasterPtr = &zMa
18570 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73  sterJournal[nMas
18580 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20  terJournal+1];. 
18590 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
185a0 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61  ead(pMaster, zMa
185b0 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e  sterJournal, (in
185c0 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  t)nMasterJournal
185d0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
185e0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
185f0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
18600 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
18610 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d  [nMasterJournal]
18620 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61   = 0;..  zJourna
18630 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  l = zMasterJourn
18640 61 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a  al;.  while( (zJ
18650 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f  ournal-zMasterJo
18660 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f  urnal)<nMasterJo
18670 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  urnal ){.    int
18680 20 65 78 69 73 74 73 3b 0a 20 20 20 20 72 63 20   exists;.    rc 
18690 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
186a0 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  s(pVfs, zJournal
186b0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
186c0 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
186d0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
186e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
186f0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
18700 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  out;.    }.    i
18710 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  f( exists ){.   
18720 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
18730 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65   journals pointe
18740 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74  d to by the mast
18750 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  er journal exist
18760 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e  s..      ** Open
18770 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66   it and check if
18780 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68   it points at th
18790 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
187a0 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f  . If.      ** so
187b0 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  , return without
187c0 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61   deleting the ma
187d0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
187e0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
187f0 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 69    int c;.      i
18800 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49  nt flags = (SQLI
18810 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
18820 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
18830 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  N_JOURNAL);.    
18840 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
18850 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72  Open(pVfs, zJour
18860 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66  nal, pJournal, f
18870 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20  lags, 0);.      
18880 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18890 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
188a0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
188b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
188c0 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
188d0 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c  ournal(pJournal,
188e0 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61   zMasterPtr, nMa
188f0 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20  sterPtr);.      
18900 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
18910 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
18920 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18930 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
18940 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
18950 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
18960 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30  c = zMasterPtr[0
18970 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a  ]!=0 && strcmp(z
18980 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74  MasterPtr, zMast
18990 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66  er)==0;.      if
189a0 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ( c ){.        /
189b0 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63  * We have a matc
189c0 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65  h. Do not delete
189d0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
189e0 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
189f0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
18a00 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
18a10 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72  .    }.    zJour
18a20 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53  nal += (sqlite3S
18a30 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c  trlen30(zJournal
18a40 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71  )+1);.  }. .  sq
18a50 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
18a60 73 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71  ster);.  rc = sq
18a70 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
18a80 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
18a90 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a  ..delmaster_out:
18aa0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
18ab0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  zMasterJournal);
18ac0 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29  .  if( pMaster )
18ad0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
18ae0 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
18af0 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
18b00 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a  en(pJournal) );.
18b10 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
18b20 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (pMaster);.  }. 
18b30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
18b40 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
18b50 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
18b60 68 61 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c  hange the actual
18b70 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
18b80 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69  abase .** file i
18b90 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
18ba0 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  m. This only hap
18bb0 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74  pens when commit
18bc0 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
18bd0 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e  on,.** or rollin
18be0 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  g back a transac
18bf0 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20  tion (including 
18c00 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68  rolling back a h
18c10 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a  ot-journal)..**.
18c20 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64  ** If the main d
18c30 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
18c40 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65  not open, or the
18c50 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
18c60 20 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44   either.** DBMOD
18c70 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   or OPEN state, 
18c80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
18c90 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
18ca0 69 73 65 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a  ise, the size .*
18cb0 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
18cc0 20 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67   changed to nPag
18cd0 65 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70  e pages (nPage*p
18ce0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
18cf0 62 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74  bytes). .** If t
18d00 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
18d10 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61 72  is currently lar
18d20 67 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20 70  ger than nPage p
18d30 61 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20 74  ages, then use t
18d40 68 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63  he VFS.** xTrunc
18d50 61 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 20  ate() method to 
18d60 74 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a  truncate it..**.
18d70 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74 20  ** Or, it might 
18d80 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
18d90 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  e that the file 
18da0 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c  on disk is small
18db0 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67  er than .** nPag
18dc0 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70  e pages. Some op
18dd0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
18de0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63  mplementations c
18df0 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20  an get confused 
18e00 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74  if .** you try t
18e10 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c  o truncate a fil
18e20 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74  e to some size t
18e30 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68  hat is larger th
18e40 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e  an it .** curren
18e50 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63  tly is, so detec
18e60 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64 20  t this case and 
18e70 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a  write a single z
18e80 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20  ero byte to .** 
18e90 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e  the end of the n
18ea0 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e  ew file instead.
18eb0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
18ec0 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c  sful, return SQL
18ed0 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f  ITE_OK. If an IO
18ee0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
18ef0 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a  ile modifying.**
18f00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18f10 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65  le, return the e
18f20 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65  rror code to the
18f30 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74   caller..*/.stat
18f40 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75  ic int pager_tru
18f50 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
18f60 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
18f70 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
18f80 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
18f90 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
18fa0 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
18fb0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
18fc0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
18fd0 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 0a 20 20  _READER );.  .  
18fe0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
18ff0 72 2d 3e 66 64 29 20 0a 20 20 20 26 26 20 28 70  r->fd) .   && (p
19000 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
19010 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
19020 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  D || pPager->eSt
19030 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29  ate==PAGER_OPEN)
19040 20 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 63   .  ){.    i64 c
19050 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53  urrentSize, newS
19060 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ize;.    assert(
19070 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
19080 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
19090 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49  ;.    /* TODO: I
190a0 73 20 69 74 20 73 61 66 65 20 74 6f 20 75 73 65  s it safe to use
190b0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a   Pager.dbFileSiz
190c0 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72  e here? */.    r
190d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
190e0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
190f0 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b  , &currentSize);
19100 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 70  .    newSize = p
19110 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a  Pager->pageSize*
19120 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20  (i64)nPage;.    
19130 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19140 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65  K && currentSize
19150 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  !=newSize ){.   
19160 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69     if( currentSi
19170 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  ze>newSize ){.  
19180 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19190 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
191a0 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65  ger->fd, newSize
191b0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
191c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
191d0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
191e0 65 72 2d 3e 66 64 2c 20 22 22 2c 20 31 2c 20 6e  er->fd, "", 1, n
191f0 65 77 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20  ewSize-1);.     
19200 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
19210 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19220 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
19230 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65  FileSize = nPage
19240 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19250 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
19260 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
19270 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
19280 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
19290 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65  variable for the
192a0 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20   given.** pager 
192b0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c  based on the val
192c0 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
192d0 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d  he xSectorSize m
192e0 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20  ethod.** of the 
192f0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
19300 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73  le. The sector s
19310 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ize will be used
19320 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74   used .** to det
19330 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20  ermine the size 
19340 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  and alignment of
19350 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
19360 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a  and .** master j
19370 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20  ournal pointers 
19380 77 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a  within created j
19390 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a  ournal files..**
193a0 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  .** For temporar
193b0 79 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65  y files the effe
193c0 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
193d0 65 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20  e is always 512 
193e0 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  bytes..**.** Oth
193f0 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d  erwise, for non-
19400 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c  temporary files,
19410 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
19420 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a  ector size is.**
19430 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
19440 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74  ned by the xSect
19450 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20  orSize() method 
19460 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32  rounded up to 32
19470 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73   if.** it is les
19480 73 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f  s than 32, or ro
19490 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41  unded down to MA
194a0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66  X_SECTOR_SIZE if
194b0 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65   it.** is greate
194c0 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f  r than MAX_SECTO
194d0 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69  R_SIZE..*/.stati
194e0 63 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72  c void setSector
194f0 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
19500 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  er){.  assert( i
19510 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
19520 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  ) || pPager->tem
19530 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20  pFile );..  if( 
19540 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
19550 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74  e ){.    /* Sect
19560 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20  or size doesn't 
19570 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f  matter for tempo
19580 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f  rary files. Also
19590 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  , the file.    *
195a0 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62  * may not have b
195b0 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20  een opened yet, 
195c0 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
195d0 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e OsSectorSize()
195e0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c  .    ** call wil
195f0 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20  l segfault..    
19600 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  */.    pPager->s
19610 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69  ectorSize = sqli
19620 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
19630 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d  pPager->fd);.  }
19640 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
19650 65 63 74 6f 72 53 69 7a 65 3c 33 32 20 29 7b 0a  ectorSize<32 ){.
19660 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
19670 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20  orSize = 512;.  
19680 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
19690 73 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53  sectorSize>MAX_S
196a0 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20  ECTOR_SIZE ){.  
196b0 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45    assert( MAX_SE
196c0 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29  CTOR_SIZE>=512 )
196d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  ;.    pPager->se
196e0 63 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f 53  ctorSize = MAX_S
196f0 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a  ECTOR_SIZE;.  }.
19700 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
19710 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  k the journal an
19720 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74  d thus restore t
19730 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19740 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65   to.** the state
19750 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72   it was in befor
19760 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b  e we started mak
19770 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a  ing changes.  .*
19780 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
19790 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20   file format is 
197a0 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a  as follows: .**.
197b0 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20  **  (1)  8 byte 
197c0 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20  prefix.  A copy 
197d0 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of aJournalMagic
197e0 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62  []..**  (2)  4 b
197f0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
19800 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
19810 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61  the number of va
19820 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73  lid page records
19830 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65  .**       in the
19840 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68   journal.  If th
19850 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  is value is 0xff
19860 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d  ffffff, then com
19870 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  pute the.**     
19880 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65    number of page
19890 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
198a0 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a  e journal size..
198b0 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20  **  (3)  4 byte 
198c0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
198d0 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
198e0 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f  initial value fo
198f0 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20  r the .**       
19900 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e  sanity checksum.
19910 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65  .**  (4)  4 byte
19920 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
19930 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
19940 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74  pages to truncat
19950 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64  e the.**       d
19960 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e  atabase to durin
19970 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  g a rollback..**
19980 20 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69    (5)  4 byte bi
19990 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
199a0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65   which is the se
199b0 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20  ctor size.  The 
199c0 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20  header.**       
199d0 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  is this many byt
199e0 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20  es in size..**  
199f0 28 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (6)  4 byte big-
19a00 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
19a10 68 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65  hich is the page
19a20 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20   size..**  (7)  
19a30 7a 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74  zero padding out
19a40 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
19a50 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38  tor size..**  (8
19a60 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  )  Zero or more 
19a70 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c  pages instances,
19a80 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73   each as follows
19a90 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  :.**        +  4
19aa0 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
19ab0 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  r..**        +  
19ac0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
19ad0 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a   bytes of data..
19ae0 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
19af0 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a  yte checksum.**.
19b00 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b  ** When we speak
19b10 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
19b20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20  header, we mean 
19b30 74 68 65 20 66 69 72 73 74 20 37 20 69 74 65 6d  the first 7 item
19b40 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68  s above..** Each
19b50 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f   entry in the jo
19b60 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74  urnal is an inst
19b70 61 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68 20  ance of the 8th 
19b80 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  item..**.** Call
19b90 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   the value from 
19ba0 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65  the second bulle
19bb0 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20  t "nRec".  nRec 
19bc0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
19bd0 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65  .** valid page e
19be0 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f  ntries in the jo
19bf0 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20  urnal.  In most 
19c00 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63  cases, you can c
19c10 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61  ompute the.** va
19c20 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d  lue of nRec from
19c30 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
19c40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
19c50 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a  But if a power.*
19c60 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  * failure occurr
19c70 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ed while the jou
19c80 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77  rnal was being w
19c90 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64  ritten, it could
19ca0 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20   be the.** case 
19cb0 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
19cc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
19cd0 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65  e had already be
19ce0 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74  en increased but
19cf0 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e  .** the extra en
19d00 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65  tries had not ye
19d10 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79  t made it safely
19d20 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75   to disk.  In su
19d30 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68  ch a case,.** th
19d40 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
19d50 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
19d60 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c  e file size woul
19d70 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20  d be too large. 
19d80 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61   For.** that rea
19d90 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75  son, we always u
19da0 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  se the nRec valu
19db0 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  e in the header.
19dc0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52  .**.** If the nR
19dd0 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  ec value is 0xff
19de0 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20  ffffff it means 
19df0 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64  that nRec should
19e00 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20   be computed.** 
19e10 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
19e20 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ze.  This value 
19e30 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  is used when the
19e40 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68   user selects th
19e50 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74  e.** no-sync opt
19e60 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  ion for the jour
19e70 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61  nal.  A power fa
19e80 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64  ilure could lead
19e90 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a   to corruption.*
19ea0 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  * in this case. 
19eb0 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20   But for things 
19ec0 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74  like temporary t
19ed0 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c  able (which will
19ee0 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77   be.** deleted w
19ef0 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73  hen the power is
19f00 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f   restored) we do
19f10 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a  n't care.  .**.*
19f20 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70  * If the file op
19f30 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72  ened as the jour
19f40 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
19f50 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a  a well-formed.**
19f60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
19f70 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20  en all pages up 
19f80 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72  to the first cor
19f90 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20  rupted page are 
19fa0 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28  rolled.** back (
19fb0 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74  or no pages if t
19fc0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
19fd0 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e  r is corrupted).
19fe0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
19ff0 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c  e.** is then del
1a000 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  eted and SQLITE_
1a010 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73  OK returned, jus
1a020 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75  t as if no corru
1a030 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65  ption had.** bee
1a040 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  n encountered..*
1a050 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f  *.** If an I/O o
1a060 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
1a070 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75   occurs, the jou
1a080 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74  rnal-file is not
1a090 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20   deleted.** and 
1a0a0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
1a0b0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
1a0c0 20 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d   The isHot param
1a0d0 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74  eter indicates t
1a0e0 68 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  hat we are tryin
1a0f0 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  g to rollback a 
1a100 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20  journal.** that 
1a110 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a  might be a hot j
1a120 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20  ournal.  Or, it 
1a130 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68  could be that th
1a140 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a  e journal is .**
1a150 20 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75   preserved becau
1a160 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44  se of JOURNALMOD
1a170 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55  E_PERSIST or JOU
1a180 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
1a190 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  E..** If the jou
1a1a0 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68  rnal really is h
1a1b0 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61  ot, reset the pa
1a1c0 67 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20  ger cache prior 
1a1d0 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20  rolling.** back 
1a1e0 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66  any content.  If
1a1f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1a200 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e  merely persisten
1a210 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a  t, no reset is.*
1a220 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  * needed..*/.sta
1a230 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
1a240 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
1a250 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29  ager, int isHot)
1a260 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
1a270 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
1a280 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b  pVfs;.  i64 szJ;
1a290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2a0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1a2b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
1a2c0 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  bytes */.  u32 n
1a2d0 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
1a2e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1a2f0 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   Records in the 
1a300 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
1a310 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
1a320 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
1a330 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
1a340 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
1a350 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1a360 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
1a370 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
1a380 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  es */.  int rc; 
1a390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3a0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1a3b0 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  of a subroutine 
1a3c0 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31  */.  int res = 1
1a3d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1a3e0 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
1a3f0 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  by sqlite3OsAcce
1a400 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ss() */.  char *
1a410 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20  zMaster = 0;    
1a420 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61     /* Name of ma
1a430 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1a440 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e  e if any */.  in
1a450 74 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  t needPagerReset
1a460 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74  ;      /* True t
1a470 6f 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69  o reset page pri
1a480 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65  or to first page
1a490 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20   rollback */..  
1a4a0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
1a4b0 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
1a4c0 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
1a4d0 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
1a4e0 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
1a4f0 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
1a500 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
1a510 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
1a520 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
1a530 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
1a540 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b  ger->jfd, &szJ);
1a550 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1a560 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29  E_OK || szJ==0 )
1a570 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
1a580 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
1a590 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74  /* Read the mast
1a5a0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
1a5b0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
1a5c0 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
1a5d0 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61  nt..  ** If a ma
1a5e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1a5f0 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  e name is specif
1a600 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c  ied, but the fil
1a610 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72  e is not.  ** pr
1a620 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74  esent on disk, t
1a630 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1a640 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64  is not hot and d
1a650 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
1a660 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62  be.  ** played b
1a670 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ack..  **.  ** T
1a680 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79  ODO: Technically
1a690 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
1a6a0 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75  s an error becau
1a6b0 73 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68  se it assumes th
1a6c0 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50  at.  ** buffer P
1a6d0 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69  ager.pTmpSpace i
1a6e0 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s (mxPathname+1)
1a6f0 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72   bytes or larger
1a700 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a  . i.e. that.  **
1a710 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69   (pPager->pageSi
1a720 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56  ze >= pPager->pV
1a730 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
1a740 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78  ). Using os_unix
1a750 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68  .c,.  **  mxPath
1a760 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69  name is 512, whi
1a770 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ch is the same a
1a780 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c  s the minimum al
1a790 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20  lowable value.  
1a7a0 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e  ** for pageSize.
1a7b0 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20  .  */.  zMaster 
1a7c0 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
1a7d0 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  ace;.  rc = read
1a7e0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
1a7f0 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
1a800 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
1a810 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
1a820 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1a830 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
1a840 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  0] ){.    rc = s
1a850 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
1a860 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
1a870 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
1a880 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20  TS, &res);.  }. 
1a890 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
1a8a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a8b0 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20  K || !res ){.   
1a8c0 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1a8d0 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  ck;.  }.  pPager
1a8e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
1a8f0 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73  ;.  needPagerRes
1a900 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f  et = isHot;..  /
1a910 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d  * This loop term
1a920 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68  inates either wh
1a930 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c  en a readJournal
1a940 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70  Hdr() or .  ** p
1a950 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
1a960 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65  e_page() call re
1a970 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
1a980 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
1a990 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a   .  ** occurs. .
1a9a0 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20    */.  while( 1 
1a9b0 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ){.    /* Read t
1a9c0 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20  he next journal 
1a9d0 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20  header from the 
1a9e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49  journal file.  I
1a9f0 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20  f there are.    
1aa00 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79  ** not enough by
1aa10 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20  tes left in the 
1aa20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
1aa30 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64   a complete head
1aa40 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74  er, or.    ** it
1aa50 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74   is corrupted, t
1aa60 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75  hen a process mu
1aa70 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69  st of failed whi
1aa80 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20  le writing it.. 
1aa90 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63     ** This indic
1aaa0 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72  ates nothing mor
1aab0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  e needs to be ro
1aac0 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a  lled back..    *
1aad0 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  /.    rc = readJ
1aae0 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
1aaf0 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e  , isHot, szJ, &n
1ab00 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20  Rec, &mxPg);.   
1ab10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ab20 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28  OK ){ .      if(
1ab30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1ab40 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1ab50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1ab60 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
1ab70 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
1ab80 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
1ab90 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ec is 0xffffffff
1aba0 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72  , then this jour
1abb0 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  nal was created 
1abc0 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20  by a process.   
1abd0 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e   ** working in n
1abe0 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69  o-sync mode. Thi
1abf0 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
1ac00 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
1ac10 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
1ac20 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67   consists of pag
1ac30 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  es, there are no
1ac40 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65   more journal he
1ac50 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20  aders. Compute. 
1ac60 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
1ac70 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e  of nRec based on
1ac80 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   this assumption
1ac90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1aca0 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66   nRec==0xfffffff
1acb0 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
1acc0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
1acd0 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
1ace0 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
1acf0 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69  .      nRec = (i
1ad00 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e  nt)((szJ - JOURN
1ad10 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1ad20 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ))/JOURNAL_PG_SZ
1ad30 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
1ad40 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
1ad50 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72   is 0 and this r
1ad60 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20  ollback is of a 
1ad70 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61  transaction crea
1ad80 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20  ted by this.    
1ad90 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69  ** process and i
1ada0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1adb0 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
1adc0 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20  e journal, then 
1add0 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  it means.    ** 
1ade0 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f  that this part o
1adf0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
1ae00 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62  s being filled b
1ae10 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  ut has not yet b
1ae20 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65  een.    ** synce
1ae30 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70  d to disk.  Comp
1ae40 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ute the number o
1ae50 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e  f pages based on
1ae60 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20   the remaining. 
1ae70 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68     ** size of th
1ae80 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
1ae90 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20     ** The third 
1aea0 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74  term of the test
1aeb0 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69   was added to fi
1aec0 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a  x ticket #2565..
1aed0 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c      ** When roll
1aee0 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a  ing back a hot j
1aef0 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20  ournal, nRec==0 
1af00 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61  always means tha
1af10 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a  t the next.    *
1af20 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a  * chunk of the j
1af30 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20  ournal contains 
1af40 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65  zero pages to be
1af50 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42   rolled back.  B
1af60 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64  ut.    ** when d
1af70 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20  oing a ROLLBACK 
1af80 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20  and the nRec==0 
1af90 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73  chunk is the las
1afa0 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a  t chunk in.    *
1afb0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  * the journal, i
1afc0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
1afd0 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
1afe0 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61  ontain additiona
1aff0 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74  l.    ** pages t
1b000 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72  hat need to be r
1b010 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74  olled back and t
1b020 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
1b030 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  f pages .    ** 
1b040 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
1b050 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ed based on the 
1b060 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a  journal file siz
1b070 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1b080 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73  ( nRec==0 && !is
1b090 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70  Hot &&.        p
1b0a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1b0b0 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
1b0c0 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
1b0d0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a  ->journalOff ){.
1b0e0 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
1b0f0 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  t)((szJ - pPager
1b100 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
1b110 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
1b120 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  ager));.    }.. 
1b130 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
1b140 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65   the first heade
1b150 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  r read from the 
1b160 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74  journal, truncat
1b170 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
1b180 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20  abase file back 
1b190 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
1b1a0 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
1b1b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1b1c0 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
1b1d0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
1b1e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1b1f0 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
1b200 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20  ger, mxPg);.    
1b210 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b220 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
1b230 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1b240 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b250 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1b260 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20   mxPg;.    }..  
1b270 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
1b280 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
1b290 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
1b2a0 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20  back into the . 
1b2b0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1b2c0 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20  ile and/or page 
1b2d0 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cache..    */.  
1b2e0 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65    for(u=0; u<nRe
1b2f0 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69  c; u++){.      i
1b300 66 28 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  f( needPagerRese
1b310 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  t ){.        pag
1b320 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
1b330 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50 61  ;.        needPa
1b340 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20  gerReset = 0;.  
1b350 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
1b360 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
1b370 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
1b380 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
1b390 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20  Off,0,1,0);.    
1b3a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b3b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
1b3c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
1b3d0 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
1b3e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1b3f0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1b400 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
1b410 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  zJ;.          br
1b420 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
1b430 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
1b440 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1b450 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
1b460 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  /* If the journa
1b470 6c 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e 63  l has been trunc
1b480 61 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f  ated, simply sto
1b490 70 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20 20  p reading and.  
1b4a0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
1b4b0 73 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ssing the journa
1b4c0 6c 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68 61  l. This might ha
1b4d0 70 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75 72  ppen if the jour
1b4e0 6e 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20  nal was.        
1b4f0 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74    ** not complet
1b500 65 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64 20  ely written and 
1b510 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20  synced prior to 
1b520 61 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68 61  a crash.  In tha
1b530 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  t.          ** c
1b540 61 73 65 2c 20 74 68 65 20 64 61 74 61 62 61 73  ase, the databas
1b550 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e 65  e should have ne
1b560 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ver been written
1b570 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
1b580 20 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63 65    ** first place
1b590 20 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f 20   so it is OK to 
1b5a0 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74  simply abandon t
1b5b0 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a  he rollback. */.
1b5c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1b5d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1b5e0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1b5f0 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
1b600 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1b610 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61  /* If we are una
1b620 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c  ble to rollback,
1b630 20 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e   quit and return
1b640 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20   the error.     
1b650 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54       ** code.  T
1b660 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74  his will cause t
1b670 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  he pager to ente
1b680 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
1b690 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  e.          ** s
1b6a0 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65  o that no furthe
1b6b0 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64  r harm will be d
1b6c0 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 68  one.  Perhaps th
1b6d0 65 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20  e next.         
1b6e0 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63   ** process to c
1b6f0 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62  ome along will b
1b700 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61  e able to rollba
1b710 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ck the database.
1b720 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
1b730 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1b740 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
1b750 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1b760 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45   }.  }.  /*NOTRE
1b770 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74  ACHED*/.  assert
1b780 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79  ( 0 );..end_play
1b790 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f  back:.  /* Follo
1b7a0 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  wing a rollback,
1b7b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b7c0 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63  le should be bac
1b7d0 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61  k in its origina
1b7e0 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69  l.  ** state pri
1b7f0 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
1b800 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
1b810 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68  on, so invoke th
1b820 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43  e.  ** SQLITE_FC
1b830 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
1b840 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65   file-control me
1b850 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20  thod to disable 
1b860 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69  the.  ** asserti
1b870 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  on that the tran
1b880 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
1b890 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20  was modified..  
1b8a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20  */.  assert(.   
1b8b0 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
1b8c0 74 68 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20 20 20  thods==0 ||.    
1b8d0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
1b8e0 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c  trol(pPager->fd,
1b8f0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
1b900 55 4e 43 48 41 4e 47 45 44 2c 30 29 3e 3d 53 51  UNCHANGED,0)>=SQ
1b910 4c 49 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20  LITE_OK.  );..  
1b920 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79 62  /* If this playb
1b930 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67  ack is happening
1b940 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
1b950 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e  s a result of an
1b960 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c   IO or .  ** mal
1b970 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f  loc error that o
1b980 63 63 75 72 72 65 64 20 61 66 74 65 72 20 74 68  ccurred after th
1b990 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1b9a0 20 77 61 73 20 75 70 64 61 74 65 64 20 62 75 74   was updated but
1b9b0 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68   .  ** before th
1b9c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
1b9d0 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65  s committed, the
1b9e0 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  n the change-cou
1b9f0 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66  nter .  ** modif
1ba00 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74  ication may just
1ba10 20 68 61 76 65 20 62 65 65 6e 20 72 65 76 65 72   have been rever
1ba20 74 65 64 2e 20 49 66 20 74 68 69 73 20 68 61 70  ted. If this hap
1ba30 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76  pens in exclusiv
1ba40 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68  e .  ** mode, th
1ba50 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74 72  en subsequent tr
1ba60 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f  ansactions perfo
1ba70 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e  rmed by the conn
1ba80 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a  ection will not.
1ba90 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20    ** update the 
1baa0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61  change-counter a
1bab0 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20  t all. This may 
1bac0 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e  lead to cache in
1bad0 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a  consistency.  **
1bae0 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74   problems for ot
1baf0 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 74  her processes at
1bb00 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74   some point in t
1bb10 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a  he future. So, j
1bb20 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65  ust.  ** in case
1bb30 20 74 68 69 73 20 68 61 73 20 68 61 70 70 65 6e   this has happen
1bb40 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68  ed, clear the ch
1bb50 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c  angeCountDone fl
1bb60 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70  ag now..  */.  p
1bb70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
1bb80 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
1bb90 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66  >tempFile;..  if
1bba0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1bbb0 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  ){.    zMaster =
1bbc0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
1bbd0 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  ce;.    rc = rea
1bbe0 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
1bbf0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
1bc00 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66  ter, pPager->pVf
1bc10 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
1bc20 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1bc30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1bc40 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1bc50 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61  QLITE_OK && !pPa
1bc60 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 0a 20 20 20  ger->noSync .   
1bc70 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  && (pPager->eSta
1bc80 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
1bc90 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72  _DBMOD || pPager
1bca0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1bcb0 4f 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72  OPEN).  ){.    r
1bcc0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
1bcd0 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  c(pPager->fd, pP
1bce0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
1bcf0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1bd00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bd10 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
1bd20 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
1bd30 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21  ger, zMaster[0]!
1bd40 3d 27 5c 30 27 29 3b 0a 20 20 20 20 74 65 73 74  ='\0');.    test
1bd50 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1bd60 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
1bd70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1bd80 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20  & zMaster[0] && 
1bd90 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  res ){.    /* If
1bda0 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73   there was a mas
1bdb0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ter journal and 
1bdc0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
1bdd0 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73  l return success
1bde0 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20  ,.    ** see if 
1bdf0 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
1be00 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
1be10 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ter journal..   
1be20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
1be30 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61  er_delmaster(pPa
1be40 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
1be50 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1be60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1be70 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65  }..  /* The Page
1be80 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
1be90 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62  iable may have b
1bea0 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c  een updated whil
1beb0 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62  e rolling.  ** b
1bec0 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72  ack a journal cr
1bed0 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
1bee0 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72  ss with a differ
1bef0 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a  ent sector size.
1bf00 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65    ** value. Rese
1bf10 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72  t it to the corr
1bf20 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ect value for th
1bf30 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f  is process..  */
1bf40 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  .  setSectorSize
1bf50 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
1bf60 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1bf70 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   Read the conten
1bf80 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f  t for page pPg o
1bf90 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ut of the databa
1bfa0 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f  se file and into
1bfb0 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e   .** pPg->pData.
1bfc0 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   A shared lock o
1bfd0 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62  r greater must b
1bfe0 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  e held on the da
1bff0 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62  tabase.** file b
1c000 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
1c010 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
1c020 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69  *.** If page 1 i
1c030 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65  s read, then the
1c040 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
1c050 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
1c060 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61  set to.** the va
1c070 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
1c080 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1c090 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
1c0a0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
1c0b0 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
1c0c0 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
1c0d0 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74  he caller..** Ot
1c0e0 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
1c0f0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
1c100 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
1c110 61 64 44 62 50 61 67 65 28 50 67 48 64 72 20 2a  adDbPage(PgHdr *
1c120 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
1c130 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1c140 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62  ger; /* Pager ob
1c150 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20  ject associated 
1c160 77 69 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f  with page pPg */
1c170 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
1c180 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20  Pg->pgno;       
1c190 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
1c1a0 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20  o read */.  int 
1c1b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1c1c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1c1d0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
1c1e0 20 69 73 49 6e 57 61 6c 20 3d 20 30 3b 20 20 20   isInWal = 0;   
1c1f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1c200 65 20 69 66 20 70 61 67 65 20 69 73 20 69 6e 20  e if page is in 
1c210 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  log file */.  in
1c220 74 20 70 67 73 7a 20 3d 20 70 50 61 67 65 72 2d  t pgsz = pPager-
1c230 3e 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e 75  >pageSize; /* Nu
1c240 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
1c250 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65   read */..  asse
1c260 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1c270 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
1c280 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   && !MEMDB );.  
1c290 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1c2a0 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20  Pager->fd) );.. 
1c2b0 20 69 66 28 20 4e 45 56 45 52 28 21 69 73 4f 70   if( NEVER(!isOp
1c2c0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20  en(pPager->fd)) 
1c2d0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1c2e0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1c2f0 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50  );.    memset(pP
1c300 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61  g->pData, 0, pPa
1c310 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1c320 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c330 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  E_OK;.  }..  if(
1c340 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1c350 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ger) ){.    /* T
1c360 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20 70  ry to pull the p
1c370 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72 69  age from the wri
1c380 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f  te-ahead log. */
1c390 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1c3a0 33 57 61 6c 52 65 61 64 28 70 50 61 67 65 72 2d  3WalRead(pPager-
1c3b0 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 73  >pWal, pgno, &is
1c3c0 49 6e 57 61 6c 2c 20 70 67 73 7a 2c 20 70 50 67  InWal, pgsz, pPg
1c3d0 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20  ->pData);.  }.  
1c3e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c3f0 4b 20 26 26 20 21 69 73 49 6e 57 61 6c 20 29 7b  K && !isInWal ){
1c400 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74  .    i64 iOffset
1c410 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
1c420 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
1c430 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
1c440 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
1c450 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61  ->fd, pPg->pData
1c460 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74 29  , pgsz, iOffset)
1c470 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1c480 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1c490 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
1c4a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1c4b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1c4c0 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69  pgno==1 ){.    i
1c4d0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  f( rc ){.      /
1c4e0 2a 20 49 66 20 74 68 65 20 72 65 61 64 20 69 73  * If the read is
1c4f0 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73   unsuccessful, s
1c500 65 74 20 74 68 65 20 64 62 46 69 6c 65 56 65 72  et the dbFileVer
1c510 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  s[] to something
1c520 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
1c530 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76  ill never be a v
1c540 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f  alid file versio
1c550 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d  n.  dbFileVers[]
1c560 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20   is a copy.     
1c570 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e   ** of bytes 24.
1c580 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62  .39 of the datab
1c590 61 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e  ase.  Bytes 28..
1c5a0 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  31 should always
1c5b0 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   be.      ** zer
1c5c0 6f 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66  o or the size of
1c5d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1c5e0 20 70 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e   page. Bytes 32.
1c5f0 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20  .35 and 35..39. 
1c600 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62       ** should b
1c610 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77  e page numbers w
1c620 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20 30  hich are never 0
1c630 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66  xffffffff.  So f
1c640 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  illing.      ** 
1c650 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1c660 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78  rs[] with all 0x
1c670 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20  ff bytes should 
1c680 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a  suffice..      *
1c690 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  *.      ** For a
1c6a0 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61  n encrypted data
1c6b0 62 61 73 65 2c 20 74 68 65 20 73 69 74 75 61 74  base, the situat
1c6c0 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70  ion is more comp
1c6d0 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20  lex:  bytes.    
1c6e0 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74    ** 24..39 of t
1c6f0 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20  he database are 
1c700 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75  white noise.  Bu
1c710 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  t the probabilit
1c720 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68  y of.      ** wh
1c730 69 74 65 20 6e 6f 69 73 69 6e 67 20 65 71 75 61  ite noising equa
1c740 6c 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66  ling 16 bytes of
1c750 20 30 78 66 66 20 69 73 20 76 61 6e 69 73 68 69   0xff is vanishi
1c760 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20  ngly small so.  
1c770 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64      ** we should
1c780 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20   still be ok..  
1c790 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d      */.      mem
1c7a0 73 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69  set(pPager->dbFi
1c7b0 6c 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69  leVers, 0xff, si
1c7c0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
1c7d0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
1c7e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a  else{.      u8 *
1c7f0 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28  dbFileVers = &((
1c800 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b  u8*)pPg->pData)[
1c810 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  24];.      memcp
1c820 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
1c830 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72  eVers, dbFileVer
1c840 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  s, sizeof(pPager
1c850 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
1c860 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45      }.  }.  CODE
1c870 43 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  C1(pPager, pPg->
1c880 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  pData, pgno, 3, 
1c890 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1c8a0 4d 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43  M);..  PAGER_INC
1c8b0 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
1c8c0 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  readdb_count);. 
1c8d0 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
1c8e0 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f  er->nRead);.  IO
1c8f0 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20  TRACE(("PGIN %p 
1c900 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1c910 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52  gno));.  PAGERTR
1c920 41 43 45 28 28 22 46 45 54 43 48 20 25 64 20 70  ACE(("FETCH %d p
1c930 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
1c940 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
1c950 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
1c960 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
1c970 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
1c980 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
1c990 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1c9a0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
1c9b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1c9c0 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20  is invoked once 
1c9d0 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 74 68  for each page th
1c9e0 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
1c9f0 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20  een .** written 
1ca00 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c  into the log fil
1ca10 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61  e when a WAL tra
1ca20 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
1ca30 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61  ed back..** Para
1ca40 6d 65 74 65 72 20 69 50 67 20 69 73 20 74 68 65  meter iPg is the
1ca50 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1ca60 73 61 69 64 20 70 61 67 65 2e 20 54 68 65 20 70  said page. The p
1ca70 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a  Ctx argument .**
1ca80 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70   is actually a p
1ca90 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
1caa0 67 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ger structure..*
1cab0 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67  *.** If page iPg
1cac0 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74   is present in t
1cad0 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61  he cache, and ha
1cae0 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
1caf0 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20   references,.** 
1cb00 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64 2e  it is discarded.
1cb10 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1cb20 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20  here are one or 
1cb30 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67  more outstanding
1cb40 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20  .** references, 
1cb50 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
1cb60 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f   is reloaded fro
1cb70 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
1cb80 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70  If the.** attemp
1cb90 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74  t to reload cont
1cba0 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ent from the dat
1cbb0 61 62 61 73 65 20 69 73 20 72 65 71 75 69 72 65  abase is require
1cbc0 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a  d and fails, .**
1cbd0 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
1cbe0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  e error code. Ot
1cbf0 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
1cc00 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
1cc10 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  t pagerUndoCallb
1cc20 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20  ack(void *pCtx, 
1cc30 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74  Pgno iPg){.  int
1cc40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1cc50 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1cc60 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74 78   = (Pager *)pCtx
1cc70 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
1cc80 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33  .  pPg = sqlite3
1cc90 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67  PagerLookup(pPag
1cca0 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28 20  er, iPg);.  if( 
1ccb0 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73  pPg ){.    if( s
1ccc0 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
1ccd0 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31  Refcount(pPg)==1
1cce0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1ccf0 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
1cd00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1cd10 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61     rc = readDbPa
1cd20 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  ge(pPg);.      i
1cd30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1cd40 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
1cd50 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50  er->xReiniter(pP
1cd60 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
1cd70 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1cd80 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ref(pPg);.    }.
1cd90 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
1cda0 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63  ly, if a transac
1cdb0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
1cdc0 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20  ack, any backup 
1cdd0 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20  processes are.  
1cde0 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20 64 61  ** updated as da
1cdf0 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74  ta is copied out
1ce00 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
1ce10 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74   journal and int
1ce20 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
1ce30 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ase. This is not
1ce40 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69   generally possi
1ce50 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20 64  ble with a WAL d
1ce60 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a  atabase, as.  **
1ce70 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76   rollback involv
1ce80 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61  es simply trunca
1ce90 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c  ting the log fil
1cea0 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66  e. Therefore, if
1ceb0 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72   one.  ** or mor
1cec0 65 20 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c  e frames have al
1ced0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1cee0 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61  en to the log (a
1cef0 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20  nd therefore .  
1cf00 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69  ** also copied i
1cf10 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64  nto the backup d
1cf20 61 74 61 62 61 73 65 73 29 20 61 73 20 70 61 72  atabases) as par
1cf30 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61  t of this transa
1cf40 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20  ction,.  ** the 
1cf50 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20  backups must be 
1cf60 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a  restarted..  */.
1cf70 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
1cf80 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
1cf90 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75  Backup);..  retu
1cfa0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1cfb0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1cfc0 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62   called to rollb
1cfd0 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
1cfe0 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62  n on a WAL datab
1cff0 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
1d000 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  nt pagerRollback
1d010 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
1d020 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
1d030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d040 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1d050 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  Code */.  PgHdr 
1d060 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  *pList;         
1d070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1d080 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
1d090 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20   to revert */.. 
1d0a0 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65   /* For all page
1d0b0 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  s in the cache t
1d0c0 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
1d0d0 79 20 64 69 72 74 79 20 6f 72 20 68 61 76 65 20  y dirty or have 
1d0e0 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65  already.  ** bee
1d0f0 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e  n written (but n
1d100 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f  ot committed) to
1d110 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64   the log file, d
1d120 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20  o one of the .  
1d130 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  ** following:.  
1d140 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63  **.  **   + Disc
1d150 61 72 64 20 74 68 65 20 63 61 63 68 65 64 20 70  ard the cached p
1d160 61 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74  age (if refcount
1d170 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20  ==0), or.  **   
1d180 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f  + Reload page co
1d190 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64  ntent from the d
1d1a0 61 74 61 62 61 73 65 20 28 69 66 20 72 65 66 63  atabase (if refc
1d1b0 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20  ount>0)..  */.  
1d1c0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1d1d0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
1d1e0 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ize;.  rc = sqli
1d1f0 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65  te3WalUndo(pPage
1d200 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e  r->pWal, pagerUn
1d210 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  doCallback, (voi
1d220 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70  d *)pPager);.  p
1d230 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
1d240 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
1d250 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1d260 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26    while( pList &
1d270 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1d280 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e  ){.    PgHdr *pN
1d290 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ext = pList->pDi
1d2a0 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rty;.    rc = pa
1d2b0 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
1d2c0 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
1d2d0 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
1d2e0 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
1d2f0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1d300 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1d310 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77   function is a w
1d320 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71  rapper around sq
1d330 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29  lite3WalFrames()
1d340 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67  . As well as log
1d350 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ging.** the cont
1d360 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74  ents of the list
1d370 20 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64   of pages headed
1d380 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65   by pList (conne
1d390 63 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c  cted by pDirty),
1d3a0 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
1d3b0 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61  n notifies any a
1d3c0 63 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f  ctive backup pro
1d3d0 63 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20  cesses that the 
1d3e0 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68  pages have.** ch
1d3f0 61 6e 67 65 64 2e 20 0a 2a 2f 20 0a 73 74 61 74  anged. .*/ .stat
1d400 69 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46  ic int pagerWalF
1d410 72 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a  rames(.  Pager *
1d420 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
1d430 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
1d440 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67  r object */.  Pg
1d450 48 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  Hdr *pList,     
1d460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d470 20 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20   List of frames 
1d480 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f  to log */.  Pgno
1d490 20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20   nTruncate,     
1d4a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1d4b0 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74  atabase size aft
1d4c0 65 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a  er this commit *
1d4d0 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74  /.  int isCommit
1d4e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d4f0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
1d500 68 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20  his is a commit 
1d510 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 5f 66 6c  */.  int sync_fl
1d520 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
1d530 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f       /* Flags to
1d540 20 70 61 73 73 20 74 6f 20 4f 73 53 79 6e 63 28   pass to OsSync(
1d550 29 20 28 6f 72 20 30 29 20 2a 2f 0a 29 7b 0a 20  ) (or 0) */.){. 
1d560 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1d570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d580 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1d590 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
1d5a0 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20  ager->pWal );.  
1d5b0 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
1d5c0 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57  rames(pPager->pW
1d5d0 61 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65  al, .      pPage
1d5e0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69  r->pageSize, pLi
1d5f0 73 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69  st, nTruncate, i
1d600 73 43 6f 6d 6d 69 74 2c 20 73 79 6e 63 5f 66 6c  sCommit, sync_fl
1d610 61 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ags.  );.  if( r
1d620 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1d630 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
1d640 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b  ){.    PgHdr *p;
1d650 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  .    for(p=pList
1d660 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  ; p; p=p->pDirty
1d670 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1d680 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
1d690 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d  ger->pBackup, p-
1d6a0 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e  >pgno, (u8 *)p->
1d6b0 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  pData);.    }.  
1d6c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1d6d0 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
1d6e0 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1d6f0 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a   on the WAL..**.
1d700 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1d710 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  used to be calle
1d720 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70  d "pagerOpenSnap
1d730 73 68 6f 74 28 29 22 20 62 65 63 61 75 73 65 20  shot()" because 
1d740 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a  it essentially.*
1d750 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68  * makes a snapsh
1d760 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ot of the databa
1d770 73 65 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  se at the curren
1d780 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20  t point in time 
1d790 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a  and preserves.**
1d7a0 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66   that snapshot f
1d7b0 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 72 65  or use by the re
1d7c0 61 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66  ader in spite of
1d7d0 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68   concurrently ch
1d7e0 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65  anges by.** othe
1d7f0 72 20 77 72 69 74 65 72 73 20 6f 72 20 63 68 65  r writers or che
1d800 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73  ckpointers..*/.s
1d810 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 42  tatic int pagerB
1d820 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
1d830 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
1d840 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
1d850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d860 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1d870 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68  code */.  int ch
1d880 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20  anged = 0;      
1d890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1d8a0 65 20 69 66 20 63 61 63 68 65 20 6d 75 73 74 20  e if cache must 
1d8b0 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61  be reset */..  a
1d8c0 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
1d8d0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
1d8e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1d8f0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1d900 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  EN || pPager->eS
1d910 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
1d920 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69  ER );..  /* sqli
1d930 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
1d940 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e  nsaction() was n
1d950 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  ot called for th
1d960 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20  e previous.  ** 
1d970 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c  transaction in l
1d980 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
1d990 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20  USIVE.  So call 
1d9a0 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20  it now.  If we. 
1d9b0 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69   ** are in locki
1d9c0 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61  ng_mode=NORMAL a
1d9d0 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73  nd EndRead() was
1d9e0 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c   previously call
1d9f0 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70  ed,.  ** the dup
1da00 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68  licate call is h
1da10 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  armless..  */.  
1da20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
1da30 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
1da40 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72  ger->pWal);..  r
1da50 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65  c = sqlite3WalBe
1da60 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
1da70 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  on(pPager->pWal,
1da80 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66   &changed);.  if
1da90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1daa0 26 26 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20  && changed ){.  
1dab0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
1dac0 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  ager);.  }..  re
1dad0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1dae0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1daf0 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72  is called as par
1db00 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74  t of the transit
1db10 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f  ion from PAGER_O
1db20 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f  PEN.** to PAGER_
1db30 52 45 41 44 45 52 20 73 74 61 74 65 20 74 6f 20  READER state to 
1db40 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69  determine the si
1db50 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1db60 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61  se file.** in pa
1db70 67 65 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68  ges (assuming th
1db80 65 20 70 61 67 65 20 73 69 7a 65 20 63 75 72 72  e page size curr
1db90 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
1dba0 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 29 2e  Pager.pageSize).
1dbb0 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72  .**.** If no err
1dbc0 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54  or occurs, SQLIT
1dbd0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1dbe0 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
1dbf0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
1dc00 20 69 6e 20 70 61 67 65 73 20 69 73 20 73 74 6f   in pages is sto
1dc10 72 65 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20  red in *pnPage. 
1dc20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72  Otherwise, an er
1dc30 72 6f 72 20 63 6f 64 65 20 28 70 65 72 68 61 70  ror code (perhap
1dc40 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52  s.** SQLITE_IOER
1dc50 52 5f 46 53 54 41 54 29 20 69 73 20 72 65 74 75  R_FSTAT) is retu
1dc60 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65  rned and *pnPage
1dc70 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66   is left unmodif
1dc80 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ied..*/.static i
1dc90 6e 74 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e  nt pagerPagecoun
1dca0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
1dcb0 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a   Pgno *pnPage){.
1dcc0 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20    Pgno nPage;   
1dcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dce0 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
1dcf0 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65  turn via *pnPage
1dd00 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20   */..  /* Query 
1dd10 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74  the WAL sub-syst
1dd20 65 6d 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  em for the datab
1dd30 61 73 65 20 73 69 7a 65 2e 20 54 68 65 20 57 61  ase size. The Wa
1dd40 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66  lDbsize().  ** f
1dd50 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
1dd60 7a 65 72 6f 20 69 66 20 74 68 65 20 57 41 4c 20  zero if the WAL 
1dd70 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65  is not open (i.e
1dd80 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29  . Pager.pWal==0)
1dd90 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68 65  , or.  ** if the
1dda0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69   database size i
1ddb0 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  s not available.
1ddc0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ddd0 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61  ze is not.  ** a
1dde0 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68  vailable from th
1ddf0 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d  e WAL sub-system
1de00 20 69 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   if the log file
1de10 20 69 73 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a   is empty or.  *
1de20 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61  * contains no va
1de30 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64 20 74 72  lid committed tr
1de40 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f  ansactions..  */
1de50 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1de60 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1de70 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72  _OPEN );.  asser
1de80 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
1de90 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  >=SHARED_LOCK ||
1dea0 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
1deb0 6f 63 6b 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d  ock );.  nPage =
1dec0 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a   sqlite3WalDbsiz
1ded0 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  e(pPager->pWal);
1dee0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
1def0 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20  tabase size was 
1df00 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 72  not available fr
1df10 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73  om the WAL sub-s
1df20 79 73 74 65 6d 2c 0a 20 20 2a 2a 20 64 65 74 65  ystem,.  ** dete
1df30 72 6d 69 6e 65 20 69 74 20 62 61 73 65 64 20 6f  rmine it based o
1df40 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
1df50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1df60 20 49 66 20 74 68 65 20 73 69 7a 65 0a 20 20 2a   If the size.  *
1df70 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
1df80 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e  e file is not an
1df90 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c   integer multipl
1dfa0 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69  e of the page-si
1dfb0 7a 65 2c 0a 20 20 2a 2a 20 72 6f 75 6e 64 20 64  ze,.  ** round d
1dfc0 6f 77 6e 20 74 6f 20 74 68 65 20 6e 65 61 72 65  own to the neare
1dfd0 73 74 20 70 61 67 65 2e 20 45 78 63 65 70 74 2c  st page. Except,
1dfe0 20 61 6e 79 20 66 69 6c 65 20 6c 61 72 67 65 72   any file larger
1dff0 20 74 68 61 6e 20 30 0a 20 20 2a 2a 20 62 79 74   than 0.  ** byt
1e000 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f  es in size is co
1e010 6e 73 69 64 65 72 65 64 20 74 6f 20 63 6f 6e 74  nsidered to cont
1e020 61 69 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ain at least one
1e030 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
1e040 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ( nPage==0 ){.  
1e050 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20    i64 n = 0;    
1e060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e070 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 66 69  /* Size of db fi
1e080 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
1e090 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
1e0a0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
1e0b0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1e0c0 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f  e );.    if( isO
1e0d0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1e0e0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
1e0f0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
1e100 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
1e110 26 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  &n);.      if( r
1e120 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e130 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1e140 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1e150 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67  .    nPage = (Pg
1e160 6e 6f 29 28 6e 20 2f 20 70 50 61 67 65 72 2d 3e  no)(n / pPager->
1e170 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69  pageSize);.    i
1e180 66 28 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 6e  f( nPage==0 && n
1e190 3e 30 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  >0 ){.      nPag
1e1a0 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 1;.    }.  }
1e1b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
1e1c0 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20  rrent number of 
1e1d0 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
1e1e0 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  e is greater tha
1e1f0 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69  n the.  ** confi
1e200 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61  gured maximum pa
1e210 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72  ger number, incr
1e220 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64  ease the allowed
1e230 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74   limit so.  ** t
1e240 68 61 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e  hat the file can
1e250 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20   be read..  */. 
1e260 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65   if( nPage>pPage
1e270 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20  r->mxPgno ){.   
1e280 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
1e290 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20  = (Pgno)nPage;. 
1e2a0 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20   }..  *pnPage = 
1e2b0 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  nPage;.  return 
1e2c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
1e2d0 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68  *.** Check if th
1e2e0 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61  e *-wal file tha
1e2f0 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
1e300 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70   the database op
1e310 65 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a  ened by pPager.*
1e320 2a 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20  * exists if the 
1e330 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
1e340 65 6d 70 79 2c 20 6f 72 20 76 65 72 69 66 79 20  empy, or verify 
1e350 74 68 61 74 20 74 68 65 20 2a 2d 77 61 6c 20 66  that the *-wal f
1e360 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  ile does.** not 
1e370 65 78 69 73 74 20 28 62 79 20 64 65 6c 65 74 69  exist (by deleti
1e380 6e 67 20 69 74 29 20 69 66 20 74 68 65 20 64 61  ng it) if the da
1e390 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 65  tabase file is e
1e3a0 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  mpty..**.** If t
1e3b0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
1e3c0 6f 74 20 65 6d 70 74 79 20 61 6e 64 20 74 68 65  ot empty and the
1e3d0 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73   *-wal file exis
1e3e0 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 70 61 67  ts, open the pag
1e3f0 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64  er.** in WAL mod
1e400 65 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  e.  If the datab
1e410 61 73 65 20 69 73 20 65 6d 70 74 79 20 6f 72 20  ase is empty or 
1e420 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65  if no *-wal file
1e430 20 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69   exists and.** i
1e440 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
1e450 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61 67  s, make sure Pag
1e460 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69  er.journalMode i
1e470 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20  s not set to.** 
1e480 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1e490 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  E_WAL..**.** Ret
1e4a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  urn SQLITE_OK or
1e4b0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   an error code..
1e4c0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
1e4d0 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48 41   must hold a SHA
1e4e0 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  RED lock on the 
1e4f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
1e500 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75   call this.** fu
1e510 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65 20  nction. Because 
1e520 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
1e530 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65  k on the db file
1e540 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
1e550 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c  delete .** a WAL
1e560 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79   on a none-empty
1e570 20 64 61 74 61 62 61 73 65 2c 20 74 68 69 73 20   database, this 
1e580 65 6e 73 75 72 65 73 20 74 68 65 72 65 20 69 73  ensures there is
1e590 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69 74 69   no race conditi
1e5a0 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74  on .** between t
1e5b0 68 65 20 78 41 63 63 65 73 73 28 29 20 62 65 6c  he xAccess() bel
1e5c0 6f 77 20 61 6e 64 20 61 6e 20 78 44 65 6c 65 74  ow and an xDelet
1e5d0 65 28 29 20 62 65 69 6e 67 20 65 78 65 63 75 74  e() being execut
1e5e0 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f  ed by some .** o
1e5f0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  ther connection.
1e600 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1e610 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
1e620 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  sent(Pager *pPag
1e630 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
1e640 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
1e650 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1e660 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
1e670 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1e680 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52  ger->eLock>=SHAR
1e690 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65  ED_LOCK || pPage
1e6a0 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 3b  r->noReadlock );
1e6b0 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
1e6c0 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
1e6d0 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20   int isWal;     
1e6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e6f0 2a 20 54 72 75 65 20 69 66 20 57 41 4c 20 66 69  * True if WAL fi
1e700 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20  le exists */.   
1e710 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
1e720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e730 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 64 61  * Size of the da
1e740 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
1e750 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
1e760 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
1e770 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  &nPage);.    if(
1e780 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1e790 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  .    if( nPage==
1e7a0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1e7b0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
1e7c0 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
1e7d0 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a  ager->zWal, 0);.
1e7e0 20 20 20 20 20 20 69 73 57 61 6c 20 3d 20 30 3b        isWal = 0;
1e7f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e800 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1e810 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20  Access(.        
1e820 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20    pPager->pVfs, 
1e830 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51  pPager->zWal, SQ
1e840 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
1e850 54 53 2c 20 26 69 73 57 61 6c 0a 20 20 20 20 20  TS, &isWal.     
1e860 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
1e870 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e880 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 57  ){.      if( isW
1e890 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  al ){.        te
1e8a0 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 50  stcase( sqlite3P
1e8b0 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70  cachePagecount(p
1e8c0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
1e8d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
1e8e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
1e8f0 70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30  penWal(pPager, 0
1e900 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
1e910 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
1e920 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
1e930 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b  URNALMODE_WAL ){
1e940 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1e950 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
1e960 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
1e970 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d  _DELETE;.      }
1e980 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1e990 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
1e9a0 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
1e9b0 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65   savepoint pSave
1e9c0 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53  point. Or, if pS
1e9d0 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20  avepoint==NULL, 
1e9e0 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a  then playback.**
1e9f0 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74   the entire mast
1ea00 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
1ea10 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65 70   The case pSavep
1ea20 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72  oint==NULL occur
1ea30 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c  s when .** a ROL
1ea40 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64  LBACK TO command
1ea50 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61   is invoked on a
1ea60 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20   SAVEPOINT that 
1ea70 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
1ea80 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a   .** savepoint..
1ea90 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65  **.** When pSave
1eaa0 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  point is not NUL
1eab0 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e  L (meaning a non
1eac0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76  -transaction sav
1ead0 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65  epoint is .** be
1eae0 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29  ing rolled back)
1eaf0 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62  , then the rollb
1eb00 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ack consists of 
1eb10 75 70 20 74 6f 20 74 68 72 65 65 20 73 74 61 67  up to three stag
1eb20 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64  es,.** performed
1eb30 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70   in the order sp
1eb40 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  ecified:.**.**  
1eb50 20 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c 61   * Pages are pla
1eb60 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
1eb70 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
1eb80 74 61 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a  tarting at byte.
1eb90 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50 61  **     offset Pa
1eba0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66  gerSavepoint.iOf
1ebb0 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75  fset and continu
1ebc0 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50  ing to .**     P
1ebd0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
1ebe0 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20  drOffset, or to 
1ebf0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
1ec00 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ain journal.**  
1ec10 20 20 20 66 69 6c 65 20 69 66 20 50 61 67 65 72     file if Pager
1ec20 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
1ec30 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a  fset is zero..**
1ec40 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72  .**   * If Pager
1ec50 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
1ec60 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f  fset is not zero
1ec70 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65  , then pages are
1ec80 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62   played.**     b
1ec90 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f  ack starting fro
1eca0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
1ecb0 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  ader immediately
1ecc0 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20   following .**  
1ecd0 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
1ece0 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20  t.iHdrOffset to 
1ecf0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
1ed00 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
1ed10 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65  ..**.**   * Page
1ed20 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65  s are then playe
1ed30 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
1ed40 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
1ed50 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20  , starting.**   
1ed60 20 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72    with the Pager
1ed70 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65  Savepoint.iSubRe
1ed80 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  c and continuing
1ed90 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a   to the end of.*
1eda0 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  *     the journa
1edb0 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  l file..**.** Th
1edc0 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c  roughout the rol
1edd0 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65  lback process, e
1ede0 61 63 68 20 74 69 6d 65 20 61 20 70 61 67 65 20  ach time a page 
1edf0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
1ee00 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  the.** correspon
1ee10 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20  ding bit is set 
1ee20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74 72 75  in a bitvec stru
1ee30 63 74 75 72 65 20 28 76 61 72 69 61 62 6c 65 20  cture (variable 
1ee40 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20  pDone in the.** 
1ee50 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62  implementation b
1ee60 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75  elow). This is u
1ee70 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  sed to ensure th
1ee80 61 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c  at a page is onl
1ee90 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y.** rolled back
1eea0 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
1eeb0 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  it is encountere
1eec0 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72  d in either jour
1eed0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53  nal..**.** If pS
1eee0 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c  avepoint is NULL
1eef0 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65  , then pages are
1ef00 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63   only played bac
1ef10 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a  k from the main.
1ef20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
1ef30 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
1ef40 64 20 66 6f 72 20 61 20 62 69 74 76 65 63 20 69  d for a bitvec i
1ef50 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
1ef60 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ** In either cas
1ef70 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61  e, before playba
1ef80 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65  ck commences the
1ef90 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61   Pager.dbSize va
1efa0 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73  riable.** is res
1efb0 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
1efc0 74 68 61 74 20 69 74 20 68 65 6c 64 20 61 74 20  that it held at 
1efd0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1efe0 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28   savepoint .** (
1eff0 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  or transaction).
1f000 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61 20   No page with a 
1f010 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61  page-number grea
1f020 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61  ter than this va
1f030 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64  lue.** is played
1f040 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73   back. If one is
1f050 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20   encountered it 
1f060 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65  is simply skippe
1f070 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1f080 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61   pagerPlaybackSa
1f090 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70  vepoint(Pager *p
1f0a0 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76 65  Pager, PagerSave
1f0b0 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e  point *pSavepoin
1f0c0 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  t){.  i64 szJ;  
1f0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f0e0 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a 65  * Effective size
1f0f0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
1f100 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48  rnal */.  i64 iH
1f110 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
1f120 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72     /* End of fir
1f130 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61  st segment of ma
1f140 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  in-journal recor
1f150 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ds */.  int rc =
1f160 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
1f170 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1f180 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
1f190 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ne = 0;       /*
1f1a0 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72   Bitvec to ensur
1f1b0 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62  e pages played b
1f1c0 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f  ack only once */
1f1d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1f1e0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
1f1f0 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73  R_ERROR );.  ass
1f200 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1f210 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
1f220 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f  R_LOCKED );..  /
1f230 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74  * Allocate a bit
1f240 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74  vec to use to st
1f250 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70  ore the set of p
1f260 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  ages rolled back
1f270 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
1f280 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e  oint ){.    pDon
1f290 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  e = sqlite3Bitve
1f2a0 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69  cCreate(pSavepoi
1f2b0 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20  nt->nOrig);.    
1f2c0 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20  if( !pDone ){.  
1f2d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1f2e0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
1f2f0 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
1f300 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 62   database size b
1f310 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ack to the value
1f320 20 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74   it was before t
1f330 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20  he savepoint .  
1f340 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74 65  ** being reverte
1f350 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20  d was opened..  
1f360 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
1f370 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  ize = pSavepoint
1f380 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e   ? pSavepoint->n
1f390 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64  Orig : pPager->d
1f3a0 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70 50 61  bOrigSize;.  pPa
1f3b0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
1f3c0 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
1f3d0 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20  empFile;..  if( 
1f3e0 21 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70  !pSavepoint && p
1f3f0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
1f400 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
1f410 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61   pagerRollbackWa
1f420 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  l(pPager);.  }..
1f430 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d    /* Use pPager-
1f440 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74  >journalOff as t
1f450 68 65 20 65 66 66 65 63 74 69 76 65 20 73 69 7a  he effective siz
1f460 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f  e of the main ro
1f470 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
1f480 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c  nal.  The actual
1f490 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c   file might be l
1f4a0 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20  arger than this 
1f4b0 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f  in.  ** PAGER_JO
1f4c0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
1f4d0 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52  TE or PAGER_JOUR
1f4e0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e  NALMODE_PERSIST.
1f4f0 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20    But anything. 
1f500 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d   ** past pPager-
1f510 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f  >journalOff is o
1f520 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e  ff-limits to us.
1f530 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50  .  */.  szJ = pP
1f540 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1f550 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ;.  assert( page
1f560 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
1f570 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a  =0 || szJ==0 );.
1f580 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72  .  /* Begin by r
1f590 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f  olling back reco
1f5a0 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  rds from the mai
1f5b0 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69  n journal starti
1f5c0 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72  ng at.  ** Pager
1f5d0 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65  Savepoint.iOffse
1f5e0 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  t and continuing
1f5f0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75   to the next jou
1f600 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a  rnal header..  *
1f610 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20 62 65  * There might be
1f620 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   records in the 
1f630 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61  main journal tha
1f640 74 20 68 61 76 65 20 61 20 70 61 67 65 20 6e 75  t have a page nu
1f650 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65  mber.  ** greate
1f660 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
1f670 6e 74 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  nt database size
1f680 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65   (pPager->dbSize
1f690 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a  ) but those.  **
1f6a0 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64   will be skipped
1f6b0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20   automatically. 
1f6c0 20 50 61 67 65 73 20 61 72 65 20 61 64 64 65 64   Pages are added
1f6d0 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65   to pDone as the
1f6e0 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65  y.  ** are playe
1f6f0 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  d back..  */.  i
1f700 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26  f( pSavepoint &&
1f710 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
1f720 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69 48 64  ager) ){.    iHd
1f730 72 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e  rOff = pSavepoin
1f740 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20  t->iHdrOffset ? 
1f750 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72  pSavepoint->iHdr
1f760 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20  Offset : szJ;.  
1f770 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1f780 6c 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e  lOff = pSavepoin
1f790 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20  t->iOffset;.    
1f7a0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
1f7b0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
1f7c0 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f  journalOff<iHdrO
1f7d0 66 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ff ){.      rc =
1f7e0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
1f7f0 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
1f800 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
1f810 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20  lOff, pDone, 1, 
1f820 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
1f830 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
1f840 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65  _DONE );.  }else
1f850 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
1f860 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
1f870 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65  }..  /* Continue
1f880 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65   rolling back re
1f890 63 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65  cords out of the
1f8a0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
1f8b0 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74  arting at.  ** t
1f8c0 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
1f8d0 20 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64   header seen and
1f8e0 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69   continuing unti
1f8f0 6c 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  l the effective 
1f900 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  end.  ** of the 
1f910 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
1f920 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20  e.  Continue to 
1f930 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67  skip out-of-rang
1f940 65 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a  e pages and.  **
1f950 20 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67   continue adding
1f960 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61   pages rolled ba
1f970 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a  ck to pDone..  *
1f980 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  /.  while( rc==S
1f990 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
1f9a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73  er->journalOff<s
1f9b0 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69  zJ ){.    u32 ii
1f9c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1f9d0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
1f9e0 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20      u32 nJRec = 
1f9f0 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  0;     /* Number
1fa00 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f   of Journal Reco
1fa10 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64  rds */.    u32 d
1fa20 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72  ummy;.    rc = r
1fa30 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
1fa40 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e  ager, 0, szJ, &n
1fa50 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  JRec, &dummy);. 
1fa60 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
1fa70 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20  QLITE_DONE );.. 
1fa80 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
1fa90 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   "pPager->journa
1faa0 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
1fab0 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
1fac0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22  ger->journalOff"
1fad0 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20  .    ** test is 
1fae0 72 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65  related to ticke
1faf0 74 20 23 32 35 36 35 2e 20 20 53 65 65 20 74 68  t #2565.  See th
1fb00 65 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20  e discussion in 
1fb10 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  the.    ** pager
1fb20 5f 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63  _playback() func
1fb30 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f  tion for additio
1fb40 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
1fb50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1fb60 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26  nJRec==0 .     &
1fb70 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
1fb80 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
1fb90 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
1fba0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
1fbb0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52      ){.      nJR
1fbc0 65 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20  ec = (u32)((szJ 
1fbd0 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
1fbe0 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  lOff)/JOURNAL_PG
1fbf0 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
1fc00 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30    }.    for(ii=0
1fc10 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
1fc20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70  && ii<nJRec && p
1fc30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1fc40 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20  f<szJ; ii++){.  
1fc50 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
1fc60 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
1fc70 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
1fc80 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44  ->journalOff, pD
1fc90 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  one, 1, 1);.    
1fca0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
1fcb0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
1fcc0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72  .  }.  assert( r
1fcd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1fce0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1fcf0 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a  ff>=szJ );..  /*
1fd00 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62   Finally,  rollb
1fd10 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74  ack pages from t
1fd20 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
1fd30 20 50 61 67 65 20 74 68 61 74 20 77 65 72 65 0a   Page that were.
1fd40 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20    ** previously 
1fd50 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20  rolled back out 
1fd60 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
1fd70 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e  nal (and are hen
1fd80 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a  ce in pDone).  *
1fd90 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65  * will be skippe
1fda0 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65  d.  Out-of-range
1fdb0 20 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20   pages are also 
1fdc0 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
1fdd0 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29  if( pSavepoint )
1fde0 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20  {.    u32 ii;   
1fdf0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1fe00 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
1fe10 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70 53 61  i64 offset = pSa
1fe20 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63  vepoint->iSubRec
1fe30 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
1fe40 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28 20  Size);..    if( 
1fe50 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
1fe60 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
1fe70 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76 65  = sqlite3WalSave
1fe80 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65 72  pointUndo(pPager
1fe90 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f 69  ->pWal, pSavepoi
1fea0 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20  nt->aWalData);. 
1feb0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
1fec0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62  pSavepoint->iSub
1fed0 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  Rec; rc==SQLITE_
1fee0 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d  OK && ii<pPager-
1fef0 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b  >nSubRec; ii++){
1ff00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f  .      assert( o
1ff10 66 66 73 65 74 3d 3d 69 69 2a 28 34 2b 70 50 61  ffset==ii*(4+pPa
1ff20 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29  ger->pageSize) )
1ff30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
1ff40 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
1ff50 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66  page(pPager, &of
1ff60 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20  fset, pDone, 0, 
1ff70 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
1ff80 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
1ff90 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20  _DONE );.  }..  
1ffa0 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
1ffb0 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69  troy(pDone);.  i
1ffc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ffd0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
1ffe0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
1fff0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
20000 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
20010 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
20020 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
20030 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
20040 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76  re allowed..*/.v
20050 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
20060 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67  SetCachesize(Pag
20070 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
20080 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74  mxPage){.  sqlit
20090 65 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65  e3PcacheSetCache
200a0 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43  size(pPager->pPC
200b0 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d  ache, mxPage);.}
200c0 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74  ../*.** Adjust t
200d0 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66  he robustness of
200e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
200f0 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
20100 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20  S crashes.** or 
20110 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62  power failures b
20120 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e  y changing the n
20130 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29  umber of syncs()
20140 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a  s when writing.*
20150 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
20160 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61  ournal.  There a
20170 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a  re three levels:
20180 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20  .**.**    OFF   
20190 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e      sqlite3OsSyn
201a0 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c  c() is never cal
201b0 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  led.  This is th
201c0 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20  e default.**    
201d0 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65            for te
201e0 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e  mporary and tran
201f0 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a  sient files..**.
20200 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20  **    NORMAL    
20210 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
20220 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72  ynced once befor
20230 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
20240 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
20250 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20        database. 
20260 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
20270 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65  y adequate prote
20280 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20  ction, but.**   
20290 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73             it is
202a0 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70   theoretically p
202b0 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20  ossible, though 
202c0 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a  very unlikely,.*
202d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
202e0 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e  hat an inopertun
202f0 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  e power failure 
20300 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20  could leave the 
20310 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
20320 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61          in a sta
20330 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63  te which would c
20340 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74  ause damage to t
20350 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
20360 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e              when
20370 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61   it is rolled ba
20380 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c  ck..**.**    FUL
20390 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  L      The journ
203a0 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69  al is synced twi
203b0 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
203c0 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
203d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
203e0 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d  tabase (with som
203f0 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  e additional inf
20400 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e  ormation - the n
20410 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20  Rec field.**    
20420 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
20430 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
20440 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  - being written 
20450 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  in between the t
20460 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  wo.**           
20470 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77     syncs).  If w
20480 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72  e assume that wr
20490 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  iting a.**      
204a0 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64          single d
204b0 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74  isk sector is at
204c0 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20  omic, then this 
204d0 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a  mode provides.**
204e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
204f0 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65  surance that the
20500 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f   journal will no
20510 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74  t be corrupted t
20520 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  o the.**        
20530 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63        point of c
20540 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f  ausing damage to
20550 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75   the database du
20560 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ring rollback..*
20570 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c  *.** Numeric val
20580 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ues associated w
20590 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73  ith these states
205a0 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52   are OFF==1, NOR
205b0 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55  MAL=2,.** and FU
205c0 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  LL=3..*/.#ifndef
205d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
205e0 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20  ER_PRAGMAS.void 
205f0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
20600 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72  afetyLevel(Pager
20610 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65   *pPager, int le
20620 76 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73  vel, int bFullFs
20630 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ync){.  pPager->
20640 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c  noSync =  (level
20650 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==1 || pPager->t
20660 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20  empFile) ?1:0;. 
20670 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
20680 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26  c = (level==3 &&
20690 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
206a0 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67  le) ?1:0;.  pPag
206b0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d  er->sync_flags =
206c0 20 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c   (bFullFsync?SQL
206d0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51  ITE_SYNC_FULL:SQ
206e0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
206f0 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
20700 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
20710 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
20720 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
20730 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62  whenever the lib
20740 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73  rary.** attempts
20750 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
20760 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73  rary file.  This
20770 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
20780 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
20790 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
207a0 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64   only.  .*/.#ifd
207b0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
207c0 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  nt sqlite3_opent
207d0 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  emp_count = 0;.#
207e0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  endif../*.** Ope
207f0 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
20800 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  le..**.** Write 
20810 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
20820 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e  tor into *pFile.
20830 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
20840 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a  K on success .**
20850 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
20860 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
20870 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c  fail. The OS wil
20880 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
20890 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74  .** delete the t
208a0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68  emporary file wh
208b0 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
208c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73  .**.** The flags
208d0 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56   passed to the V
208e0 46 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29  FS layer xOpen()
208f0 20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20   call are those 
20900 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20  specified.** by 
20910 70 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61  parameter vfsFla
20920 67 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65  gs ORed with the
20930 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
20940 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
20950 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20  N_READWRITE.**  
20960 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43     SQLITE_OPEN_C
20970 52 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c  REATE.**     SQL
20980 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
20990 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  VE.**     SQLITE
209a0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
209b0 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OSE.*/.static in
209c0 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  t pagerOpentemp(
209d0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
209e0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
209f0 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  pager object */.
20a00 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
20a10 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65  pFile,  /* Write
20a20 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
20a30 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69  ptor here */.  i
20a40 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
20a50 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
20a60 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
20a70 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20  the VFS */.){.  
20a80 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
20a90 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
20aa0 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20  code */..#ifdef 
20ab0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
20ac0 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
20ad0 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64  ount++;  /* Used
20ae0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
20af0 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a   analysis only *
20b00 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46  /.#endif..  vfsF
20b10 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f  lags |=  SQLITE_
20b20 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
20b30 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
20b40 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ATE |.          
20b50 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
20b60 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45  CLUSIVE | SQLITE
20b70 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
20b80 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  OSE;.  rc = sqli
20b90 74 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72  te3OsOpen(pPager
20ba0 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65  ->pVfs, 0, pFile
20bb0 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a  , vfsFlags, 0);.
20bc0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
20bd0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
20be0 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65  n(pFile) );.  re
20bf0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
20c00 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68  * Set the busy h
20c10 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e  andler function.
20c20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
20c30 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73   invokes the bus
20c40 79 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c  y-handler if sql
20c50 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74  ite3OsLock() ret
20c60 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  urns .** SQLITE_
20c70 42 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67  BUSY when trying
20c80 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d   to upgrade from
20c90 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48   no-lock to a SH
20ca0 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72  ARED lock,.** or
20cb0 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20   when trying to 
20cc0 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52  upgrade from a R
20cd0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20  ESERVED lock to 
20ce0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a  an EXCLUSIVE .**
20cf0 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a   lock. It does *
20d00 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  not* invoke the 
20d10 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65  busy handler whe
20d20 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d  n upgrading from
20d30 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45  .** SHARED to RE
20d40 53 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20  SERVED, or when 
20d50 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53  upgrading from S
20d60 48 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49  HARED to EXCLUSI
20d70 56 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63  VE.** (which occ
20d80 75 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a  urs during hot-j
20d90 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29  ournal rollback)
20da0 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a  . Summary:.**.**
20db0 20 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20     Transition   
20dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20dd0 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78       | Invokes x
20de0 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20  BusyHandler.**  
20df0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
20e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e  ---------.**   N
20e30 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20  O_LOCK       -> 
20e40 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20  SHARED_LOCK     
20e50 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52   | Yes.**   SHAR
20e60 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53  ED_LOCK   -> RES
20e70 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20  ERVED_LOCK    | 
20e80 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c  No.**   SHARED_L
20e90 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49  OCK   -> EXCLUSI
20ea0 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a  VE_LOCK   | No.*
20eb0 2a 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  *   RESERVED_LOC
20ec0 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c  K -> EXCLUSIVE_L
20ed0 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a  OCK   | Yes.**.*
20ee0 2a 20 49 66 20 74 68 65 20 62 75 73 79 2d 68 61  * If the busy-ha
20ef0 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72  ndler callback r
20f00 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
20f10 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a   the lock is .**
20f20 20 72 65 74 72 69 65 64 2e 20 49 66 20 69 74 20   retried. If it 
20f30 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68  returns zero, th
20f40 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55  en the SQLITE_BU
20f50 53 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72  SY error is.** r
20f60 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
20f70 61 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67  aller of the pag
20f80 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  er API function.
20f90 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20fa0 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
20fb0 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ler(.  Pager *pP
20fc0 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
20fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
20fe0 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
20ff0 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
21000 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20  ler)(void *),   
21010 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
21020 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72   to busy-handler
21030 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76   function */.  v
21040 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  oid *pBusyHandle
21050 72 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  rArg            
21060 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
21070 74 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73 79  to pass to xBusy
21080 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a  Handler */.){  .
21090 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48    pPager->xBusyH
210a0 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61  andler = xBusyHa
210b0 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d  ndler;.  pPager-
210c0 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
210d0 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41   = pBusyHandlerA
210e0 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rg;.}../*.** Cha
210f0 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a  nge the page siz
21100 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61  e used by the Pa
21110 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20  ger object. The 
21120 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a  new page size .*
21130 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a  * is passed in *
21140 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
21150 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
21160 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
21170 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
21180 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
21190 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  , it.** is a no-
211a0 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  op. The value re
211b0 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72  turned is the er
211c0 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
211d0 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f  code (i.e. .** o
211e0 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45  ne of SQLITE_IOE
211f0 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
21200 50 54 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  PT or SQLITE_FUL
21210 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  L)..**.** Otherw
21220 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74  ise, if all of t
21230 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
21240 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   true:.**.**   *
21250 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   the new page si
21260 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50  ze (value of *pP
21270 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69  ageSize) is vali
21280 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20  d (a power .**  
21290 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65     of two betwee
212a0 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45  n 512 and SQLITE
212b0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20  _MAX_PAGE_SIZE, 
212c0 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a  inclusive), and.
212d0 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20  **.**   * there 
212e0 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
212f0 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
21300 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  es, and.**.**   
21310 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
21320 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20  s either not an 
21330 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
21340 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20  se or it is.**  
21350 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20     an in-memory 
21360 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75  database that cu
21370 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73  rrently consists
21380 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a   of zero pages..
21390 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70  **.** then the p
213a0 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65  ager object page
213b0 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
213c0 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
213d0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
213e0 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74  ze is changed, t
213f0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
21400 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61  n uses sqlite3Pa
21410 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20  gerMalloc() .** 
21420 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20  to obtain a new 
21430 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
21440 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20  buffer. If this 
21450 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
21460 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  pt .** fails, SQ
21470 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
21480 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70  turned and the p
21490 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73  age size remains
214a0 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20   unchanged. .** 
214b0 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73  In all other cas
214c0 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  es, SQLITE_OK is
214d0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
214e0 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
214f0 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64  e is not changed
21500 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  , either because
21510 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d   one of the enum
21520 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74  erated.** condit
21530 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f  ions above is no
21540 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65  t true, the page
21550 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73  r was in error s
21560 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
21570 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  * function was c
21580 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73  alled, or becaus
21590 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  e the memory all
215a0 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
215b0 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e  failed, .** then
215c0 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73   *pPageSize is s
215d0 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72  et to the old, r
215e0 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a  etained page siz
215f0 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
21600 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
21610 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
21620 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
21630 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65  , u32 *pPageSize
21640 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b  , int nReserve){
21650 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20  .  /* It is not 
21660 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 61  possible to do a
21670 20 66 75 6c 6c 20 61 73 73 65 72 74 5f 70 61 67   full assert_pag
21680 65 72 5f 73 74 61 74 65 28 29 20 68 65 72 65 2c  er_state() here,
21690 20 61 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75   as this.  ** fu
216a0 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
216b0 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
216c0 20 50 61 67 65 72 4f 70 65 6e 28 29 2c 20 62 65   PagerOpen(), be
216d0 66 6f 72 65 20 74 68 65 20 73 74 61 74 65 0a 20  fore the state. 
216e0 20 2a 2a 20 6f 66 20 74 68 65 20 50 61 67 65 72   ** of the Pager
216f0 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 74 65 72   object is inter
21700 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74  nally consistent
21710 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f  ..  **.  ** At o
21720 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20 66 75  ne point this fu
21730 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20  nction returned 
21740 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20  an error if the 
21750 70 61 67 65 72 20 77 61 73 20 69 6e 20 0a 20 20  pager was in .  
21760 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  ** PAGER_ERROR s
21770 74 61 74 65 2e 20 42 75 74 20 73 69 6e 63 65 20  tate. But since 
21780 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
21790 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  e guarantees tha
217a0 74 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20  t.  ** there is 
217b0 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74  at least one out
217c0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65  standing page re
217d0 66 65 72 65 6e 63 65 2c 20 74 68 69 73 20 66 75  ference, this fu
217e0 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61  nction.  ** is a
217f0 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74 20   no-op for that 
21800 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a  case anyhow..  *
21810 2f 0a 0a 20 20 75 33 32 20 70 61 67 65 53 69 7a  /..  u32 pageSiz
21820 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a  e = *pPageSize;.
21830 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
21840 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69  ze==0 || (pageSi
21850 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
21860 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
21870 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20  PAGE_SIZE) );.  
21880 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d  if( (pPager->mem
21890 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  Db==0 || pPager-
218a0 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26  >dbSize==0).   &
218b0 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
218c0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
218d0 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20  pPCache)==0 .   
218e0 26 26 20 70 61 67 65 53 69 7a 65 20 26 26 20 70  && pageSize && p
218f0 61 67 65 53 69 7a 65 21 3d 70 50 61 67 65 72 2d  ageSize!=pPager-
21900 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a  >pageSize .  ){.
21910 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 3b 20      char *pNew; 
21920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21930 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63  /* New temp spac
21940 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79  e */.    i64 nBy
21950 74 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  te = 0;.    if( 
21960 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50  pPager->eState>P
21970 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f  AGER_OPEN && isO
21980 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
21990 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
219a0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
219b0 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
219c0 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69  &nByte);.      i
219d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
219e0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
219f0 20 20 7d 0a 20 20 20 20 70 4e 65 77 20 3d 20 28    }.    pNew = (
21a00 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61  char *)sqlite3Pa
21a10 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a  geMalloc(pageSiz
21a20 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4e 65  e);.    if( !pNe
21a30 77 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  w ){.      retur
21a40 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
21a50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21a60 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
21a70 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ger);.      pPag
21a80 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 42 79  er->dbSize = nBy
21a90 74 65 2f 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  te/pageSize;.   
21aa0 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
21ab0 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
21ac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
21ad0 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54  eFree(pPager->pT
21ae0 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20  mpSpace);.      
21af0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
21b00 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  e = pNew;.      
21b10 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
21b20 50 61 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d  PageSize(pPager-
21b30 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 53 69  >pPCache, pageSi
21b40 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ze);.    }.  }..
21b50 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70    *pPageSize = p
21b60 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
21b70 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c  .  if( nReserve<
21b80 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70  0 ) nReserve = p
21b90 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b  Pager->nReserve;
21ba0 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
21bb0 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72  rve>=0 && nReser
21bc0 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 70 50 61  ve<1000 );.  pPa
21bd0 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20  ger->nReserve = 
21be0 28 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20  (i16)nReserve;. 
21bf0 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
21c00 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
21c10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
21c20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
21c30 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  pointer to the "
21c40 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20  temporary page" 
21c50 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65  buffer held inte
21c60 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65  rnally.** by the
21c70 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73   pager.  This is
21c80 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69   a buffer that i
21c90 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  s big enough to 
21ca0 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69  hold the.** enti
21cb0 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  re content of a 
21cc0 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
21cd0 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75  This buffer is u
21ce0 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  sed internally.*
21cf0 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  * during rollbac
21d00 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76  k and will be ov
21d10 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76  erwritten whenev
21d20 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  er a rollback.**
21d30 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74   occurs.  But ot
21d40 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20  her modules are 
21d50 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74  free to use it t
21d60 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a  oo, as long as.*
21d70 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61  * no rollbacks a
21d80 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f  re happening..*/
21d90 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
21da0 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67  gerTempSpace(Pag
21db0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
21dc0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54  eturn pPager->pT
21dd0 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  mpSpace;.}../*.*
21de0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
21df0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74   the maximum dat
21e00 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
21e10 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
21e20 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65  sitive. .** Make
21e30 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d   no changes if m
21e40 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72  xPage is zero or
21e50 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20   negative.  And 
21e60 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
21e70 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  .** maximum page
21e80 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65   count below the
21e90 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
21ea0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
21eb0 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  *.** Regardless 
21ec0 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
21ed0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  n the current ma
21ee0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
21ef0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21f00 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
21f10 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
21f20 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
21f30 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a  if( mxPage>0 ){.
21f40 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
21f50 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  no = mxPage;.  }
21f60 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
21f70 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
21f80 4e 20 26 26 20 70 50 61 67 65 72 2d 3e 6d 78 50  N && pPager->mxP
21f90 67 6e 6f 3c 70 50 61 67 65 72 2d 3e 64 62 53 69  gno<pPager->dbSi
21fa0 7a 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  ze ){.    pPager
21fb0 2d 3e 6d 78 50 67 6e 6f 20 3d 20 70 50 61 67 65  ->mxPgno = pPage
21fc0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 20  r->dbSize;.  }. 
21fd0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
21fe0 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
21ff0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
22000 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
22010 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
22020 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
22030 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
22040 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
22050 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
22060 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
22070 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
22080 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
22090 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
220a0 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
220b0 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
220c0 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
220d0 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
220e0 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
220f0 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
22100 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
22110 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
22120 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
22130 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
22140 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
22150 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
22160 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
22170 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
22180 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
22190 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
221a0 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
221b0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
221c0 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
221d0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
221e0 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
221f0 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
22200 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
22210 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
22220 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
22230 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
22240 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
22250 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
22260 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
22270 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
22280 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
22290 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
222a0 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
222b0 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
222c0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
222d0 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
222e0 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
222f0 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
22300 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77  * If the pager w
22310 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74  as opened on a t
22320 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a  ransient file (z
22330 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f  Filename==""), o
22340 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r.** opened on a
22350 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20   file less than 
22360 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  N bytes in size,
22370 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
22380 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20  er is.** zeroed 
22390 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
223a0 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69  turned. The rati
223b0 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69  onale for this i
223c0 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20  s that this .** 
223d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
223e0 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73   to read databas
223f0 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61  e headers, and a
22400 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f   new transient o
22410 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20  r.** zero sized 
22420 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68  database has a h
22430 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69  eader than consi
22440 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
22450 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  zeroes..**.** If
22460 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70   any IO error ap
22470 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  art from SQLITE_
22480 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
22490 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
224a0 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f  .** the error co
224b0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
224c0 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64  o the caller and
224d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
224e0 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62   the.** output b
224f0 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e  uffer undefined.
22500 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
22510 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
22520 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
22530 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
22540 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
22550 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
22560 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
22570 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61  Dest, 0, N);.  a
22580 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
22590 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
225a0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
225b0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
225c0 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
225d0 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65  ed by btree imme
225e0 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63 72  diately after cr
225f0 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  eating.  ** the 
22600 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54  Pager object.  T
22610 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65  here has not bee
22620 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  n an opportunity
22630 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20   to transition. 
22640 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20   ** to WAL mode 
22650 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  yet..  */.  asse
22660 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
22670 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69  (pPager) );..  i
22680 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
22690 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54  ->fd) ){.    IOT
226a0 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20  RACE(("DBHDR %p 
226b0 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  0 %d\n", pPager,
226c0 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71   N)).    rc = sq
226d0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
226e0 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
226f0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
22700 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
22710 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
22720 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
22730 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
22740 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22750 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
22760 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c   may only be cal
22770 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61 64 2d  led when a read-
22780 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
22790 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61  pen on.** the pa
227a0 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73 20  ger. It returns 
227b0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
227c0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
227d0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
227e0 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
227f0 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e   file is between
22800 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a   1 and <page-siz
22810 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  e> bytes in size
22820 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
22830 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
22840 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a  1 page file..*/.
22850 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
22860 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
22870 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e  *pPager, int *pn
22880 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
22890 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
228a0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
228b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
228c0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
228d0 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
228e0 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20   );.  *pnPage = 
228f0 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53  (int)pPager->dbS
22900 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ize;.  return SQ
22910 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
22920 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e  ** Try to obtain
22930 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20   a lock of type 
22940 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20  locktype on the 
22950 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
22960 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f  f.** a similar o
22970 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69  r greater lock i
22980 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20  s already held, 
22990 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
229a0 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74   a no-op.** (ret
229b0 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b  urning SQLITE_OK
229c0 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a   immediately)..*
229d0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
229e0 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69  attempt to obtai
229f0 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67  n the lock using
22a00 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29   sqlite3OsLock()
22a10 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65  . Invoke .** the
22a20 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69   busy callback i
22a30 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75  f the lock is cu
22a40 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69  rrently not avai
22a50 6c 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a  lable. Repeat .*
22a60 2a 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79  * until the busy
22a70 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
22a80 73 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c  s false or until
22a90 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
22aa0 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c  .** obtain the l
22ab0 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a  ock succeeds..**
22ac0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
22ad0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
22ae0 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
22af0 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f  e if we cannot o
22b00 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63  btain.** the loc
22b10 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69  k. If the lock i
22b20 73 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65  s obtained succe
22b30 73 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65  ssfully, set the
22b40 20 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a   Pager.state .**
22b50 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63   variable to loc
22b60 6b 74 79 70 65 20 62 65 66 6f 72 65 20 72 65 74  ktype before ret
22b70 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
22b80 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74  c int pager_wait
22b90 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a  _on_lock(Pager *
22ba0 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b  pPager, int lock
22bb0 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  type){.  int rc;
22bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22be0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
22bf0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
22c00 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20   this is either 
22c10 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65  a no-op (because
22c20 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
22c30 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72  ock is .  ** alr
22c40 65 61 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e  eady held, or on
22c50 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 73  e of the transis
22c60 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62  tions that the b
22c70 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a  usy-handler.  **
22c80 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20   may be invoked 
22c90 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e  during, accordin
22ca0 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74  g to the comment
22cb0 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69   above.  ** sqli
22cc0 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
22cd0 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20  andler()..  */. 
22ce0 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
22cf0 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70  ->eLock>=locktyp
22d00 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50  e).       || (pP
22d10 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f  ager->eLock==NO_
22d20 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65  LOCK && locktype
22d30 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  ==SHARED_LOCK). 
22d40 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
22d50 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ->eLock==RESERVE
22d60 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79  D_LOCK && lockty
22d70 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
22d80 43 4b 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b  CK).  );..  do {
22d90 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c  .    rc = pagerL
22da0 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 6c 6f  ockDb(pPager, lo
22db0 63 6b 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c  cktype);.  }whil
22dc0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
22dd0 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42  SY && pPager->xB
22de0 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65  usyHandler(pPage
22df0 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
22e00 72 67 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  rg) );.  return 
22e10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e  rc;.}../*.** Fun
22e20 63 74 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e  ction assertTrun
22e30 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  cateConstraint(p
22e40 50 61 67 65 72 29 20 63 68 65 63 6b 73 20 74 68  Pager) checks th
22e50 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a  at one of the .*
22e60 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74  * following is t
22e70 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74  rue for all dirt
22e80 79 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c  y pages currentl
22e90 79 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61  y in the page-ca
22ea0 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  che:.**.**   a) 
22eb0 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
22ec0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
22ed0 65 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a  equal to the siz
22ee0 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20  e of the .**    
22ef0 20 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61    current databa
22f00 73 65 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67  se image, in pag
22f10 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62  es, OR.**.**   b
22f20 29 20 69 66 20 74 68 65 20 70 61 67 65 20 63 6f  ) if the page co
22f30 6e 74 65 6e 74 20 77 65 72 65 20 77 72 69 74 74  ntent were writt
22f40 65 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c  en at this time,
22f50 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a   it would not.**
22f60 20 20 20 20 20 20 62 65 20 6e 65 63 65 73 73 61        be necessa
22f70 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ry to write the 
22f80 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20  current content 
22f90 6f 75 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  out to the sub-j
22fa0 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28  ournal.**      (
22fb0 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  as determined by
22fc0 20 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65   function subjRe
22fd0 71 75 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a  quiresPage())..*
22fe0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64  *.** If the cond
22ff0 69 74 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62  ition asserted b
23000 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
23010 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61  were not true, a
23020 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20  nd the.** dirty 
23030 70 61 67 65 20 77 65 72 65 20 74 6f 20 62 65 20  page were to be 
23040 64 69 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74  discarded from t
23050 68 65 20 63 61 63 68 65 20 76 69 61 20 74 68 65  he cache via the
23060 20 70 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a   pagerStress().*
23070 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72  * routine, pager
23080 53 74 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e  Stress() would n
23090 6f 74 20 77 72 69 74 65 20 74 68 65 20 63 75 72  ot write the cur
230a0 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e  rent page conten
230b0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61  t to.** the data
230c0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20  base file. If a 
230d0 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61  savepoint transa
230e0 63 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65  ction were rolle
230f0 64 20 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20  d back after.** 
23100 74 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74  this happened, t
23110 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76  he correct behav
23120 69 6f 75 72 20 77 6f 75 6c 64 20 62 65 20 74 6f  iour would be to
23130 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
23140 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20  rent.** content 
23150 6f 66 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77  of the page. How
23160 65 76 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73  ever, since this
23170 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20   content is not 
23180 70 72 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65  present in eithe
23190 72 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  r.** the databas
231a0 65 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f  e file or the po
231b0 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c  rtion of the rol
231c0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
231d0 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61  d .** sub-journa
231e0 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  l rolled back th
231f0 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20  e content could 
23200 6e 6f 74 20 62 65 20 72 65 73 74 6f 72 65 64 20  not be restored 
23210 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  and the.** datab
23220 61 73 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20  ase image would 
23230 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20  become corrupt. 
23240 49 74 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  It is therefore 
23250 66 6f 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a  fortunate that .
23260 2a 2a 20 74 68 69 73 20 63 69 72 63 75 6d 73 74  ** this circumst
23270 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73  ance cannot aris
23280 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  e..*/.#if define
23290 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
232a0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
232b0 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
232c0 61 69 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50  aintCb(PgHdr *pP
232d0 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  g){.  assert( pP
232e0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
232f0 49 52 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74  IRTY );.  assert
23300 28 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50  ( !subjRequiresP
23310 61 67 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d  age(pPg) || pPg-
23320 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67  >pgno<=pPg->pPag
23330 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a  er->dbSize );.}.
23340 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
23350 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
23360 61 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  aint(Pager *pPag
23370 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  er){.  sqlite3Pc
23380 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79  acheIterateDirty
23390 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
233a0 2c 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  , assertTruncate
233b0 43 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d  ConstraintCb);.}
233c0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
233d0 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
233e0 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
233f0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
23400 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d  runcate the in-m
23410 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 66  emory database f
23420 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61  ile image to nPa
23430 67 65 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a  ge pages. This .
23440 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  ** function does
23450 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f   not actually mo
23460 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
23470 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  e file on disk. 
23480 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73  It .** just sets
23490 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74   the internal st
234a0 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ate of the pager
234b0 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20   object so that 
234c0 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69  the .** truncati
234d0 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20  on will be done 
234e0 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  when the current
234f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
23500 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f  committed..*/.vo
23510 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  id sqlite3PagerT
23520 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67  runcateImage(Pag
23530 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
23540 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72   nPage){.  asser
23550 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
23560 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73  e>=nPage );.  as
23570 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
23580 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
23590 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20  ER_CACHEMOD );. 
235a0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
235b0 3d 20 6e 50 61 67 65 3b 0a 20 20 61 73 73 65 72  = nPage;.  asser
235c0 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
235d0 69 6e 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  int(pPager);.}..
235e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
235f0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
23600 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
23610 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
23620 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73  ollback. It.** s
23630 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  yncs the journal
23640 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74   file to disk, t
23650 68 65 6e 20 73 65 74 73 20 70 50 61 67 65 72 2d  hen sets pPager-
23660 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 74  >journalHdr to t
23670 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  he.** size of th
23680 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
23690 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  o that the pager
236a0 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74  _playback() rout
236b0 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61  ine knows.** tha
236c0 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75  t the entire jou
236d0 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65  rnal file has be
236e0 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  en synced..**.**
236f0 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a   Syncing a hot-j
23700 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62  ournal to disk b
23710 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
23720 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
23730 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68 61   ensures .** tha
23740 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61 69  t if a power-fai
23750 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75 72 69  lure occurs duri
23760 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c  ng the rollback,
23770 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
23780 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72 6f  t.** attempts ro
23790 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67  llback following
237a0 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72 79   system recovery
237b0 20 73 65 65 73 20 74 68 65 20 73 61 6d 65 20 6a   sees the same j
237c0 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e  ournal.** conten
237d0 74 20 61 73 20 74 68 69 73 20 70 72 6f 63 65 73  t as this proces
237e0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72  s..**.** If ever
237f0 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20 70  ything goes as p
23800 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f  lanned, SQLITE_O
23810 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
23820 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e  therwise, .** an
23830 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
23840 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
23850 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f  t pagerSyncHotJo
23860 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
23870 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
23880 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
23890 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
238a0 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  c ){.    rc = sq
238b0 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
238c0 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f  er->jfd, SQLITE_
238d0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20  SYNC_NORMAL);.  
238e0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
238f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
23900 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
23910 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
23920 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
23930 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lHdr);.  }.  ret
23940 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
23950 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
23960 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
23970 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
23980 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
23990 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
239a0 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
239b0 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
239c0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
239d0 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
239e0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
239f0 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
23a00 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
23a10 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
23a20 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
23a30 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
23a40 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
23a50 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
23a60 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
23a70 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
23a80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
23a90 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
23aa0 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
23ab0 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
23ac0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
23ad0 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
23ae0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
23af0 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
23b00 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
23b10 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
23b20 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
23b30 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
23b40 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
23b50 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
23b60 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
23b70 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
23b80 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
23b90 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
23ba0 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
23bb0 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
23bc0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
23bd0 75 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a  u8 *pTmp = (u8 *
23be0 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  )pPager->pTmpSpa
23bf0 63 65 3b 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73  ce;..  disable_s
23c00 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
23c10 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  rs();.  sqlite3B
23c20 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
23c30 28 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ();.  /* pPager-
23c40 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 20 2a 2f  >errCode = 0; */
23c50 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
23c60 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69  siveMode = 0;.#i
23c70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
23c80 54 5f 57 41 4c 0a 20 20 73 71 6c 69 74 65 33 57  T_WAL.  sqlite3W
23c90 61 6c 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  alClose(pPager->
23ca0 70 57 61 6c 2c 0a 20 20 20 20 28 70 50 61 67 65  pWal,.    (pPage
23cb0 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 20 3a 20  r->noSync ? 0 : 
23cc0 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
23cd0 67 73 29 2c 20 0a 20 20 20 20 70 50 61 67 65 72  gs), .    pPager
23ce0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 54 6d 70  ->pageSize, pTmp
23cf0 0a 20 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  .  );.  pPager->
23d00 70 57 61 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66  pWal = 0;.#endif
23d10 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70  .  pager_reset(p
23d20 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45  Pager);.  if( ME
23d30 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72  MDB ){.    pager
23d40 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
23d50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
23d60 20 49 66 20 69 74 20 69 73 20 6f 70 65 6e 2c 20   If it is open, 
23d70 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
23d80 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c   file before cal
23d90 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f  ling UnlockAndRo
23da0 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 49  llback..    ** I
23db0 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 64 6f  f this is not do
23dc0 6e 65 2c 20 74 68 65 6e 20 61 6e 20 75 6e 73 79  ne, then an unsy
23dd0 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20  nced portion of 
23de0 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c  the open journal
23df0 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6d 61   .    ** file ma
23e00 79 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  y be played back
23e10 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
23e20 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66  se. If a power f
23e30 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 0a 20  ailure occurs . 
23e40 20 20 20 2a 2a 20 77 68 69 6c 65 20 74 68 69 73     ** while this
23e50 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74   is happening, t
23e60 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c  he database coul
23e70 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74  d become corrupt
23e80 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
23e90 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
23ea0 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
23eb0 74 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  to sync the jour
23ec0 6e 61 6c 2c 20 73 68 69 66 74 20 74 68 65 20 70  nal, shift the p
23ed0 61 67 65 72 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  ager.    ** into
23ee0 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
23ef0 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 55 6e  . This causes Un
23f00 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 20  lockAndRollback 
23f10 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 20 20  to unlock the.  
23f20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e    ** database an
23f30 64 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  d close the jour
23f40 6e 61 6c 20 66 69 6c 65 20 77 69 74 68 6f 75 74  nal file without
23f50 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
23f60 6f 6c 6c 20 69 74 0a 20 20 20 20 2a 2a 20 62 61  oll it.    ** ba
23f70 63 6b 20 6f 72 20 66 69 6e 61 6c 69 7a 65 20 69  ck or finalize i
23f80 74 2e 20 54 68 65 20 6e 65 78 74 20 64 61 74 61  t. The next data
23f90 62 61 73 65 20 75 73 65 72 20 77 69 6c 6c 20 68  base user will h
23fa0 61 76 65 20 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f  ave to do hot-jo
23fb0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c  urnal.    ** rol
23fc0 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 61 63 63  lback before acc
23fd0 65 73 73 69 6e 67 20 74 68 65 20 64 61 74 61 62  essing the datab
23fe0 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
23ff0 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28  .    if( isOpen(
24000 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
24010 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
24020 72 28 70 50 61 67 65 72 2c 20 70 61 67 65 72 53  r(pPager, pagerS
24030 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  yncHotJournal(pP
24040 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ager));.    }.  
24050 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
24060 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
24070 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
24080 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
24090 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ;.  enable_simul
240a0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
240b0 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
240c0 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41  "CLOSE %d\n", PA
240d0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
240e0 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f  .  IOTRACE(("CLO
240f0 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  SE %p\n", pPager
24100 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  )).  sqlite3OsCl
24110 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
24120 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  ;.  sqlite3OsClo
24130 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
24140 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
24150 65 28 70 54 6d 70 29 3b 0a 20 20 73 71 6c 69 74  e(pTmp);.  sqlit
24160 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50  e3PcacheClose(pP
24170 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
24180 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
24190 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70  AS_CODEC.  if( p
241a0 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65  Pager->xCodecFre
241b0 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  e ) pPager->xCod
241c0 65 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  ecFree(pPager->p
241d0 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a  Codec);.#endif..
241e0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
241f0 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26  r->aSavepoint &&
24200 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75   !pPager->pInJou
24210 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
24220 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
24230 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65  ->jfd) && !isOpe
24240 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
24250 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  );..  sqlite3_fr
24260 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ee(pPager);.  re
24270 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24280 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
24290 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  NDEBUG) || defin
242a0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
242b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
242c0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
242d0 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67   page pPg..*/.Pg
242e0 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  no sqlite3PagerP
242f0 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65  agenumber(DbPage
24300 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
24310 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65   pPg->pgno;.}.#e
24320 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  ndif../*.** Incr
24330 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
24340 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61  nce count for pa
24350 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20  ge pPg..*/.void 
24360 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
24370 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
24380 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
24390 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (pPg);.}../*.** 
243a0 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
243b0 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
243c0 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  , make sure all 
243d0 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68  the pages that h
243e0 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74  ave.** been writ
243f0 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
24400 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79  al have actually
24410 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72   reached the sur
24420 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  face of the.** d
24430 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72  isk and can be r
24440 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65  estored in the e
24450 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f  vent of a hot-jo
24460 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a  urnal rollback..
24470 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67  **.** If the Pag
24480 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69  er.noSync flag i
24490 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73  s set, then this
244a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
244b0 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  o-op..** Otherwi
244c0 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20  se, the actions 
244d0 72 65 71 75 69 72 65 64 20 64 65 70 65 6e 64 20  required depend 
244e0 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  on the journal-m
244f0 6f 64 65 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ode and the .** 
24500 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
24510 69 73 74 69 63 73 20 6f 66 20 74 68 65 20 74 68  istics of the th
24520 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61  e file-system, a
24530 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
24540 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72     * If the jour
24550 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69  nal file is an i
24560 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
24570 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e   file, no action
24580 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20   need.**     be 
24590 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  taken..**.**   *
245a0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
245b0 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e  he device does n
245c0 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53  ot support the S
245d0 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65  AFE_APPEND prope
245e0 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e  rty,.**     then
245f0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
24600 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
24610 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75  ntly written jou
24620 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20  rnal header.**  
24630 20 20 20 69 73 20 75 70 64 61 74 65 64 20 74 6f     is updated to
24640 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d   contain the num
24650 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72  ber of journal r
24660 65 63 6f 72 64 73 20 74 68 61 74 20 68 61 76 65  ecords that have
24670 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69  .**     been wri
24680 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  tten following i
24690 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  t. If the pager 
246a0 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  is operating in 
246b0 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20  full-sync.**    
246c0 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
246d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
246e0 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68  synced before th
246f0 69 73 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  is field is upda
24700 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ted..**.**   * I
24710 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65  f the device doe
24720 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68  s not support th
24730 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f  e SEQUENTIAL pro
24740 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20  perty, then .** 
24750 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65      journal file
24760 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a   is synced..**.*
24770 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d  * Or, in pseudo-
24780 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  code:.**.**   if
24790 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79  ( NOT <in-memory
247a0 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20   journal> ){.** 
247b0 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45      if( NOT SAFE
247c0 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20  _APPEND ){.**   
247d0 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79      if( <full-sy
247e0 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63  nc mode> ) xSync
247f0 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29  (<journal file>)
24800 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61  ;.**       <upda
24810 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a  te nRec field>.*
24820 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20  *     } .**     
24830 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49  if( NOT SEQUENTI
24840 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72  AL ) xSync(<jour
24850 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20  nal file>);.**  
24860 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63   }.**.** If succ
24870 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75  essful, this rou
24880 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20  tine clears the 
24890 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
248a0 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a  flag of every .*
248b0 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79  * page currently
248c0 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20   held in memory 
248d0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
248e0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
248f0 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73  n IO.** error is
24900 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
24910 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
24920 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
24930 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
24940 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
24950 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ncJournal(Pager 
24960 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 65 77  *pPager, int new
24970 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  Hdr){.  int rc; 
24980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24990 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
249a0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  n code */..  ass
249b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
249c0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
249d0 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
249e0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
249f0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
24a00 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61  R_DBMOD.  );.  a
24a10 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
24a20 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
24a30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
24a40 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
24a50 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73  er) );..  rc = s
24a60 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75  qlite3PagerExclu
24a70 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29  siveLock(pPager)
24a80 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
24a90 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
24aa0 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  c;..  if( !pPage
24ab0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
24ac0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
24ad0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
24ae0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
24af0 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61  ger->jfd) && pPa
24b00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
24b10 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
24b20 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  ODE_MEMORY ){.  
24b30 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44      const int iD
24b40 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
24b50 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
24b60 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
24b70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
24b80 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
24b90 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  ) );..      if( 
24ba0 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
24bb0 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
24bc0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
24bd0 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73  This block deals
24be0 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65   with an obscure
24bf0 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65   problem. If the
24c00 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e   last connection
24c10 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
24c20 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64   wrote to this d
24c30 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65 72  atabase was oper
24c40 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74  ating in persist
24c50 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  ent-journal.    
24c60 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65      ** mode, the
24c70 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
24c80 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20 70  le may at this p
24c90 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65  oint actually be
24ca0 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20 20   larger.        
24cb0 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f  ** than Pager.jo
24cc0 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20  urnalOff bytes. 
24cd0 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e  If the next thin
24ce0 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g in the journal
24cf0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  .        ** file
24d00 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
24d10 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
24d20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72 74  (written as part
24d30 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
24d40 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e  ** previous conn
24d50 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61 63  ection's transac
24d60 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61  tion), and a cra
24d70 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c  sh or power-fail
24d80 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
24d90 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52 65  occurs after nRe
24da0 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75 74  c is updated but
24db0 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e   before this con
24dc0 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a  nection writes .
24dd0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68          ** anyth
24de0 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20  ing else to the 
24df0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72  journal file (or
24e00 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62   commits/rolls b
24e10 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20  ack its .       
24e20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29   ** transaction)
24e30 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61  , then SQLite ma
24e40 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65  y become confuse
24e50 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65  d when doing the
24e60 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74   .        ** hot
24e70 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
24e80 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f  k following reco
24e90 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c  very. It may rol
24ea0 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20  l back all.     
24eb0 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f     ** of this co
24ec0 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20  nnections data, 
24ed0 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20  then proceed to 
24ee0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65  rolling back the
24ef0 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a   old,.        **
24f00 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74   out-of-date dat
24f10 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69  a that follows i
24f20 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  t. Database corr
24f30 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  uption..        
24f40 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f  **.        ** To
24f50 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
24f60 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  s, if the journa
24f70 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65  l file does appe
24f80 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20  ar to contain.  
24f90 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64        ** a valid
24fa0 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e   header followin
24fb0 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  g Pager.journalO
24fc0 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ff, then write a
24fd0 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a   0x00.        **
24fe0 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74 61   byte to the sta
24ff0 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76  rt of it to prev
25000 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e  ent it from bein
25010 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20  g recognized..  
25020 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
25030 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65   ** Variable iNe
25040 78 74 48 64 72 4f 66 66 73 65 74 20 69 73 20 73  xtHdrOffset is s
25050 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  et to the offset
25060 20 61 74 20 77 68 69 63 68 20 74 68 69 73 0a 20   at which this. 
25070 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65         ** proble
25080 6d 61 74 69 63 20 68 65 61 64 65 72 20 77 69 6c  matic header wil
25090 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65  l occur, if it e
250a0 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73  xists. aMagic is
250b0 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a   used .        *
250c0 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79  * as a temporary
250d0 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65   buffer to inspe
250e0 63 74 20 74 68 65 20 66 69 72 73 74 20 63 6f 75  ct the first cou
250f0 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a  ple of bytes of.
25100 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70          ** the p
25110 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c  otential journal
25120 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20   header..       
25130 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20   */.        i64 
25140 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b 0a  iNextHdrOffset;.
25150 20 20 20 20 20 20 20 20 75 38 20 61 4d 61 67 69          u8 aMagi
25160 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75 38  c[8];.        u8
25170 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28   zHeader[sizeof(
25180 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
25190 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  ];..        memc
251a0 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75  py(zHeader, aJou
251b0 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
251c0 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
251d0 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33 32  );.        put32
251e0 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
251f0 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
25200 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52  ic)], pPager->nR
25210 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e  ec);..        iN
25220 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a  extHdrOffset = j
25230 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
25240 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
25250 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
25260 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
25270 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78   aMagic, 8, iNex
25280 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20  tHdrOffset);.   
25290 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
252a0 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d  ITE_OK && 0==mem
252b0 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
252c0 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b  rnalMagic, 8) ){
252d0 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69  .          stati
252e0 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62  c const u8 zerob
252f0 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  yte = 0;.       
25300 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
25310 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
25320 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31  fd, &zerobyte, 1
25330 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  , iNextHdrOffset
25340 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
25350 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
25360 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
25370 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
25380 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
25390 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
253a0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
253b0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   /* Write the nR
253c0 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68  ec value into th
253d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
253e0 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20  eader. If in.   
253f0 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e       ** full-syn
25400 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73  chronous mode, s
25410 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
25420 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75  first. This ensu
25430 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  res that.       
25440 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73   ** all data has
25450 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20   really hit the 
25460 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63  disk before nRec
25470 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d   is updated to m
25480 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ark.        ** i
25490 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65  t as a candidate
254a0 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20   for rollback.. 
254b0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
254c0 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74    ** This is not
254d0 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65   required if the
254e0 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69   persistent medi
254f0 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20  a supports the. 
25500 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41         ** SAFE_A
25510 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20  PPEND property. 
25520 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20  Because in this 
25530 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  case it is not p
25540 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20  ossible .       
25550 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20   ** for garbage 
25560 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e  data to be appen
25570 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c  ded to the file,
25580 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
25590 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f          ** is po
255a0 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46  pulated with 0xF
255b0 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65  FFFFFFF when the
255c0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
255d0 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20  is written.     
255e0 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20     ** and never 
255f0 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
25600 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ted..        */.
25610 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
25620 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20  er->fullSync && 
25630 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
25640 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
25650 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41   ){.          PA
25660 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20  GERTRACE(("SYNC 
25670 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
25680 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
25690 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49  )));.          I
256a0 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
256b0 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
256c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
256d0 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
256e0 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
256f0 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
25700 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
25710 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
25720 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
25730 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
25740 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c  (("JHDR %p %lld\
25750 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
25760 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29  er->journalHdr))
25770 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
25780 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20  qlite3OsWrite(. 
25790 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
257a0 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
257b0 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29   sizeof(zHeader)
257c0 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
257d0 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a  lHdr.        );.
257e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
257f0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
25800 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
25810 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
25820 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
25830 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
25840 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
25850 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
25860 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
25870 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
25880 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
25890 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
258a0 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d  r)).        rc =
258b0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
258c0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
258d0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 7c 20  er->sync_flags| 
258e0 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67  .          (pPag
258f0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 3d 3d  er->sync_flags==
25900 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
25910 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54  ?SQLITE_SYNC_DAT
25920 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20  AONLY:0).       
25930 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
25940 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
25950 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
25960 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72   }..      pPager
25970 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
25980 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
25990 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77  f;.      if( new
259a0 48 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53  Hdr && 0==(iDc&S
259b0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
259c0 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20  _APPEND) ){.    
259d0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
259e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
259f0 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
25a00 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
25a10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
25a20 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
25a30 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
25a40 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67  else{.      pPag
25a50 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
25a60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
25a70 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Off;.    }.  }..
25a80 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20    /* Unless the 
25a90 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79  pager is in noSy
25aa0 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75  nc mode, the jou
25ab0 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75  rnal file was ju
25ac0 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  st .  ** success
25ad0 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69  fully synced. Ei
25ae0 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20  ther way, clear 
25af0 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
25b00 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a  YNC flag on .  *
25b10 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a  * all pages..  *
25b20 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  /.  sqlite3Pcach
25b30 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28  eClearSyncFlags(
25b40 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
25b50 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61  ;.  pPager->eSta
25b60 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45  te = PAGER_WRITE
25b70 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72  R_DBMOD;.  asser
25b80 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
25b90 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
25ba0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
25bb0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
25bc0 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
25bd0 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e  e first in a lin
25be0 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74  ked list of dirt
25bf0 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65  y pages connecte
25c00 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64  d.** by the PgHd
25c10 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  r.pDirty pointer
25c20 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
25c30 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20  writes each one 
25c40 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d  of the.** in-mem
25c50 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  ory pages in the
25c60 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74   list to the dat
25c70 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
25c80 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20  argument may.** 
25c90 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65  be NULL, represe
25ca0 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c  nting an empty l
25cb0 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ist. In this cas
25cc0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
25cd0 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is.** a no-op..*
25ce0 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d  *.** The pager m
25cf0 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73  ust hold at leas
25d00 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
25d10 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  k when this func
25d20 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tion.** is calle
25d30 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e  d. Before writin
25d40 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68  g anything to th
25d50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
25d60 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73   this lock.** is
25d70 20 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20   upgraded to an 
25d80 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
25d90 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e  If the lock cann
25da0 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a  ot be obtained,.
25db0 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  ** SQLITE_BUSY i
25dc0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e  s returned and n
25dd0 6f 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  o data is writte
25de0 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
25df0 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49  e file..** .** I
25e00 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61  f the pager is a
25e10 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72   temp-file pager
25e20 20 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20   and the actual 
25e30 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65  file-system file
25e40 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f  .** is not yet o
25e50 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74  pen, it is creat
25e60 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65  ed and opened be
25e70 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73  fore any data is
25e80 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74   .** written out
25e90 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65  ..**.** Once the
25ea0 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75   lock has been u
25eb0 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20  pgraded and, if 
25ec0 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66  necessary, the f
25ed0 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74  ile opened,.** t
25ee0 68 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69  he pages are wri
25ef0 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20  tten out to the 
25f00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
25f10 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69   list order. Wri
25f20 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69  ting.** a page i
25f30 73 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20  s skipped if it 
25f40 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20  meets either of 
25f50 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72  the following cr
25f60 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  iteria:.**.**   
25f70 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
25f80 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
25f90 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
25fa0 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47  or.**   * The PG
25fb0 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66  HDR_DONT_WRITE f
25fc0 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68  lag is set on th
25fd0 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e page..**.** If
25fe0 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70   writing out a p
25ff0 61 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64  age causes the d
26000 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
26010 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69  grow, Pager.dbFi
26020 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64  leSize.** is upd
26030 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  ated accordingly
26040 2e 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77  . If page 1 is w
26050 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e  ritten out, then
26060 20 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65   the value cache
26070 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62  d.** in Pager.db
26080 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70  FileVers[] is up
26090 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74  dated to match t
260a0 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f  he new value sto
260b0 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61  red in.** the da
260c0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
260d0 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
260e0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
260f0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
26100 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
26110 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
26120 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  , an IO error co
26130 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
26140 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55  Or, if the EXCLU
26150 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74  SIVE lock cannot
26160 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  .** be obtained,
26170 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
26180 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
26190 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
261a0 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67  ite_pagelist(Pag
261b0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64  er *pPager, PgHd
261c0 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  r *pList){.  int
261d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
261e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261f0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
26200 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   */..  /* This f
26210 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
26220 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62  called for rollb
26230 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52  ack pagers in WR
26240 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65  ITER_DBMOD state
26250 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21  . */.  assert( !
26260 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
26270 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
26280 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
26290 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
262a0 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MOD );.  assert(
262b0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
262c0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
262d0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66  ;..  /* If the f
262e0 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69  ile is a temp-fi
262f0 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  le has not yet b
26300 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e  een opened, open
26310 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a   it now. It.  **
26320 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
26330 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74   for rc to be ot
26340 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
26350 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e 63  OK if this branc
26360 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c  h.  ** is taken,
26370 20 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f   as pager_wait_o
26380 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f  n_lock() is a no
26390 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c  -op for temp-fil
263a0 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es..  */.  if( !
263b0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
263c0 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
263d0 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
263e0 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  le && rc==SQLITE
263f0 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  _OK );.    rc = 
26400 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50  pagerOpentemp(pP
26410 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64  ager, pPager->fd
26420 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61  , pPager->vfsFla
26430 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  gs);.  }..  /* B
26440 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
26450 77 72 69 74 65 2c 20 67 69 76 65 20 74 68 65 20  write, give the 
26460 56 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77 68  VFS a hint of wh
26470 61 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a  at the final.  *
26480 2a 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c  * file size will
26490 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65   be..  */.  asse
264a0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
264b0 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
264c0 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66 28  er->fd) );.  if(
264d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
264e0 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  & pPager->dbSize
264f0 3e 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53  >pPager->dbHintS
26500 69 7a 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ize ){.    sqlit
26510 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20  e3_int64 szFile 
26520 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
26530 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e  ze * (sqlite3_in
26540 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69  t64)pPager->dbSi
26550 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  ze;.    sqlite3O
26560 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61  sFileControl(pPa
26570 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
26580 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c  FCNTL_SIZE_HINT,
26590 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70   &szFile);.    p
265a0 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
265b0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
265c0 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  ze;.  }..  while
265d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
265e0 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  && pList ){.    
265f0 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73  Pgno pgno = pLis
26600 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a  t->pgno;..    /*
26610 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
26620 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
26630 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68   page cache with
26640 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
26650 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  eater.    ** tha
26660 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
26670 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74  this means sqlit
26680 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
26690 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65  mage() was calle
266a0 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65  d to.    ** make
266b0 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65   the file smalle
266c0 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79  r (presumably by
266d0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64   auto-vacuum cod
266e0 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65  e). Do not write
266f0 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68  .    ** any such
26700 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69   pages to the fi
26710 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
26720 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77  * Also, do not w
26730 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67  rite out any pag
26740 65 20 74 68 61 74 20 68 61 73 20 74 68 65 20 50  e that has the P
26750 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
26760 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20  flag.    ** set 
26770 28 73 65 74 20 62 79 20 73 71 6c 69 74 65 33 50  (set by sqlite3P
26780 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29  agerDontWrite())
26790 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
267a0 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64   pgno<=pPager->d
267b0 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69  bSize && 0==(pLi
267c0 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  st->flags&PGHDR_
267d0 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20  DONT_WRITE) ){. 
267e0 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
267f0 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
26800 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
26810 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f  ;   /* Offset to
26820 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20   write */.      
26830 63 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20  char *pData;    
26840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26860 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74 65 20  * Data to write 
26870 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 61 73  */    ..      as
26880 73 65 72 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c  sert( (pList->fl
26890 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
268a0 59 4e 43 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  YNC)==0 );..    
268b0 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20    /* Encode the 
268c0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
268d0 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
268e0 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70   pList->pData, p
268f0 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53  gno, 6, return S
26900 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61  QLITE_NOMEM, pDa
26910 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  ta);..      /* W
26920 72 69 74 65 20 6f 75 74 20 74 68 65 20 70 61 67  rite out the pag
26930 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20  e data. */.     
26940 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
26950 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
26960 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
26970 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
26980 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
26990 70 61 67 65 20 31 20 77 61 73 20 6a 75 73 74 20  page 1 was just 
269a0 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20  written, update 
269b0 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
269c0 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20   to match.      
269d0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77  ** the value now
269e0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64   stored in the d
269f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
26a00 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20   writing this . 
26a10 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75       ** page cau
26a20 73 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  sed the database
26a30 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75   file to grow, u
26a40 70 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65  pdate dbFileSize
26a50 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
26a60 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
26a70 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
26a80 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
26a90 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c  ers, &pData[24],
26aa0 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
26ab0 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
26ac0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
26ad0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46  pgno>pPager->dbF
26ae0 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ileSize ){.     
26af0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
26b00 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20  eSize = pgno;.  
26b10 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
26b20 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75  Update any backu
26b30 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e  p objects copyin
26b40 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
26b50 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f  f this pager. */
26b60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
26b70 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
26b80 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
26b90 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44  , (u8*)pList->pD
26ba0 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47  ata);..      PAG
26bb0 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45 20  ERTRACE(("STORE 
26bc0 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
26bd0 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
26be0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
26bf0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
26c00 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
26c10 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20  sh(pList)));.   
26c20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f     IOTRACE(("PGO
26c30 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  UT %p %d\n", pPa
26c40 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
26c50 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
26c60 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
26c70 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  edb_count);.    
26c80 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
26c90 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20  ger->nWrite);.  
26ca0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50    }else{.      P
26cb0 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54  AGERTRACE(("NOST
26cc0 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ORE %d page %d\n
26cd0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
26ce0 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  r), pgno));.    
26cf0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
26d00 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
26d10 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20  pList->pageHash 
26d20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
26d30 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a  (pList);.#endif.
26d40 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
26d50 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a  t->pDirty;.  }..
26d60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26d70 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61  /*.** Ensure tha
26d80 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  t the sub-journa
26d90 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20  l file is open. 
26da0 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  If it is already
26db0 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20   open, this .** 
26dc0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
26dd0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  -op..**.** SQLIT
26de0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
26df0 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 67   if everything g
26e00 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  oes according to
26e10 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51   plan. An .** SQ
26e20 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65  LITE_IOERR_XXX e
26e30 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
26e40 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20  urned if a call 
26e50 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  to sqlite3OsOpen
26e60 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f  () .** fails..*/
26e70 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
26e80 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  SubJournal(Pager
26e90 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
26ea0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26eb0 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
26ec0 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
26ed0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
26ee0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
26ef0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
26f00 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d  EMORY || pPager-
26f10 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b  >subjInMemory ){
26f20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65  .      sqlite3Me
26f30 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61  mJournalOpen(pPa
26f40 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20  ger->sjfd);.    
26f50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
26f60 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  = pagerOpentemp(
26f70 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
26f80 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45  sjfd, SQLITE_OPE
26f90 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20  N_SUBJOURNAL);. 
26fa0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
26fb0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
26fc0 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f  ppend a record o
26fd0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  f the current st
26fe0 61 74 65 20 6f 66 20 70 61 67 65 20 70 50 67 20  ate of page pPg 
26ff0 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
27000 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74 68  al. .** It is th
27010 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e  e callers respon
27020 73 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65 20  sibility to use 
27030 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
27040 28 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20  () to check .** 
27050 74 68 61 74 20 69 74 20 69 73 20 72 65 61 6c 6c  that it is reall
27060 79 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  y required befor
27070 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  e calling this f
27080 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
27090 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
270a0 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65 73  t the bit corres
270b0 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e  ponding to pPg->
270c0 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76  pgno in the bitv
270d0 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f  ecs.** for all o
270e0 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62  pen savepoints b
270f0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
27100 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
27110 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
27120 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
27130 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
27140 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72  ul, an IO.** err
27150 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20 61  or code if the a
27160 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
27170 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
27180 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
27190 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
271a0 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20   a malloc fails 
271b0 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20  while setting a 
271c0 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69  bit in a savepoi
271d0 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f  nt.** bitvec..*/
271e0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
271f0 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72  ournalPage(PgHdr
27200 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63   *pPg){.  int rc
27210 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
27220 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
27230 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
27240 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
27250 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
27260 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
27270 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68  ..    /* Open th
27280 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69  e sub-journal, i
27290 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72  f it has not alr
272a0 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
272b0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
272c0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
272d0 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  al );.    assert
272e0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
272f0 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73  >jfd) || pagerUs
27300 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
27310 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
27320 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
27330 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62   || pPager->nSub
27340 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
27350 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
27360 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20  l(pPager) .     
27370 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75      || pageInJou
27380 72 6e 61 6c 28 70 50 67 29 20 0a 20 20 20 20 20  rnal(pPg) .     
27390 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f      || pPg->pgno
273a0 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  >pPager->dbOrigS
273b0 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20  ize .    );.    
273c0 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72  rc = openSubJour
273d0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  nal(pPager);..  
273e0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d    /* If the sub-
273f0 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e  journal was open
27400 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ed successfully 
27410 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79 20  (or was already 
27420 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72  open),.    ** wr
27430 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ite the journal 
27440 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
27450 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  file.  */.    if
27460 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27470 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  ){.      void *p
27480 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
27490 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  a;.      i64 off
274a0 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53  set = pPager->nS
274b0 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
274c0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
274d0 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
274e0 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28    .      CODEC2(
274f0 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
27500 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74  Pg->pgno, 7, ret
27510 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
27520 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  , pData2);.     
27530 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
27540 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
27550 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
27560 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
27570 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63  pgno));.      rc
27580 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
27590 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66  Pager->sjfd, off
275a0 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  set, pPg->pgno);
275b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
275c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
275d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
275e0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
275f0 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  sjfd, pData2, pP
27600 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
27610 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20  offset+4);.     
27620 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
27630 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27640 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
27650 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61  nSubRec++;.    a
27660 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
27670 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20  Savepoint>0 );. 
27680 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76     rc = addToSav
27690 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
276a0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
276b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
276c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
276d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
276e0 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68  led by the pcach
276f0 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20  e layer when it 
27700 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65  has reached some
27710 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20  .** soft memory 
27720 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74  limit. The first
27730 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
27740 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65  ointer to a Page
27750 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73  r object.** (cas
27760 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54  t as a void*). T
27770 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61  he pager is alwa
27780 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28  ys 'purgeable' (
27790 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  not an in-memory
277a0 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54  .** database). T
277b0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
277c0 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  nt is a referenc
277d0 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74  e to a page that
277e0 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   is .** currentl
277f0 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20  y dirty but has 
27800 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
27810 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70  eferences. The p
27820 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73  age.** is always
27830 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
27840 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
27850 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
27860 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65  first .** argume
27870 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  nt..**.** The jo
27880 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  b of this functi
27890 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50  on is to make pP
278a0 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69  g clean by writi
278b0 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a  ng its contents.
278c0 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ** out to the da
278d0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20  tabase file, if 
278e0 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d  possible. This m
278f0 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69  ay involve synci
27900 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  ng the.** journa
27910 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  l file. .**.** I
27920 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71  f successful, sq
27930 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
27940 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  lean() is called
27950 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64   on the page and
27960 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
27970 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
27980 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
27990 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61  ile trying to ma
279a0 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  ke the.** page c
279b0 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72  lean, the IO err
279c0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
279d0 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65  ned. If the page
279e0 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61   cannot be.** ma
279f0 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d  de clean for som
27a00 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20  e other reason, 
27a10 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
27a20 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  urs, then SQLITE
27a30 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
27a40 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61  ed by sqlite3Pca
27a50 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69  cheMakeClean() i
27a60 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f  s not called..*/
27a70 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
27a80 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c  rStress(void *p,
27a90 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
27aa0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
27ab0 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e  (Pager *)p;.  in
27ac0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
27ad0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ;..  assert( pPg
27ae0 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
27af0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
27b00 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
27b10 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  IRTY );..  /* Th
27b20 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  e doNotSyncSpill
27b30 20 66 6c 61 67 20 69 73 20 73 65 74 20 64 75 72   flag is set dur
27b40 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64  ing times when d
27b50 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20  oing a sync of. 
27b60 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64   ** journal (and
27b70 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65   adding a new he
27b80 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c  ader) is not all
27b90 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75  owed.  This occu
27ba0 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63  rs.  ** during c
27bb0 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50  alls to sqlite3P
27bc0 61 67 65 72 57 72 69 74 65 28 29 20 77 68 69 6c  agerWrite() whil
27bd0 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72  e trying to jour
27be0 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a  nal multiple.  *
27bf0 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e  * pages belongin
27c00 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65  g to the same se
27c10 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ctor..  **.  ** 
27c20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 66  The doNotSpill f
27c30 6c 61 67 20 69 6e 68 69 62 69 74 73 20 61 6c 6c  lag inhibits all
27c40 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 20   cache spilling 
27c50 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
27c60 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f  ether.  ** or no
27c70 74 20 61 20 73 79 6e 63 20 69 73 20 72 65 71 75  t a sync is requ
27c80 69 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 73  ired.  This is s
27c90 65 74 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  et during a roll
27ca0 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  back..  **.  ** 
27cb0 53 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f  Spilling is also
27cc0 20 69 6e 68 69 62 69 74 65 64 20 77 68 65 6e 20   inhibited when 
27cd0 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
27ce0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
27cf0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20  ager->errCode ) 
27d00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27d10 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
27d20 64 6f 4e 6f 74 53 70 69 6c 6c 20 29 20 72 65 74  doNotSpill ) ret
27d30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
27d40 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e   if( pPager->doN
27d50 6f 74 53 79 6e 63 53 70 69 6c 6c 20 26 26 20 28  otSyncSpill && (
27d60 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48  pPg->flags & PGH
27d70 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30  DR_NEED_SYNC)!=0
27d80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
27d90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
27da0 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30   pPg->pDirty = 0
27db0 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ;.  if( pagerUse
27dc0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
27dd0 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69     /* Write a si
27de0 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74  ngle frame for t
27df0 68 69 73 20 70 61 67 65 20 74 6f 20 74 68 65 20  his page to the 
27e00 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  log. */.    if( 
27e10 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
27e20 28 70 50 67 29 20 29 7b 20 0a 20 20 20 20 20 20  (pPg) ){ .      
27e30 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
27e40 61 67 65 28 70 50 67 29 3b 20 0a 20 20 20 20 7d  age(pPg); .    }
27e50 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
27e60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27e70 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61  rc = pagerWalFra
27e80 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c  mes(pPager, pPg,
27e90 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d   0, 0, 0);.    }
27ea0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20  .  }else{.  .   
27eb0 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
27ec0 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71  rnal file if req
27ed0 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  uired. */.    if
27ee0 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
27ef0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20  DR_NEED_SYNC .  
27f00 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
27f10 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
27f20 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
27f30 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79  ){.      rc = sy
27f40 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
27f50 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  , 1);.    }.  . 
27f60 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
27f70 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 69 73  e number of this
27f80 20 70 61 67 65 20 69 73 20 6c 61 72 67 65 72 20   page is larger 
27f90 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
27fa0 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20   size of.    ** 
27fb0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
27fc0 67 65 2c 20 69 74 20 6d 61 79 20 6e 65 65 64 20  ge, it may need 
27fd0 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  to be written to
27fe0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
27ff0 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73  ..    ** This is
28000 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c   because the cal
28010 6c 20 74 6f 20 70 61 67 65 72 5f 77 72 69 74 65  l to pager_write
28020 5f 70 61 67 65 6c 69 73 74 28 29 20 62 65 6c 6f  _pagelist() belo
28030 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a  w will not.    *
28040 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 65  * actually write
28050 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c   data to the fil
28060 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
28070 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f      **.    ** Co
28080 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
28090 77 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66  wing sequence of
280a0 20 65 76 65 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a   events:.    **.
280b0 20 20 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a      **   BEGIN;.
280c0 20 20 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72      **     <jour
280d0 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20 20 20 20  nal page X>.    
280e0 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79 20 70  **     <modify p
280f0 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20  age X>.    **   
28100 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a    SAVEPOINT sp;.
28110 20 20 20 20 2a 2a 20 20 20 20 20 20 20 3c 73 68      **       <sh
28120 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66 69  rink database fi
28130 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a 20  le to Y pages>. 
28140 20 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65     **       page
28150 72 53 74 72 65 73 73 28 70 61 67 65 20 58 29 0a  rStress(page X).
28160 20 20 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42      **     ROLLB
28170 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20 20 2a  ACK TO sp;.    *
28180 2a 0a 20 20 20 20 2a 2a 20 49 66 20 28 58 3e 59  *.    ** If (X>Y
28190 29 2c 20 74 68 65 6e 20 77 68 65 6e 20 70 61 67  ), then when pag
281a0 65 72 53 74 72 65 73 73 20 69 73 20 63 61 6c 6c  erStress is call
281b0 65 64 20 70 61 67 65 20 58 20 77 69 6c 6c 20 6e  ed page X will n
281c0 6f 74 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20  ot be written.  
281d0 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20    ** out to the 
281e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 62  database file, b
281f0 75 74 20 77 69 6c 6c 20 62 65 20 64 72 6f 70 70  ut will be dropp
28200 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68  ed from the cach
28210 65 2e 20 54 68 65 6e 2c 0a 20 20 20 20 2a 2a 20  e. Then,.    ** 
28220 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22 52  following the "R
28230 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 73  OLLBACK TO sp" s
28240 74 61 74 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e  tatement, readin
28250 67 20 70 61 67 65 20 58 20 77 69 6c 6c 20 72 65  g page X will re
28260 61 64 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 66  ad.    ** data f
28270 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
28280 20 66 69 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c   file. This will
28290 20 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20   be the copy of 
282a0 70 61 67 65 20 58 20 61 73 20 69 74 0a 20 20 20  page X as it.   
282b0 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68 65   ** was when the
282c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
282d0 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74 20  rted, not as it 
282e0 77 61 73 20 77 68 65 6e 20 22 53 41 56 45 50 4f  was when "SAVEPO
282f0 49 4e 54 20 73 70 22 0a 20 20 20 20 2a 2a 20 77  INT sp".    ** w
28300 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20  as executed..   
28310 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
28320 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 77 72  olution is to wr
28330 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
28340 64 61 74 61 20 66 6f 72 20 70 61 67 65 20 58 20  data for page X 
28350 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a  into the .    **
28360 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
28370 65 20 6e 6f 77 20 28 69 66 20 69 74 20 69 73 20  e now (if it is 
28380 6e 6f 74 20 61 6c 72 65 61 64 79 20 74 68 65 72  not already ther
28390 65 29 2c 20 73 6f 20 74 68 61 74 20 69 74 20 77  e), so that it w
283a0 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72 65  ill.    ** be re
283b0 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 63 75  stored to its cu
283c0 72 72 65 6e 74 20 76 61 6c 75 65 20 77 68 65 6e  rrent value when
283d0 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54   the "ROLLBACK T
283e0 4f 20 73 70 22 20 69 73 20 0a 20 20 20 20 2a 2a  O sp" is .    **
283f0 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a   executed..    *
28400 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  /.    if( NEVER(
28410 0a 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c  .        rc==SQL
28420 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70  ITE_OK && pPg->p
28430 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69  gno>pPager->dbSi
28440 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75 69 72  ze && subjRequir
28450 65 73 50 61 67 65 28 70 50 67 29 0a 20 20 20 20  esPage(pPg).    
28460 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
28470 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
28480 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  Pg);.    }.  .  
28490 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63    /* Write the c
284a0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
284b0 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64  age out to the d
284c0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
284d0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
284e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
284f0 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c  assert( (pPg->fl
28500 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
28510 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  YNC)==0 );.     
28520 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
28530 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67 65  e_pagelist(pPage
28540 72 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  r, pPg);.    }. 
28550 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68   }..  /* Mark th
28560 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
28570 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
28580 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
28590 41 47 45 52 54 52 41 43 45 28 28 22 53 54 52 45  AGERTRACE(("STRE
285a0 53 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  SS %d page %d\n"
285b0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
285c0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
285d0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
285e0 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b  eMakeClean(pPg);
285f0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
28600 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
28610 72 2c 20 72 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  r, rc);.}.../*.*
28620 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
28630 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20  nitialize a new 
28640 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64  Pager object and
28650 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74   put a pointer t
28660 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61  o it.** in *ppPa
28670 67 65 72 2e 20 54 68 65 20 70 61 67 65 72 20 73  ger. The pager s
28680 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79  hould eventually
28690 20 62 65 20 66 72 65 65 64 20 62 79 20 70 61 73   be freed by pas
286a0 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71  sing it.** to sq
286b0 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
286c0 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69  )..**.** The zFi
286d0 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20  lename argument 
286e0 69 73 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  is the path to t
286f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
28700 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20   to open..** If 
28710 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
28720 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
28730 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
28740 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
28750 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
28760 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
28770 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72  cached. Temporar
28780 79 20 66 69 6c 65 73 20 61 72 65 20 62 65 20 64  y files are be d
28790 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
287a0 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65  tically when the
287b0 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66  y are closed. If
287c0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
287d0 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a  memory:" then .*
287e0 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * all informatio
287f0 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63  n is held in cac
28800 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20  he. It is never 
28810 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
28820 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65   .** This can be
28830 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
28840 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  nt an in-memory 
28850 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
28860 54 68 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d  The nExtra param
28870 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20 74  eter specifies t
28880 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
28890 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  es of space allo
288a0 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77  cated.** along w
288b0 69 74 68 20 65 61 63 68 20 70 61 67 65 20 72 65  ith each page re
288c0 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70  ference. This sp
288d0 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ace is available
288e0 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20   to the user.** 
288f0 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 50  via the sqlite3P
28900 61 67 65 72 47 65 74 45 78 74 72 61 28 29 20 41  agerGetExtra() A
28910 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  PI..**.** The fl
28920 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ags argument is 
28930 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20  used to specify 
28940 70 72 6f 70 65 72 74 69 65 73 20 74 68 61 74 20  properties that 
28950 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70  affect the.** op
28960 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  eration of the p
28970 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20  ager. It should 
28980 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62  be passed some b
28990 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69  itwise combinati
289a0 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47  on.** of the PAG
289b0 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20  ER_OMIT_JOURNAL 
289c0 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41  and PAGER_NO_REA
289d0 44 4c 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a 2a 0a  DLOCK flags..**.
289e0 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20  ** The vfsFlags 
289f0 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62  parameter is a b
28a00 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74  itmask to pass t
28a10 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  o the flags para
28a20 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20  meter.** of the 
28a30 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f  xOpen() method o
28a40 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56  f the supplied V
28a50 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  FS when opening 
28a60 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  files. .**.** If
28a70 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
28a80 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  t is allocated a
28a90 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64  nd the specified
28aa0 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a   file opened .**
28ab0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53   successfully, S
28ac0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
28ad0 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
28ae0 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  r set to point t
28af0 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67  o.** the new pag
28b00 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e  er object. If an
28b10 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
28b20 70 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74  ppPager is set t
28b30 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72  o NULL.** and er
28b40 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ror code returne
28b50 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
28b60 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
28b70 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c  TE_NOMEM.** (sql
28b80 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20  ite3Malloc() is 
28b90 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
28ba0 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45   memory), SQLITE
28bb0 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a  _CANTOPEN or .**
28bc0 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f   various SQLITE_
28bd0 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a  IO_XXX errors..*
28be0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
28bf0 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  erOpen(.  sqlite
28c00 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
28c10 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
28c20 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f  l file system to
28c30 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20   use */.  Pager 
28c40 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20  **ppPager,      
28c50 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72     /* OUT: Retur
28c60 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  n the Pager stru
28c70 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
28c80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
28c90 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  ename,   /* Name
28ca0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
28cb0 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
28cc0 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
28cd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
28ce0 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e  xtra bytes appen
28cf0 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  d to each in-mem
28d00 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
28d10 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
28d20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
28d30 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73  controlling this
28d40 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76   file */.  int v
28d50 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  fsFlags,        
28d60 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73      /* flags pas
28d70 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
28d80 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
28d90 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  () */.  void (*x
28da0 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29  Reinit)(DbPage*)
28db0 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
28dc0 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67  reinitialize pag
28dd0 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70  es */.){.  u8 *p
28de0 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  Ptr;.  Pager *pP
28df0 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ager = 0;       
28e00 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
28e10 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20  to allocate and 
28e20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
28e30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
28e40 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
28e50 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d  ode */.  int tem
28e60 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20  pFile = 0;      
28e70 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65    /* True for te
28e80 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20  mp files (incl. 
28e90 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29  in-memory files)
28ea0 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20   */.  int memDb 
28eb0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
28ec0 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
28ed0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  s an in-memory f
28ee0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61  ile */.  int rea
28ef0 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20  dOnly = 0;      
28f00 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
28f10 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79  s is a read-only
28f20 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a   file */.  int j
28f30 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20  ournalFileSize; 
28f40 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20      /* Bytes to 
28f50 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63  allocate for eac
28f60 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a  h journal fd */.
28f70 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d    char *zPathnam
28f80 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75  e = 0;     /* Fu
28f90 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62  ll path to datab
28fa0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
28fb0 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b  t nPathname = 0;
28fc0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
28fd0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61   of bytes in zPa
28fe0 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  thname */.  int 
28ff0 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c  useJournal = (fl
29000 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54  ags & PAGER_OMIT
29010 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a  _JOURNAL)==0; /*
29020 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a   False to omit j
29030 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
29040 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c  noReadlock = (fl
29050 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52  ags & PAGER_NO_R
29060 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a  EADLOCK)!=0;  /*
29070 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 72 65   True to omit re
29080 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74  ad-lock */.  int
29090 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71   pcacheSize = sq
290a0 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28  lite3PcacheSize(
290b0 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65  );       /* Byte
290c0 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f  s to allocate fo
290d0 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33  r PCache */.  u3
290e0 32 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53  2 szPageDflt = S
290f0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
29100 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66  GE_SIZE;  /* Def
29110 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a  ault page size *
29120 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  /..  /* Figure o
29130 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63  ut how much spac
29140 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  e is required fo
29150 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66  r each journal f
29160 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20  ile-handle.  ** 
29170 28 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f  (there are two o
29180 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e  f them, the main
29190 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
291a0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54   sub-journal). T
291b0 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20  his.  ** is the 
291c0 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65  maximum space re
291d0 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 69 6e  quired for an in
291e0 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
291f0 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20 2a  file handle .  *
29200 2a 20 61 6e 64 20 61 20 72 65 67 75 6c 61 72 20  * and a regular 
29210 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e  journal file-han
29220 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61  dle. Note that a
29230 20 22 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61   "regular journa
29240 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d  l-handle".  ** m
29250 61 79 20 62 65 20 61 20 77 72 61 70 70 65 72 20  ay be a wrapper 
29260 63 61 70 61 62 6c 65 20 6f 66 20 63 61 63 68 69  capable of cachi
29270 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 6f 72  ng the first por
29280 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72  tion of the jour
29290 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e  nal.  ** file in
292a0 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65   memory to imple
292b0 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d 69 63 2d  ment the atomic-
292c0 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
292d0 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20 73 6f  on (see .  ** so
292e0 75 72 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e 61  urce file journa
292f0 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  l.c)..  */.  if(
29300 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53   sqlite3JournalS
29310 69 7a 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65  ize(pVfs)>sqlite
29320 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  3MemJournalSize(
29330 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  ) ){.    journal
29340 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44  FileSize = ROUND
29350 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  8(sqlite3Journal
29360 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 20 20 7d  Size(pVfs));.  }
29370 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61  else{.    journa
29380 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e  lFileSize = ROUN
29390 44 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75  D8(sqlite3MemJou
293a0 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20 7d  rnalSize());.  }
293b0 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f  ..  /* Set the o
293c0 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74  utput variable t
293d0 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61  o NULL in case a
293e0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  n error occurs. 
293f0 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  */.  *ppPager = 
29400 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  0;..  /* Compute
29410 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66   and store the f
29420 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20  ull pathname in 
29430 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  an allocated buf
29440 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a  fer pointed.  **
29450 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65   to by zPathname
29460 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61  , length nPathna
29470 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20  me. Or, if this 
29480 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
29490 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20  ile,.  ** leave 
294a0 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61  both nPathname a
294b0 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74  nd zPathname set
294c0 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66   to 0..  */.  if
294d0 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
294e0 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
294f0 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70     nPathname = p
29500 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
29510 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65  1;.    zPathname
29520 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
29530 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20  (nPathname*2);. 
29540 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65     if( zPathname
29550 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
29560 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
29570 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
29580 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
29590 52 59 44 42 0a 20 20 20 20 69 66 28 20 73 74 72  RYDB.    if( str
295a0 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a  cmp(zFilename,":
295b0 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a  memory:")==0 ){.
295c0 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b        memDb = 1;
295d0 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65  .      zPathname
295e0 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  [0] = 0;.    }el
295f0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
29600 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b        zPathname[
29610 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20  0] = 0; /* Make 
29620 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  sure initialized
29630 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74   even if FullPat
29640 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f  hname() fails */
29650 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
29660 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
29670 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  e(pVfs, zFilenam
29680 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50  e, nPathname, zP
29690 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  athname);.    }.
296a0 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
296b0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
296c0 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
296d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
296e0 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b  OK && nPathname+
296f0 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  8>pVfs->mxPathna
29700 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  me ){.      /* T
29710 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
29720 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  ken when the jou
29730 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69 72  rnal path requir
29740 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74  ed by.      ** t
29750 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e  he database bein
29760 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65  g opened will be
29770 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d   more than pVfs-
29780 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20  >mxPathname.    
29790 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65    ** bytes in le
297a0 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73  ngth. This means
297b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
297c0 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a  nnot be opened,.
297d0 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77        ** as it w
297e0 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  ill not be possi
297f0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  ble to open the 
29800 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
29810 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68  even.      ** ch
29820 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  eck for a hot-jo
29830 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61  urnal before rea
29840 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ding..      */. 
29850 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
29860 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
29870 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
29880 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
29890 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
298a0 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  e(zPathname);.  
298b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
298c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
298d0 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
298e0 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72  or the Pager str
298f0 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f  ucture, PCache o
29900 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20  bject, the.  ** 
29910 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72  three file descr
29920 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61  iptors, the data
29930 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61  base file name a
29940 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  nd the journal .
29950 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20    ** file name. 
29960 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65  The layout in me
29970 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f  mory is as follo
29980 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
29990 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20    Pager object  
299a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299b0 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29    (sizeof(Pager)
299c0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
299d0 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20   PCache object  
299e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299f0 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53   (sqlite3PcacheS
29a00 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a  ize() bytes).  *
29a10 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66  *     Database f
29a20 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
29a30 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f        (pVfs->szO
29a40 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a  sFile bytes).  *
29a50 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61  *     Sub-journa
29a60 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  l file handle   
29a70 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
29a80 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
29a90 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72  **     Main jour
29aa0 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
29ab0 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
29ac0 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
29ad0 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
29ae0 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
29af0 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
29b00 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a  me+1 bytes).  **
29b10 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
29b20 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
29b30 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b       (nPathname+
29b40 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a  8+1 bytes).  */.
29b50 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73    pPtr = (u8 *)s
29b60 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
29b70 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a  (.    ROUND8(siz
29b80 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20  eof(*pPager)) + 
29b90 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74       /* Pager st
29ba0 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52  ructure */.    R
29bb0 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65  OUND8(pcacheSize
29bc0 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ) +           /*
29bd0 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a   PCache object *
29be0 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66  /.    ROUND8(pVf
29bf0 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20  s->szOsFile) +  
29c00 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
29c10 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20   db file */.    
29c20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
29c30 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f  * 2 +          /
29c40 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61  * The two journa
29c50 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20  l files */ .    
29c60 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20  nPathname + 1 + 
29c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29c80 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20  * zFilename */. 
29c90 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38     nPathname + 8
29ca0 20 2b 20 31 20 20 20 20 20 20 20 20 20 20 20 20   + 1            
29cb0 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f    /* zJournal */
29cc0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29cd0 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e  OMIT_WAL.    + n
29ce0 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20 31  Pathname + 4 + 1
29cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29d00 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a   zWal */.#endif.
29d10 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45    );.  assert( E
29d20 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
29d30 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54  ENT(SQLITE_INT_T
29d40 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c  O_PTR(journalFil
29d50 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28  eSize)) );.  if(
29d60 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71   !pPtr ){.    sq
29d70 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68  lite3_free(zPath
29d80 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  name);.    retur
29d90 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
29da0 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20    }.  pPager =  
29db0 20 20 20 20 20 20 20 20 20 20 20 20 28 50 61 67              (Pag
29dc0 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50  er*)(pPtr);.  pP
29dd0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20  ager->pPCache = 
29de0 20 20 20 28 50 43 61 63 68 65 2a 29 28 70 50 74     (PCache*)(pPt
29df0 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  r += ROUND8(size
29e00 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20  of(*pPager)));. 
29e10 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20   pPager->fd =   
29e20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
29e30 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70  pPtr += ROUND8(p
29e40 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70  cacheSize));.  p
29e50 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73  Pager->sjfd = (s
29e60 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50  qlite3_file*)(pP
29e70 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66  tr += ROUND8(pVf
29e80 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20  s->szOsFile));. 
29e90 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20   pPager->jfd =  
29ea0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
29eb0 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46  pPtr += journalF
29ec0 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  ileSize);.  pPag
29ed0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  er->zFilename = 
29ee0 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20     (char*)(pPtr 
29ef0 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  += journalFileSi
29f00 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45  ze);.  assert( E
29f10 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
29f20 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ENT(pPager->jfd)
29f30 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
29f40 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c  n the Pager.zFil
29f50 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e  ename and Pager.
29f60 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73  zJournal buffers
29f70 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a  , if required. *
29f80 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d  /.  if( zPathnam
29f90 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  e ){.    pPager-
29fa0 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63  >zJournal =   (c
29fb0 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50  har*)(pPtr += nP
29fc0 61 74 68 6e 61 6d 65 20 2b 20 31 29 3b 0a 20 20  athname + 1);.  
29fd0 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
29fe0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74  >zFilename, zPat
29ff0 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2a000 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
2a010 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2a020 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
2a030 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70  name);.    memcp
2a040 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  y(&pPager->zJour
2a050 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20  nal[nPathname], 
2a060 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38 29 3b 0a  "-journal", 8);.
2a070 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2a080 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 20  zFilename[0]==0 
2a090 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
2a0a0 3e 7a 4a 6f 75 72 6e 61 6c 5b 30 5d 20 3d 20 30  >zJournal[0] = 0
2a0b0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
2a0c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
2a0d0 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
2a0e0 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d 20 26  pPager->zWal = &
2a0f0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2a100 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b  [nPathname+8+1];
2a110 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50  .      memcpy(pP
2a120 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74  ager->zWal, zPat
2a130 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2a140 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
2a150 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50  &pPager->zWal[nP
2a160 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 22  athname], "-wal"
2a170 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , 4);.    }.#end
2a180 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  if.    sqlite3_f
2a190 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
2a1a0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56    }.  pPager->pV
2a1b0 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61  fs = pVfs;.  pPa
2a1c0 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20  ger->vfsFlags = 
2a1d0 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20  vfsFlags;..  /* 
2a1e0 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  Open the pager f
2a1f0 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
2a200 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
2a210 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21 6d 65  lename[0] && !me
2a220 6d 44 62 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  mDb ){.    int f
2a230 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  out = 0;        
2a240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
2a250 46 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65  FS flags returne
2a260 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a  d by xOpen() */.
2a270 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2a280 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
2a290 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
2a2a0 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46  pPager->fd, vfsF
2a2b0 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20  lags, &fout);.  
2a2c0 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f    readOnly = (fo
2a2d0 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
2a2e0 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f  EADONLY);..    /
2a2f0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
2a300 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
2a310 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77  pened for read/w
2a320 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20  rite access,.   
2a330 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66   ** choose a def
2a340 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
2a350 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74  n case we have t
2a360 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20  o create the.   
2a370 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
2a380 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70  e. The default p
2a390 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20  age size is the 
2a3a0 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20  maximum of:.    
2a3b0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53  **.    **    + S
2a3c0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2a3d0 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20  GE_SIZE,.    ** 
2a3e0 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72     + The value r
2a3f0 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
2a400 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
2a410 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
2a420 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69   largest page si
2a430 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77  ze that can be w
2a440 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
2a450 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
2a460 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a470 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  && !readOnly ){.
2a480 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72 53        setSectorS
2a490 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ize(pPager);.   
2a4a0 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2a4b0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2a4c0 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ZE<=SQLITE_MAX_D
2a4d0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2a4e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 50  );.      if( szP
2a4f0 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e  ageDflt<pPager->
2a500 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20  sectorSize ){.  
2a510 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
2a520 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c  ->sectorSize>SQL
2a530 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2a540 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20  PAGE_SIZE ){.   
2a550 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2a560 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44  t = SQLITE_MAX_D
2a570 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2a580 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2a590 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67  .          szPag
2a5a0 65 44 66 6c 74 20 3d 20 28 75 33 32 29 70 50 61  eDflt = (u32)pPa
2a5b0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
2a5c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2a5d0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
2a5e0 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
2a5f0 52 49 54 45 0a 20 20 20 20 20 20 7b 0a 20 20 20  RITE.      {.   
2a600 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73       int iDc = s
2a610 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
2a620 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
2a630 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
2a640 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
2a650 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2a660 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
2a670 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
2a680 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2a690 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
2a6a0 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
2a6b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2a6c0 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2a6d0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35  LT_PAGE_SIZE<=65
2a6e0 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  536);.        fo
2a6f0 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b  r(ii=szPageDflt;
2a700 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f   ii<=SQLITE_MAX_
2a710 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2a720 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20  E; ii=ii*2){.   
2a730 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28         if( iDc&(
2a740 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2a750 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a  MIC|(ii>>8)) ){.
2a760 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61              szPa
2a770 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20  geDflt = ii;.   
2a780 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a790 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
2a7a0 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  f.    }.  }else{
2a7b0 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d  .    /* If a tem
2a7c0 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 72  porary file is r
2a7d0 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20  equested, it is 
2a7e0 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64  not opened immed
2a7f0 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49  iately..    ** I
2a800 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20 61  n this case we a
2a810 63 63 65 70 74 20 74 68 65 20 64 65 66 61 75 6c  ccept the defaul
2a820 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20  t page size and 
2a830 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20  delay actually. 
2a840 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68     ** opening th
2a850 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65  e file until the
2a860 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f   first call to O
2a870 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a  sWrite()..    **
2a880 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61  .    ** This bra
2a890 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75 6e 20  nch is also run 
2a8a0 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
2a8b0 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20 69 6e   database. An in
2a8c0 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64  -memory.    ** d
2a8d0 61 74 61 62 61 73 65 20 69 73 20 74 68 65 20 73  atabase is the s
2a8e0 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d 66 69  ame as a temp-fi
2a8f0 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76 65 72  le that is never
2a900 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a   written out to.
2a910 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20      ** disk and 
2a920 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  uses an in-memor
2a930 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  y rollback journ
2a940 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20  al..    */ .    
2a950 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
2a960 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
2a970 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b   = PAGER_READER;
2a980 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f  .    pPager->eLo
2a990 63 6b 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c  ck = EXCLUSIVE_L
2a9a0 4f 43 4b 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c  OCK;.    readOnl
2a9b0 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53 51  y = (vfsFlags&SQ
2a9c0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2a9d0 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  LY);.  }..  /* T
2a9e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  he following cal
2a9f0 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50 61 67  l to PagerSetPag
2aa00 65 73 69 7a 65 28 29 20 73 65 72 76 65 73 20 74  esize() serves t
2aa10 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20  o set the value 
2aa20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70  of .  ** Pager.p
2aa30 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61  ageSize and to a
2aa40 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65  llocate the Page
2aa50 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66  r.pTmpSpace buff
2aa60 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  er..  */.  if( r
2aa70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2aa80 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2aa90 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a  er->memDb==0 );.
2aaa0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2aab0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
2aac0 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65  (pPager, &szPage
2aad0 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74  Dflt, -1);.    t
2aae0 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
2aaf0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20  ITE_OK );.  }.. 
2ab00 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
2ab10 6f 63 63 75 72 72 65 64 20 69 6e 20 65 69 74 68  occurred in eith
2ab20 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73  er of the blocks
2ab30 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65   above, free the
2ab40 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 73 74 72   .  ** Pager str
2ab50 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65  ucture and close
2ab60 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a   the file..  */.
2ab70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ab80 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
2ab90 74 28 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70  t( !pPager->pTmp
2aba0 53 70 61 63 65 20 29 3b 0a 20 20 20 20 73 71 6c  Space );.    sql
2abb0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
2abc0 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c  er->fd);.    sql
2abd0 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
2abe0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
2abf0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
2ac00 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68  ialize the PCach
2ac10 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 61  e object. */.  a
2ac20 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c 31 30  ssert( nExtra<10
2ac30 30 30 20 29 3b 0a 20 20 6e 45 78 74 72 61 20 3d  00 );.  nExtra =
2ac40 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b   ROUND8(nExtra);
2ac50 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
2ac60 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c  Open(szPageDflt,
2ac70 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c   nExtra, !memDb,
2ac80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ac90 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65       !memDb?page
2aca0 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64  rStress:0, (void
2acb0 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67 65   *)pPager, pPage
2acc0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20  r->pPCache);..  
2acd0 50 41 47 45 52 54 52 41 43 45 28 28 22 4f 50 45  PAGERTRACE(("OPE
2ace0 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45  N %d %s\n", FILE
2acf0 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d  HANDLEID(pPager-
2ad00 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46  >fd), pPager->zF
2ad10 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54  ilename));.  IOT
2ad20 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25  RACE(("OPEN %p %
2ad30 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  s\n", pPager, pP
2ad40 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
2ad50 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65  )..  pPager->use
2ad60 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73  Journal = (u8)us
2ad70 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67  eJournal;.  pPag
2ad80 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  er->noReadlock =
2ad90 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20   (noReadlock && 
2ada0 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a 30 3b 0a  readOnly) ?1:0;.
2adb0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2adc0 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20  tOpen = 0; */.  
2add0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  /* pPager->stmtI
2ade0 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nUse = 0; */.  /
2adf0 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d  * pPager->nRef =
2ae00 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2ae10 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30  er->stmtSize = 0
2ae20 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2ae30 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b  ->stmtJSize = 0;
2ae40 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2ae50 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20  >nPage = 0; */. 
2ae60 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
2ae70 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  = SQLITE_MAX_PAG
2ae80 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50  E_COUNT;.  /* pP
2ae90 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
2aea0 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 23  GER_UNLOCK; */.#
2aeb0 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
2aec0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20  Pager->state == 
2aed0 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45  (tempFile ? PAGE
2aee0 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41  R_EXCLUSIVE : PA
2aef0 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 23  GER_UNLOCK) );.#
2af00 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61 67 65  endif.  /* pPage
2af10 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20  r->errMask = 0; 
2af20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d  */.  pPager->tem
2af30 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70  pFile = (u8)temp
2af40 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20  File;.  assert( 
2af50 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
2af60 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
2af70 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  AL .          ||
2af80 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
2af90 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
2afa0 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
2afb0 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
2afc0 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d  GMODE_EXCLUSIVE=
2afd0 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =1 );.  pPager->
2afe0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
2aff0 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20  (u8)tempFile; . 
2b000 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
2b010 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
2b020 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
2b030 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28  Pager->memDb = (
2b040 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67  u8)memDb;.  pPag
2b050 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28  er->readOnly = (
2b060 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61  u8)readOnly;.  a
2b070 73 73 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61  ssert( useJourna
2b080 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  l || pPager->tem
2b090 70 46 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65  pFile );.  pPage
2b0a0 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67  r->noSync = pPag
2b0b0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
2b0c0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
2b0d0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e   = pPager->noSyn
2b0e0 63 20 3f 30 3a 31 3b 0a 20 20 70 50 61 67 65 72  c ?0:1;.  pPager
2b0f0 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53  ->sync_flags = S
2b100 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
2b110 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  L;.  /* pPager->
2b120 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  pFirst = 0; */. 
2b130 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
2b140 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f  stSynced = 0; */
2b150 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c  .  /* pPager->pL
2b160 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ast = 0; */.  pP
2b170 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28  ager->nExtra = (
2b180 75 31 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50  u16)nExtra;.  pP
2b190 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
2b1a0 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f  eLimit = SQLITE_
2b1b0 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f  DEFAULT_JOURNAL_
2b1c0 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73  SIZE_LIMIT;.  as
2b1d0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
2b1e0 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70  ger->fd) || temp
2b1f0 46 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63  File );.  setSec
2b200 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
2b210 0a 20 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e  .  if( !useJourn
2b220 61 6c 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  al ){.    pPager
2b230 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
2b240 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2b250 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69  E_OFF;.  }else i
2b260 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  f( memDb ){.    
2b270 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2b280 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
2b290 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a  NALMODE_MEMORY;.
2b2a0 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d    }.  /* pPager-
2b2b0 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >xBusyHandler = 
2b2c0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2b2d0 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
2b2e0 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  rg = 0; */.  pPa
2b2f0 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d  ger->xReiniter =
2b300 20 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d   xReinit;.  /* m
2b310 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48  emset(pPager->aH
2b320 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ash, 0, sizeof(p
2b330 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20  Pager->aHash)); 
2b340 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d  */..  *ppPager =
2b350 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72   pPager;.  retur
2b360 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2b370 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2b380 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
2b390 61 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e  after transition
2b3a0 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55  ing from PAGER_U
2b3b0 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45  NLOCK to.** PAGE
2b3c0 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e 20  R_SHARED state. 
2b3d0 49 74 20 74 65 73 74 73 20 69 66 20 74 68 65 72  It tests if ther
2b3e0 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  e is a hot journ
2b3f0 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a  al present in.**
2b400 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
2b410 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
2b420 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72  ager. A hot jour
2b430 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20  nal is one that 
2b440 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20  .** needs to be 
2b450 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63  played back. Acc
2b460 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66  ording to this f
2b470 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a  unction, a hot-j
2b480 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65  ournal.** file e
2b490 78 69 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c  xists if the fol
2b4a0 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 20  lowing criteria 
2b4b0 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20  are met:.**.**  
2b4c0 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66   * The journal f
2b4d0 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20 74 68  ile exists in th
2b4e0 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 61  e file system, a
2b4f0 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f  nd.**   * No pro
2b500 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53  cess holds a RES
2b510 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
2b520 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
2b530 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a  abase file, and.
2b540 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61 62  **   * The datab
2b550 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  ase file itself 
2b560 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
2b570 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  0 bytes in size,
2b580 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
2b590 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
2b5a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
2b5b0 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74  xists and is not
2b5c0 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   0x00..**.** If 
2b5d0 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
2b5e0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2b5f0 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61   file is 0 but a
2b600 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2b610 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73   exists, that is
2b620 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64   probably an old
2b630 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76   journal left ov
2b640 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a  er from a prior.
2b650 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ** database with
2b660 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
2b670 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2b680 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2b690 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64  .** just deleted
2b6a0 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c   using OsDelete,
2b6b0 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74   *pExists is set
2b6c0 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
2b6d0 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
2b6e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
2b6f0 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20  outine does not 
2b700 63 68 65 63 6b 20 69 66 20 74 68 65 72 65 20 69  check if there i
2b710 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
2b720 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61  al filename.** a
2b730 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2b740 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
2b750 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d 61 73  is, and that mas
2b760 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
2b770 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  .** does not exi
2b780 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  st, then the jou
2b790 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
2b7a0 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20   really hot. In 
2b7b0 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74 68 69  this.** case thi
2b7c0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
2b7d0 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f  eturn a false-po
2b7e0 73 69 74 69 76 65 2e 20 54 68 65 20 70 61 67 65  sitive. The page
2b7f0 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20  r_playback().** 
2b800 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73  routine will dis
2b810 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 20 6a  cover that the j
2b820 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
2b830 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e  ot really hot an
2b840 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72  d .** will not r
2b850 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a  oll it back. .**
2b860 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75  .** If a hot-jou
2b870 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f 75  rnal file is fou
2b880 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70 45  nd to exist, *pE
2b890 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20  xists is set to 
2b8a0 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45  1 and .** SQLITE
2b8b0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
2b8c0 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   no hot-journal 
2b8d0 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c  file is present,
2b8e0 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a 20   *pExists is.** 
2b8f0 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
2b900 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
2b910 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
2b920 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
2b930 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ing.** to determ
2b940 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
2b950 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ot a hot-journal
2b960 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74 68   file exists, th
2b970 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  e IO error.** co
2b980 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
2b990 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nd the value of 
2b9a0 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e 64 65  *pExists is unde
2b9b0 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
2b9c0 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e   int hasHotJourn
2b9d0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
2b9e0 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b  , int *pExists){
2b9f0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2ba00 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
2ba10 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
2ba20 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2ba30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
2ba40 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2ba50 69 6e 74 20 65 78 69 73 74 73 20 3d 20 31 3b 20  int exists = 1; 
2ba60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ba70 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72 6e   True if a journ
2ba80 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65  al file is prese
2ba90 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c  nt */.  int jrnl
2baa0 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70 65 6e 28  Open = !!isOpen(
2bab0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20  pPager->jfd);.. 
2bac0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2bad0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
2bae0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
2baf0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
2bb00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2bb10 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
2bb20 50 45 4e 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  PEN );..  assert
2bb30 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c  ( jrnlOpen==0 ||
2bb40 20 28 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   ( sqlite3OsDevi
2bb50 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
2bb60 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  s(pPager->jfd) &
2bb70 0a 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41  .    SQLITE_IOCA
2bb80 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48  P_UNDELETABLE_WH
2bb90 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20  EN_OPEN.  ));.. 
2bba0 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20   *pExists = 0;. 
2bbb0 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
2bbc0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
2bbd0 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
2bbe0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2bbf0 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
2bc00 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73  _EXISTS, &exists
2bc10 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
2bc20 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78  =SQLITE_OK && ex
2bc30 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74 20  ists ){.    int 
2bc40 6c 6f 63 6b 65 64 20 3d 20 30 3b 20 20 20 20 20  locked = 0;     
2bc50 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2bc60 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73 20  if some process 
2bc70 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44  holds a RESERVED
2bc80 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a   lock */..    /*
2bc90 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   Race condition 
2bca0 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20 70  here:  Another p
2bcb0 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61 76  rocess might hav
2bcc0 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74  e been holding t
2bcd0 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 45  he.    ** the RE
2bce0 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20  SERVED lock and 
2bcf0 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f  have a journal o
2bd00 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69 74  pen at the sqlit
2bd10 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20 20  e3OsAccess() .  
2bd20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c    ** call above,
2bd30 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74 65   but then delete
2bd40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
2bd50 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62   drop the lock b
2bd60 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65 20  efore.    ** we 
2bd70 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  get to the follo
2bd80 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43 68  wing sqlite3OsCh
2bd90 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
2bda0 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61 74  ) call.  If that
2bdb0 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63  .    ** is the c
2bdc0 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ase, this routin
2bdd0 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74 68  e might think th
2bde0 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75  ere is a hot jou
2bdf0 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a  rnal when.    **
2be00 20 69 6e 20 66 61 63 74 20 74 68 65 72 65 20 69   in fact there i
2be10 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72 65  s none.  This re
2be20 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73 65  sults in a false
2be30 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63 68 20  -positive which 
2be40 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64  will.    ** be d
2be50 65 61 6c 74 20 77 69 74 68 20 62 79 20 74 68 65  ealt with by the
2be60 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69 6e   playback routin
2be70 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38 33  e.  Ticket #3883
2be80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
2be90 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  = sqlite3OsCheck
2bea0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61  ReservedLock(pPa
2beb0 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64  ger->fd, &locked
2bec0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2bed0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63  QLITE_OK && !loc
2bee0 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  ked ){.      Pgn
2bef0 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  o nPage;        
2bf00 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2bf10 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
2bf20 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2bf30 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
2bf40 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
2bf50 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
2bf60 66 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  f it consists of
2bf70 20 30 20 70 61 67 65 73 2c 0a 20 20 20 20 20 20   0 pages,.      
2bf80 2a 2a 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74  ** then delete t
2bf90 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
2bfa0 20 53 65 65 20 74 68 65 20 68 65 61 64 65 72 20   See the header 
2bfb0 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 66 6f  comment above fo
2bfc0 72 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  r .      ** the 
2bfd0 72 65 61 73 6f 6e 69 6e 67 20 68 65 72 65 2e 20  reasoning here. 
2bfe0 20 44 65 6c 65 74 65 20 74 68 65 20 6f 62 73 6f   Delete the obso
2bff0 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  lete journal fil
2c000 65 20 75 6e 64 65 72 0a 20 20 20 20 20 20 2a 2a  e under.      **
2c010 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
2c020 20 74 6f 20 61 76 6f 69 64 20 72 61 63 65 20 63   to avoid race c
2c030 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20 74 6f  onditions and to
2c040 20 61 76 6f 69 64 20 76 69 6f 6c 61 74 69 6e 67   avoid violating
2c050 0a 20 20 20 20 20 20 2a 2a 20 5b 48 33 33 30 32  .      ** [H3302
2c060 30 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  0]..      */.   
2c070 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
2c080 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
2c090 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  nPage);.      if
2c0a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c0b0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
2c0c0 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
2c0d0 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
2c0e0 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
2c0f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2c100 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
2c110 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  r, RESERVED_LOCK
2c120 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
2c130 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2c140 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
2c150 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
2c160 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  al, 0);.        
2c170 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44      pagerUnlockD
2c180 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  b(pPager, SHARED
2c190 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
2c1a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
2c1b0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
2c1c0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
2c1d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2c1e0 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
2c1f0 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20  file exists and 
2c200 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
2c210 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65 72 76  ion has a reserv
2c220 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
2c230 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2c240 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2c250 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20  file. Now check 
2c260 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 20 20  that there is.  
2c270 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6c 65          ** at le
2c280 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f  ast one non-zero
2c290 20 62 79 74 65 73 20 61 74 20 74 68 65 20 73 74   bytes at the st
2c2a0 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
2c2b0 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
2c2c0 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
2c2d0 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e 73 69  s, then we consi
2c2e0 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  der this journal
2c2f0 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66 20 6e   to be hot. If n
2c300 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ot, .          *
2c310 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67 6e 6f  * it can be igno
2c320 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  red..          *
2c330 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
2c340 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  !jrnlOpen ){.   
2c350 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d           int f =
2c360 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
2c370 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
2c380 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
2c390 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2c3a0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
2c3b0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2c3c0 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
2c3d0 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20  fd, f, &f);.    
2c3e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c3f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c400 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2c410 20 20 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b     u8 first = 0;
2c420 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2c430 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
2c440 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f  pPager->jfd, (vo
2c450 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20  id *)&first, 1, 
2c460 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
2c470 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
2c480 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
2c490 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2c4a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2c4b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2c4c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
2c4d0 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
2c4e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2c4f0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
2c500 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
2c510 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2c520 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69 72   *pExists = (fir
2c530 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  st!=0);.        
2c540 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
2c550 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
2c560 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
2c570 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f  * If we cannot o
2c580 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  pen the rollback
2c590 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
2c5a0 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69 66   order to see if
2c5b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2c5c0 69 74 73 20 68 61 73 20 61 20 7a 65 72 6f 20 68  its has a zero h
2c5d0 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67 68  eader, that migh
2c5e0 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20 49  t be due to an I
2c5f0 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20  /O error, or.   
2c600 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d           ** it m
2c610 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 74  ight be due to t
2c620 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  he race conditio
2c630 6e 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  n described abov
2c640 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 20  e and in.       
2c650 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20 23       ** ticket #
2c660 33 38 38 33 2e 20 20 45 69 74 68 65 72 20 77 61  3883.  Either wa
2c670 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  y, assume that t
2c680 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f  he journal is ho
2c690 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  t..            *
2c6a0 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62 65 20  * This might be 
2c6b0 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  a false positive
2c6c0 2e 20 20 42 75 74 20 69 66 20 69 74 20 69 73 2c  .  But if it is,
2c6d0 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20   then the.      
2c6e0 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74        ** automat
2c6f0 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62  ic journal playb
2c700 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72 79  ack and recovery
2c710 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20   mechanism will 
2c720 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20  deal.           
2c730 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64 65   ** with it unde
2c740 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  r an EXCLUSIVE l
2c750 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f 20  ock where we do 
2c760 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  not need to.    
2c770 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72 79          ** worry
2c780 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72 61   so much with ra
2c790 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20  ce conditions.. 
2c7a0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2c7b0 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73            *pExis
2c7c0 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ts = 1;.        
2c7d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2c7e0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OK;.          }.
2c7f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c800 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
2c810 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2c820 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2c830 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
2c840 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f  tain a shared lo
2c850 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2c860 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69  se file..** It i
2c870 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c  s illegal to cal
2c880 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  l sqlite3PagerAc
2c890 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20 61 66  quire() until af
2c8a0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
2c8b0 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75  n.** has been su
2c8c0 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65  ccessfully calle
2c8d0 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c  d. If a shared-l
2c8e0 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
2c8f0 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73  eld when.** this
2c900 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2c910 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
2c920 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  op..**.** The fo
2c930 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f  llowing operatio
2c940 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66  ns are also perf
2c950 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66 75  ormed by this fu
2c960 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  nction..**.**   
2c970 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20  1) If the pager 
2c980 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
2c990 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61  PAGER_UNLOCK sta
2c9a0 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64  te (no lock held
2c9b0 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20  .**      on the 
2c9c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20  database file), 
2c9d0 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
2c9e0 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69  is made to obtai
2c9f0 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52  n a.**      SHAR
2ca00 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
2ca10 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d  atabase file. Im
2ca20 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
2ca30 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20  obtaining.**    
2ca40 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63    the SHARED loc
2ca50 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  k, the file-syst
2ca60 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f  em is checked fo
2ca70 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  r a hot-journal,
2ca80 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69  .**      which i
2ca90 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66  s played back if
2caa0 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77   present. Follow
2cab0 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72  ing any hot-jour
2cac0 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c  nal .**      rol
2cad0 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65  lback, the conte
2cae0 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65  nts of the cache
2caf0 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62   are validated b
2cb00 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20  y checking.**   
2cb10 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63     the 'change-c
2cb20 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66  ounter' field of
2cb30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2cb40 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a  le header and.**
2cb50 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20        discarded 
2cb60 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e  if they are foun
2cb70 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e  d to be invalid.
2cb80 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74  .**.**   2) If t
2cb90 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
2cba0 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
2cbb0 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65  -mode, and there
2cbc0 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a   are currently.*
2cbd0 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61  *      no outsta
2cbe0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
2cbf0 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61   to any pages, a
2cc00 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  nd is in the err
2cc10 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20  or state,.**    
2cc20 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70    then an attemp
2cc30 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65  t is made to cle
2cc40 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ar the error sta
2cc50 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67  te by discarding
2cc60 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e  .**      the con
2cc70 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
2cc80 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c  e cache and roll
2cc90 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65  ing back any ope
2cca0 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  n journal.**    
2ccb0 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66    file..**.** If
2ccc0 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64   the operation d
2ccd0 65 73 63 72 69 62 65 64 20 62 79 20 28 32 29 20  escribed by (2) 
2cce0 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 61 74 74  above is not att
2ccf0 65 6d 70 74 65 64 2c 20 61 6e 64 20 69 66 20 74  empted, and if t
2cd00 68 65 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69  he.** pager is i
2cd10 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
2cd20 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
2cd30 54 45 5f 46 55 4c 4c 20 77 68 65 6e 20 74 68 69  TE_FULL when thi
2cd40 73 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20  s is called,.** 
2cd50 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
2cd60 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2cd70 74 75 72 6e 65 64 2e 20 49 74 20 69 73 20 70 65  turned. It is pe
2cd80 72 6d 69 74 74 65 64 20 74 6f 20 72 65 61 64 20  rmitted to read 
2cd90 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
2cda0 77 68 65 6e 20 69 6e 20 53 51 4c 49 54 45 5f 46  when in SQLITE_F
2cdb0 55 4c 4c 20 65 72 72 6f 72 20 73 74 61 74 65 2e  ULL error state.
2cdc0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
2cdd0 2c 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  , if everything 
2cde0 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
2cdf0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2ce00 72 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 49  rned. If an.** I
2ce10 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
2ce20 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65  hile locking the
2ce30 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b   database, check
2ce40 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  ing for a hot-jo
2ce50 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72  urnal.** file or
2ce60 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
2ce70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
2ce80 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
2ce90 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
2cea0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2ceb0 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72  SharedLock(Pager
2cec0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2ced0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2cee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cef0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2cf00 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  /..  /* This rou
2cf10 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
2cf20 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20  led from b-tree 
2cf30 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68  and only when th
2cf40 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20  ere are no.  ** 
2cf50 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
2cf60 73 2e 20 54 68 69 73 20 69 6d 70 6c 69 65 73 20  s. This implies 
2cf70 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 73  that the pager s
2cf80 74 61 74 65 20 73 68 6f 75 6c 64 20 65 69 74 68  tate should eith
2cf90 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20  er.  ** be OPEN 
2cfa0 6f 72 20 52 45 41 44 45 52 2e 20 52 45 41 44 45  or READER. READE
2cfb0 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62  R is only possib
2cfc0 6c 65 20 69 66 20 74 68 65 20 70 61 67 65 72 20  le if the pager 
2cfd0 69 73 20 6f 72 20 77 61 73 20 69 6e 20 0a 20 20  is or was in .  
2cfe0 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  ** exclusive acc
2cff0 65 73 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ess mode..  */. 
2d000 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2d010 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
2d020 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
2d030 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2d040 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
2d050 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
2d060 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2d070 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
2d080 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  EN || pPager->eS
2d090 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
2d0a0 45 52 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  ER );.  if( NEVE
2d0b0 52 28 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65  R(MEMDB && pPage
2d0c0 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b 20 72  r->errCode) ){ r
2d0d0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
2d0e0 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 69 66 28 20  rCode; }..  if( 
2d0f0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
2d100 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e  ger) && pPager->
2d110 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
2d120 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 48  EN ){.    int bH
2d130 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20  otJournal = 1;  
2d140 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2d150 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
2d160 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69  a hot journal-fi
2d170 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  le */..    asser
2d180 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
2d190 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2d1a0 3e 6e 6f 52 65 61 64 6c 6f 63 6b 3d 3d 30 20 7c  >noReadlock==0 |
2d1b0 7c 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  | pPager->readOn
2d1c0 6c 79 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  ly );..    if( p
2d1d0 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
2d1e0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  k==0 ){.      rc
2d1f0 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
2d200 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
2d210 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
2d220 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2d230 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
2d240 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
2d250 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock==NO_LOCK ||
2d260 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
2d270 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
2d280 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
2d290 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  led;.      }.   
2d2a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   }..    /* If a 
2d2b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
2d2c0 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69  sts, and there i
2d2d0 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f  s no RESERVED lo
2d2e0 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
2d2f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2d300 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e  then it either n
2d310 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
2d320 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65  d back or delete
2d330 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
2d340 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  ( pPager->eLock<
2d350 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
2d360 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f        rc = hasHo
2d370 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  tJournal(pPager,
2d380 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a   &bHotJournal);.
2d390 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2d3a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2d3b0 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
2d3c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2d3d0 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  bHotJournal ){. 
2d3e0 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45       /* Get an E
2d3f0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
2d400 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2d410 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  le. At this poin
2d420 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a  t it is.      **
2d430 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
2d440 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
2d450 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  is not obtained 
2d460 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68  on the way to th
2d470 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55  e.      ** EXCLU
2d480 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74  SIVE lock. If it
2d490 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70   were, another p
2d4a0 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65  rocess might ope
2d4b0 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  n the.      ** d
2d4c0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65  atabase file, de
2d4d0 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45  tect the RESERVE
2d4e0 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63  D lock, and conc
2d4f0 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20  lude that the.  
2d500 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2d510 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20  is safe to read 
2d520 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65  while this proce
2d530 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c  ss is still roll
2d540 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a  ing the .      *
2d550 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61  * hot-journal ba
2d560 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  ck..      ** .  
2d570 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74      ** Because t
2d580 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
2d590 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
2d5a0 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20   not requested, 
2d5b0 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  any.      ** oth
2d5c0 65 72 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d  er process attem
2d5d0 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20  pting to access 
2d5e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2d5f0 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20  e will get to . 
2d600 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69       ** this poi
2d610 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61  nt in the code a
2d620 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69  nd fail to obtai
2d630 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53  n its own EXCLUS
2d640 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20  IVE lock .      
2d650 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
2d660 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a  se file..      *
2d670 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73  *.      ** Unles
2d680 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  s the pager is i
2d690 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  n locking_mode=e
2d6a0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
2d6b0 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20  he lock is.     
2d6c0 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74   ** downgraded t
2d6d0 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65  o SHARED_LOCK be
2d6e0 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
2d6f0 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20 20 20  on returns..    
2d700 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
2d710 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
2d720 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
2d730 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
2d740 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2d750 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
2d760 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20  led;.      }. . 
2d770 20 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73       /* If it is
2d780 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
2d790 6e 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65  n and the file e
2d7a0 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f  xists on disk, o
2d7b0 70 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a  pen the .      *
2d7c0 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65  * journal for re
2d7d0 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
2d7e0 20 57 72 69 74 65 20 61 63 63 65 73 73 20 69 73   Write access is
2d7f0 20 72 65 71 75 69 72 65 64 20 62 65 63 61 75 73   required becaus
2d800 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65  e .      ** in e
2d810 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
2d820 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64 65  mode the file de
2d830 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65  scriptor will be
2d840 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20 20 20   kept open .    
2d850 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c    ** and possibl
2d860 79 20 75 73 65 64 20 66 6f 72 20 61 20 74 72 61  y used for a tra
2d870 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f  nsaction later o
2d880 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61  n. Also, write-a
2d890 63 63 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20  ccess .      ** 
2d8a0 69 73 20 75 73 75 61 6c 6c 79 20 72 65 71 75 69  is usually requi
2d8b0 72 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  red to finalize 
2d8c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a  the journal in j
2d8d0 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73  ournal_mode=pers
2d8e0 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f  ist .      ** mo
2d8f0 64 65 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72  de (and also for
2d900 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72   journal_mode=tr
2d910 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73  uncate on some s
2d920 79 73 74 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a  ystems)..      *
2d930 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
2d940 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e  e journal does n
2d950 6f 74 20 65 78 69 73 74 2c 20 69 74 20 75 73 75  ot exist, it usu
2d960 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20  ally means that 
2d970 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f  some .      ** o
2d980 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
2d990 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69  managed to get i
2d9a0 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61  n and roll it ba
2d9b0 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20  ck before .     
2d9c0 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   ** this connect
2d9d0 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65  ion obtained the
2d9e0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
2d9f0 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20  above. Or, it . 
2da00 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e       ** may mean
2da10 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
2da20 77 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72  was in the error
2da30 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73  -state when this
2da40 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
2da50 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e  on was called an
2da60 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
2da70 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
2da80 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
2da90 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
2daa0 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
2dab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66        sqlite3_vf
2dac0 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
2dad0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
2dae0 20 20 20 20 20 20 20 69 6e 74 20 62 45 78 69 73         int bExis
2daf0 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ts;             
2db00 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72   /* True if jour
2db10 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
2db20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
2db30 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
2db40 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66  .            pVf
2db50 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
2db60 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
2db70 53 53 5f 45 58 49 53 54 53 2c 20 26 62 45 78 69  SS_EXISTS, &bExi
2db80 73 74 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  sts);.        if
2db90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2dba0 26 26 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20  && bExists ){.  
2dbb0 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74          int fout
2dbc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2dbd0 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f  int f = SQLITE_O
2dbe0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
2dbf0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
2dc00 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20  OURNAL;.        
2dc10 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
2dc20 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
2dc30 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2dc40 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
2dc50 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
2dc60 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
2dc70 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20   f, &fout);.    
2dc80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
2dc90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
2dca0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2dcb0 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d) );.          
2dcc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2dcd0 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45  K && fout&SQLITE
2dce0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29  _OPEN_READONLY )
2dcf0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
2dd00 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
2dd10 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EN_BKPT;.       
2dd20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
2dd30 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
2dd40 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2dd50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2dd60 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62   .      /* Playb
2dd70 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ack and delete t
2dd80 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f  he journal.  Dro
2dd90 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  p the database w
2dda0 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  rite.      ** lo
2ddb0 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65  ck and reacquire
2ddc0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20   the read lock. 
2ddd0 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20  Purge the cache 
2dde0 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20  before.      ** 
2ddf0 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
2de00 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20   hot-journal so 
2de10 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e  that we don't en
2de20 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20  d up with.      
2de30 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  ** an inconsiste
2de40 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20  nt cache.  Sync 
2de50 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  the hot journal 
2de60 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20  before playing. 
2de70 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20       ** it back 
2de80 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73  since the proces
2de90 73 20 74 68 61 74 20 63 72 61 73 68 65 64 20 61  s that crashed a
2dea0 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20  nd left the hot 
2deb0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
2dec0 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f   probably did no
2ded0 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65  t sync it and we
2dee0 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f   are required to
2def0 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20   always sync.   
2df00 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
2df10 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67  l before playing
2df20 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20   it back..      
2df30 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f  */.      if( isO
2df40 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2df50 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
2df60 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
2df70 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  K );.        rc 
2df80 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f  = pagerSyncHotJo
2df90 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
2dfa0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2dfb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2dfc0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2dfd0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
2dfe0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
2dff0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
2e000 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20   PAGER_OPEN;.   
2e010 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
2e020 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  se if( !pPager->
2e030 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
2e040 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 55 6e  .        pagerUn
2e050 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53  lockDb(pPager, S
2e060 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
2e070 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
2e080 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e090 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
2e0a0 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
2e0b0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
2e0c0 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
2e0d0 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20 20   to open.       
2e0e0 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b   ** or roll back
2e0f0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77   a hot-journal w
2e100 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20  hile holding an 
2e110 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
2e120 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  The.        ** p
2e130 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f  ager_unlock() ro
2e140 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61  utine will be ca
2e150 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65 74 75  lled before retu
2e160 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a  rning to unlock.
2e170 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66          ** the f
2e180 69 6c 65 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f  ile. If the unlo
2e190 63 6b 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73  ck attempt fails
2e1a0 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f  , then Pager.eLo
2e1b0 63 6b 20 6d 75 73 74 20 62 65 0a 20 20 20 20 20  ck must be.     
2e1c0 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b     ** set to UNK
2e1d0 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74  NOWN_LOCK (see t
2e1e0 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
2e1f0 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72   the #define for
2e200 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b   .        ** UNK
2e210 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20  NOWN_LOCK above 
2e220 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69  for an explanati
2e230 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  on). .        **
2e240 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f  .        ** In o
2e250 72 64 65 72 20 74 6f 20 67 65 74 20 70 61 67 65  rder to get page
2e260 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f  r_unlock() to do
2e270 20 74 68 69 73 2c 20 73 65 74 20 50 61 67 65 72   this, set Pager
2e280 2e 65 53 74 61 74 65 20 74 6f 0a 20 20 20 20 20  .eState to.     
2e290 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f     ** PAGER_ERRO
2e2a0 52 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 6e  R now. This is n
2e2b0 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e  ot actually coun
2e2c0 74 65 64 20 61 73 20 61 20 74 72 61 6e 73 69 74  ted as a transit
2e2d0 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ion.        ** t
2e2e0 6f 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e  o ERROR state in
2e2f0 20 74 68 65 20 73 74 61 74 65 20 64 69 61 67 72   the state diagr
2e300 61 6d 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66  am at the top of
2e310 20 74 68 69 73 20 66 69 6c 65 2c 0a 20 20 20 20   this file,.    
2e320 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20      ** since we 
2e330 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 73 61  know that the sa
2e340 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  me call to pager
2e350 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76  _unlock() will v
2e360 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  ery.        ** s
2e370 68 6f 72 74 6c 79 20 74 72 61 6e 73 69 74 69 6f  hortly transitio
2e380 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  n the pager obje
2e390 63 74 20 74 6f 20 74 68 65 20 4f 50 45 4e 20 73  ct to the OPEN s
2e3a0 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20  tate. Calling.  
2e3b0 20 20 20 20 20 20 2a 2a 20 61 73 73 65 72 74 5f        ** assert_
2e3c0 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 77 6f  pager_state() wo
2e3d0 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73  uld fail now, as
2e3e0 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62   it should not b
2e3f0 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20  e possible.     
2e400 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45     ** to be in E
2e410 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20  RROR state when 
2e420 74 68 65 72 65 20 61 72 65 20 7a 65 72 6f 20 6f  there are zero o
2e430 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
2e440 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 66 65  .        ** refe
2e450 72 65 6e 63 65 73 2e 0a 20 20 20 20 20 20 20 20  rences..        
2e460 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  */.        pager
2e470 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
2e480 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  c);.        goto
2e490 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
2e4a0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
2e4b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
2e4c0 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
2e4d0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61      assert( (pPa
2e4e0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52  ger->eLock==SHAR
2e4f0 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20  ED_LOCK).       
2e500 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
2e510 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
2e520 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53   pPager->eLock>S
2e530 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20  HARED_LOCK).    
2e540 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
2e550 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
2e560 70 46 69 6c 65 20 0a 20 20 20 20 20 26 26 20 28  pFile .     && (
2e570 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
2e580 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  || sqlite3Pcache
2e590 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
2e5a0 2d 3e 70 50 43 61 63 68 65 29 3e 30 29 20 0a 20  ->pPCache)>0) . 
2e5b0 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54     ){.      /* T
2e5c0 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68  he shared-lock h
2e5d0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71  as just been acq
2e5e0 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74  uired on the dat
2e5f0 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20  abase file.     
2e600 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72   ** and there ar
2e610 65 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20  e already pages 
2e620 69 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72  in the cache (fr
2e630 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20  om a previous.  
2e640 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77      ** read or w
2e650 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
2e660 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  ).  Check to see
2e670 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
2e680 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65  .      ** has be
2e690 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66  en modified.  If
2e6a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
2e6b0 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68  s changed, flush
2e6c0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61   the.      ** ca
2e6d0 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  che..      **.  
2e6e0 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20      ** Database 
2e6f0 63 68 61 6e 67 65 73 20 69 73 20 64 65 74 65 63  changes is detec
2e700 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  ted by looking a
2e710 74 20 31 35 20 62 79 74 65 73 20 62 65 67 69 6e  t 15 bytes begin
2e720 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74  ning.      ** at
2e730 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20   offset 24 into 
2e740 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66  the file.  The f
2e750 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65 20  irst 4 of these 
2e760 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20 20  16 bytes are.   
2e770 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63     ** a 32-bit c
2e780 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69  ounter that is i
2e790 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20  ncremented with 
2e7a0 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68  each change.  Th
2e7b0 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  e.      ** other
2e7c0 20 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61   bytes change ra
2e7d0 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68  ndomly with each
2e7e0 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65   file change whe
2e7f0 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64  n.      ** a cod
2e800 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20  ec is in use..  
2e810 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a      ** .      **
2e820 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e 69   There is a vani
2e830 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68  shingly small ch
2e840 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61 6e  ance that a chan
2e850 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a  ge will not be .
2e860 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65        ** detecte
2e870 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f  d.  The chance o
2e880 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20  f an undetected 
2e890 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61  change is so sma
2e8a0 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  ll that.      **
2e8b0 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65   it can be negle
2e8c0 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  cted..      */. 
2e8d0 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 20       Pgno nPage 
2e8e0 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20  = 0;.      char 
2e8f0 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f  dbFileVers[sizeo
2e900 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
2e910 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20 72  Vers)];..      r
2e920 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  c = pagerPagecou
2e930 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67  nt(pPager, &nPag
2e940 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
2e950 20 29 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a   ) goto failed;.
2e960 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65  .      if( nPage
2e970 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 49 4f  >0 ){.        IO
2e980 54 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25  TRACE(("CKVERS %
2e990 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
2e9a0 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
2e9b0 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72  rs)));.        r
2e9c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
2e9d0 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64  d(pPager->fd, &d
2e9e0 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
2e9f0 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32  f(dbFileVers), 2
2ea00 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  4);.        if( 
2ea10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2ea20 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2ea30 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
2ea40 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
2ea50 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62         memset(db
2ea60 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a  FileVers, 0, siz
2ea70 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
2ea80 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2ea90 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67   if( memcmp(pPag
2eaa0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
2eab0 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
2eac0 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 21  of(dbFileVers))!
2ead0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  =0 ){.        pa
2eae0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
2eaf0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2eb00 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
2eb10 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20  e is a WAL file 
2eb20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
2eb30 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61  em, open this da
2eb40 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20  tabase in WAL.  
2eb50 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72    ** mode. Other
2eb60 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  wise, the follow
2eb70 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ing function cal
2eb80 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  l is a no-op..  
2eb90 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
2eba0 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73  gerOpenWalIfPres
2ebb0 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ent(pPager);.   
2ebc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2ebd0 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d  >pWal==0 || rc==
2ebe0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
2ebf0 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
2ec00 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
2ec10 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
2ec20 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
2ec30 72 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e 52  rc = pagerBeginR
2ec40 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
2ec50 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  Pager);.  }..  i
2ec60 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
2ec70 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  e==PAGER_OPEN &&
2ec80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ec90 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
2eca0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
2ecb0 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  , &pPager->dbSiz
2ecc0 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64  e);.  }.. failed
2ecd0 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
2ece0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
2ecf0 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
2ed00 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
2ed10 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73  pPager);.    ass
2ed20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
2ed30 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
2ed40 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2ed50 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
2ed60 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20   PAGER_READER;. 
2ed70 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2ed80 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
2ed90 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
2eda0 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f  has reached zero
2edb0 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61  , rollback any a
2edc0 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  ctive.** transac
2edd0 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  tion and unlock 
2ede0 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a  the pager..**.**
2edf0 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b   Except, in lock
2ee00 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49  ing_mode=EXCLUSI
2ee10 56 45 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  VE when there is
2ee20 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a   nothing to in.*
2ee30 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
2ee40 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f  ournal, the unlo
2ee50 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72  ck is not perfor
2ee60 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20 69 73  med and there is
2ee70 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72  .** nothing to r
2ee80 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73  ollback, so this
2ee90 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
2eea0 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  -op..*/ .static 
2eeb0 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
2eec0 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a  IfUnused(Pager *
2eed0 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 28  pPager){.  if( (
2eee0 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
2eef0 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
2ef00 43 61 63 68 65 29 3d 3d 30 29 20 29 7b 0a 20 20  Cache)==0) ){.  
2ef10 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
2ef20 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
2ef30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
2ef40 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65 6e  cquire a referen
2ef50 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  ce to page numbe
2ef60 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72 20  r pgno in pager 
2ef70 70 50 61 67 65 72 20 28 61 20 70 61 67 65 0a 2a  pPager (a page.*
2ef80 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61 73 20  * reference has 
2ef90 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e 20 49  type DbPage*). I
2efa0 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
2efb0 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a  reference is .**
2efc0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62   successfully ob
2efd0 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f  tained, it is co
2efe0 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20  pied to *ppPage 
2eff0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
2f000 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
2f010 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
2f020 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
2f030 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74 20  n the cache, it 
2f040 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
2f050 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65   Otherwise, a ne
2f060 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73  w page object is
2f070 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70   allocated and p
2f080 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64 61  opulated with da
2f090 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20  ta.** read from 
2f0a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2f0b0 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73  e. In some cases
2f0c0 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  , the pcache mod
2f0d0 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73  ule may.** choos
2f0e0 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74  e not to allocat
2f0f0 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a  e a new page obj
2f100 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73  ect and may reus
2f110 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a  e an existing.**
2f120 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20   object with no 
2f130 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
2f140 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rences..**.** Th
2f150 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
2f160 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
2f170 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
2f180 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74  lized to zeros t
2f190 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d  he .** first tim
2f1a0 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
2f1b0 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20  ed into memory. 
2f1c0 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71 75  If the page requ
2f1d0 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72  ested is .** alr
2f1e0 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68  eady in the cach
2f1f0 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
2f200 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
2f210 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a  then the extra.*
2f220 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20 61  * data is left a
2f230 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74 68  s it was when th
2f240 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61  e page object wa
2f250 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a  s last used..**.
2f260 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
2f270 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c  se image is smal
2f280 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ler than the req
2f290 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20 69  uested page or i
2f2a0 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  f a .** non-zero
2f2b0 20 76 61 6c 75 65 20 69 73 20 70 61 73 73 65 64   value is passed
2f2c0 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e   as the noConten
2f2d0 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64 20  t parameter and 
2f2e0 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65  the .** requeste
2f2f0 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  d page is not al
2f300 72 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20  ready stored in 
2f310 74 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20  the cache, then 
2f320 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69  no .** actual di
2f330 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20  sk read occurs. 
2f340 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2f350 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66   memory image of
2f360 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73   the .** page is
2f370 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
2f380 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a  all zeros. .**.*
2f390 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69  * If noContent i
2f3a0 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73  s true, it means
2f3b0 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
2f3c0 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 63  care about the c
2f3d0 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68  ontents.** of th
2f3e0 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63  e page. This occ
2f3f0 75 72 73 20 69 6e 20 74 77 6f 20 73 65 70 65 72  urs in two seper
2f400 61 74 65 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a  ate scenarios:.*
2f410 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20 72  *.**   a) When r
2f420 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c 69  eading a free-li
2f430 73 74 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f  st leaf page fro
2f440 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  m the database, 
2f450 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57  and.**.**   b) W
2f460 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
2f470 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
2f480 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65 64  back and we need
2f490 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20   to load.**     
2f4a0 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74 6f   a new page into
2f4b0 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 62 65   the cache to be
2f4c0 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
2f4d0 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20   data read.**   
2f4e0 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65     from the save
2f4f0 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  point journal..*
2f500 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  *.** If noConten
2f510 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  t is true, then 
2f520 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e 65  the data returne
2f530 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74  d is zeroed inst
2f540 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20  ead of.** being 
2f550 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
2f560 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e  tabase. Addition
2f570 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63  ally, the bits c
2f580 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
2f590 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72  to pgno in Pager
2f5a0 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74  .pInJournal (bit
2f5b0 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
2f5c0 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20  eady written to 
2f5d0 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
2f5e0 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61 67  ile) and the Pag
2f5f0 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
2f600 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
2f610 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20   of any open.** 
2f620 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73  savepoints are s
2f630 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  et. This means i
2f640 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  f the page is ma
2f650 64 65 20 77 72 69 74 61 62 6c 65 20 61 74 20 61  de writable at a
2f660 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74  ny.** point in t
2f670 68 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67  he future, using
2f680 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
2f690 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2c 20  e3PagerWrite(), 
2f6a0 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  its contents.** 
2f6b0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72  will not be jour
2f6c0 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65  naled. This save
2f6d0 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  s IO..**.** The 
2f6e0 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
2f6f0 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
2f700 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
2f710 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
2f720 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
2f730 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
2f740 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
2f750 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
2f760 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
2f770 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
2f780 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20  p().  Both this 
2f790 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b  routine and Look
2f7a0 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
2f7b0 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
2f7c0 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
2f7d0 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
2f7e0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
2f7f0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
2f800 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
2f810 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
2f820 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
2f830 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a  hereas Lookup().
2f840 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
2f850 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
2f860 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
2f870 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
2f880 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
2f890 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
2f8a0 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
2f8b0 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
2f8c0 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
2f8d0 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b  y..** Since Look
2f8e0 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20  up() never goes 
2f8f0 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65  to disk, it neve
2f900 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69  r has to deal wi
2f910 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a  th locks.** or j
2f920 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f  ournal files..*/
2f930 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2f940 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65  rAcquire(.  Page
2f950 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
2f960 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65  /* The pager ope
2f970 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
2f980 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
2f990 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
2f9a0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
2f9b0 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50  o fetch */.  DbP
2f9c0 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
2f9d0 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e   /* Write a poin
2f9e0 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
2f9f0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  here */.  int no
2fa00 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a  Content       /*
2fa10 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72   Do not bother r
2fa20 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66  eading content f
2fa30 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65  rom disk if true
2fa40 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
2fa50 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
2fa60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2fa70 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
2fa80 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65  READER );.  asse
2fa90 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
2faa0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
2fab0 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  ;..  if( pgno==0
2fac0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2fad0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2fae0 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  PT;.  }..  /* If
2faf0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
2fb00 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2fb10 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
2fb20 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a  r immediately. .
2fb30 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
2fb40 72 65 71 75 65 73 74 20 74 68 65 20 70 61 67 65  request the page
2fb50 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63 68 65   from the PCache
2fb60 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28   layer. */.  if(
2fb70 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2fb80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  !=SQLITE_OK && p
2fb90 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
2fba0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
2fbb0 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
2fbc0 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65  errCode;.  }else
2fbd0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
2fbe0 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
2fbf0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
2fc00 67 6e 6f 2c 20 31 2c 20 70 70 50 61 67 65 29 3b  gno, 1, ppPage);
2fc10 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
2fc20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2fc30 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 63   /* Either the c
2fc40 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63  all to sqlite3Pc
2fc50 61 63 68 65 46 65 74 63 68 28 29 20 72 65 74 75  acheFetch() retu
2fc60 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f 72  rned an error or
2fc70 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
2fc80 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 69 6e  r was already in
2fc90 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65   the error-state
2fca0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
2fcb0 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a  ion was called..
2fcc0 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20 74      ** Set pPg t
2fcd0 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20  o 0 and jump to 
2fce0 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68 61  the exception ha
2fcf0 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70  ndler.  */.    p
2fd00 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  Pg = 0;.    goto
2fd10 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
2fd20 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rr;.  }.  assert
2fd30 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e  ( (*ppPage)->pgn
2fd40 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  o==pgno );.  ass
2fd50 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e  ert( (*ppPage)->
2fd60 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c  pPager==pPager |
2fd70 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61  | (*ppPage)->pPa
2fd80 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  ger==0 );..  if(
2fd90 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67   (*ppPage)->pPag
2fda0 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74  er && !noContent
2fdb0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
2fdc0 69 73 20 63 61 73 65 20 74 68 65 20 70 63 61 63  is case the pcac
2fdd0 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61  he already conta
2fde0 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a  ins an initializ
2fdf0 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a  ed copy of.    *
2fe00 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65 74 75  * the page. Retu
2fe10 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74 68  rn without furth
2fe20 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20  er ado.  */.    
2fe30 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41  assert( pgno<=PA
2fe40 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20  GER_MAX_PGNO && 
2fe50 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
2fe60 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20  GNO(pPager) );. 
2fe70 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
2fe80 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20  ager->nHit);.   
2fe90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2fea0 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K;..  }else{.   
2feb0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61   /* The pager ca
2fec0 63 68 65 20 68 61 73 20 63 72 65 61 74 65 64 20  che has created 
2fed0 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20  a new page. Its 
2fee0 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f  content needs to
2fef0 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74   .    ** be init
2ff00 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20  ialized.  */..  
2ff10 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
2ff20 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20  ger->nMiss);.   
2ff30 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65 3b 0a   pPg = *ppPage;.
2ff40 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20      pPg->pPager 
2ff50 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f  = pPager;..    /
2ff60 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  * The maximum pa
2ff70 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33  ge number is 2^3
2ff80 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  1. Return SQLITE
2ff90 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61  _CORRUPT if a pa
2ffa0 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  ge.    ** number
2ffb0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
2ffc0 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75 73 65  is, or the unuse
2ffd0 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20  d locking-page, 
2ffe0 69 73 20 72 65 71 75 65 73 74 65 64 2e 20 2a 2f  is requested. */
2fff0 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41  .    if( pgno>PA
30000 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20  GER_MAX_PGNO || 
30010 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
30020 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
30030 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
30040 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
30050 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
30060 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
30070 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d 44   }..    if( MEMD
30080 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53  B || pPager->dbS
30090 69 7a 65 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c  ize<(int)pgno ||
300a0 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69   noContent || !i
300b0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
300c0 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
300d0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  gno>pPager->mxPg
300e0 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  no ){.        rc
300f0 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
30100 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
30110 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
30120 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
30130 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  ( noContent ){. 
30140 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72         /* Failur
30150 65 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74  e to set the bit
30160 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e  s in the InJourn
30170 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69  al bit-vectors i
30180 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20  s benign..      
30190 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d    ** It merely m
301a0 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67  eans that we mig
301b0 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61  ht do some extra
301c0 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c   work to journal
301d0 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70   a .        ** p
301e0 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
301f0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  t need to be jou
30200 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68  rnaled.  Neverth
30210 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a  eless, be sure .
30220 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65          ** to te
30230 73 74 20 74 68 65 20 63 61 73 65 20 77 68 65 72  st the case wher
30240 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  e a malloc error
30250 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
30260 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20  ying to set .   
30270 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e       ** a bit in
30280 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20   a bit vector.. 
30290 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
302a0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
302b0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
302c0 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d        if( pgno<=
302d0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
302e0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
302f0 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29  TESTONLY( rc = )
30300 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
30310 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
30320 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  rnal, pgno);.   
30330 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
30340 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
30350 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  M );.        }. 
30360 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28         TESTONLY(
30370 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76   rc = ) addToSav
30380 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
30390 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  ager, pgno);.   
303a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
303b0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
303c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
303d0 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
303e0 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  c();.      }.   
303f0 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70     memset(pPg->p
30400 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d  Data, 0, pPager-
30410 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
30420 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f    IOTRACE(("ZERO
30430 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
30440 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  r, pgno));.    }
30450 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
30460 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d  rt( pPg->pPager=
30470 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20  =pPager );.     
30480 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
30490 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  (pPg);.      if(
304a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
304b0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  {.        goto p
304c0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
304d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
304e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
304f0 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
30500 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
30510 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
30520 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  );.#endif.  }.. 
30530 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
30540 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72  K;..pager_acquir
30550 65 5f 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28  e_err:.  assert(
30560 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30570 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  ;.  if( pPg ){. 
30580 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
30590 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20  Drop(pPg);.  }. 
305a0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
305b0 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 0a 20  used(pPager);.. 
305c0 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
305d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
305e0 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
305f0 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  ge if it is alre
30600 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  ady in the in-me
30610 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a  mory cache.  Do.
30620 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20  ** not read the 
30630 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20  page from disk. 
30640 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
30650 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a  r to the page,.*
30660 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61  * or 0 if the pa
30670 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
30680 68 65 2e 20 41 6c 73 6f 2c 20 72 65 74 75 72 6e  he. Also, return
30690 20 30 20 69 66 20 74 68 65 20 0a 2a 2a 20 70 61   0 if the .** pa
306a0 67 65 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f  ger is in PAGER_
306b0 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 77 68 65  UNLOCK state whe
306c0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
306d0 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 6f 72  is called,.** or
306e0 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
306f0 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
30700 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  te other than SQ
30710 4c 49 54 45 5f 46 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  LITE_FULL..**.**
30720 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
30730 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68  3PagerGet().  Th
30740 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
30750 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
30760 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  e.** and sqlite3
30770 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68  PagerGet() is th
30780 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67  at _get() will g
30790 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e  o to the disk an
307a0 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65  d read.** in the
307b0 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
307c0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
307d0 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73   in cache.  This
307e0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
307f0 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  rns NULL if the 
30800 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
30810 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73  ache or if a dis
30820 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  k I/O error .** 
30830 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65  has ever happene
30840 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71  d..*/.DbPage *sq
30850 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
30860 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
30870 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
30880 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  Hdr *pPg = 0;.  
30890 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
308a0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
308b0 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  gno!=0 );.  asse
308c0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43 61  rt( pPager->pPCa
308d0 63 68 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  che!=0 );.  asse
308e0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
308f0 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
30900 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61   );.  sqlite3Pca
30910 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
30920 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
30930 30 2c 20 26 70 50 67 29 3b 0a 20 20 72 65 74 75  0, &pPg);.  retu
30940 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn pPg;.}../*.**
30950 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 20   Release a page 
30960 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a  reference..**.**
30970 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
30980 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
30990 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f  the page drop to
309a0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a   zero, then the.
309b0 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64  ** page is added
309c0 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74   to the LRU list
309d0 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65  .  When all refe
309e0 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61  rences to all pa
309f0 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61  ges.** are relea
30a00 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  sed, a rollback 
30a10 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c  occurs and the l
30a20 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
30a30 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65  ase is.** remove
30a40 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
30a50 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50  e3PagerUnref(DbP
30a60 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  age *pPg){.  if(
30a70 20 70 50 67 20 29 7b 0a 20 20 20 20 50 61 67 65   pPg ){.    Page
30a80 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
30a90 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c  >pPager;.    sql
30aa0 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73  ite3PcacheReleas
30ab0 65 28 70 50 67 29 3b 0a 20 20 20 20 70 61 67 65  e(pPg);.    page
30ac0 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
30ad0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  pPager);.  }.}..
30ae0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
30af0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74  ion is called at
30b00 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 76   the start of ev
30b10 65 72 79 20 77 72 69 74 65 20 74 72 61 6e 73 61  ery write transa
30b20 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20  ction..** There 
30b30 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62 65 20  must already be 
30b40 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
30b50 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
30b60 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
30b70 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
30b80 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
30b90 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  d..**.** Open th
30ba0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
30bb0 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
30bc0 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72  and write a jour
30bd0 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f  nal header.** to
30be0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74   the start of it
30bf0 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  . If there are a
30c00 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
30c10 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  , open the sub-j
30c20 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c  ournal.** as wel
30c30 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  l. This function
30c40 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68   is only used wh
30c50 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
30c60 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a  ile is being .**
30c70 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65   opened to write
30c80 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20   a rollback log 
30c90 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
30ca0 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65  n. It is not use
30cb0 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69  d .** when openi
30cc0 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ng a hot journal
30cd0 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74   file to roll it
30ce0 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
30cf0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
30d00 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
30d10 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69   (as it may be i
30d20 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
30d30 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  ),.** then this 
30d40 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72  function just wr
30d50 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68  ites a journal h
30d60 65 61 64 65 72 20 74 6f 20 74 68 65 20 73 74 61  eader to the sta
30d70 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72  rt of the.** alr
30d80 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20  eady open file. 
30d90 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
30da0 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
30db0 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
30dc0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
30dd0 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e  n, the.** Pager.
30de0 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65  pInJournal bitve
30df0 63 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  c structure is a
30e00 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  llocated..**.** 
30e10 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
30e20 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
30e30 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74  s successful. Ot
30e40 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
30e50 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
30e60 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
30e70 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65  to allocate Page
30e80 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69  r.pInJournal fai
30e90 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f  ls, or .** an IO
30ea0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f   error code if o
30eb0 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  pening or writin
30ec0 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
30ed0 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  le fails..*/.sta
30ee0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
30ef0 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
30f00 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
30f10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
30f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f30 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
30f40 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
30f50 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
30f60 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
30f70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  Vfs;   /* Local 
30f80 63 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69  cache of vfs poi
30f90 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
30fa0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
30fb0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
30fc0 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65  LOCKED );.  asse
30fd0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
30fe0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
30ff0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
31000 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
31010 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20  0 );.  .  /* If 
31020 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65  already in the e
31030 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73  rror state, this
31040 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
31050 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20  o-op.  But on.  
31060 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  ** the other han
31070 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
31080 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
31090 69 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64  if we are alread
310a0 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72  y in.  ** an err
310b0 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69  or state. */.  i
310c0 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
310d0 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75  >errCode) ) retu
310e0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
310f0 64 65 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65  de;..  if( !page
31100 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
31110 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
31120 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
31130 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
31140 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
31150 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
31160 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50  3BitvecCreate(pP
31170 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
31180 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
31190 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a  InJournal==0 ){.
311a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
311b0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
311c0 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  .  .    /* Open 
311d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
311e0 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   if it is not al
311f0 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20  ready open. */. 
31200 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70     if( !isOpen(p
31210 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
31220 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
31230 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
31240 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
31250 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
31260 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72    sqlite3MemJour
31270 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
31280 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  jfd);.      }els
31290 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  e{.        const
312a0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20 20   int flags =    
312b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
312c0 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20 6f  * VFS flags to o
312d0 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  pen journal file
312e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 53 51   */.          SQ
312f0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
31300 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
31310 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20  CREATE|.        
31320 20 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46    (pPager->tempF
31330 69 6c 65 20 3f 20 0a 20 20 20 20 20 20 20 20 20  ile ? .         
31340 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f     (SQLITE_OPEN_
31350 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51  DELETEONCLOSE|SQ
31360 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
31370 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20  OURNAL):.       
31380 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45       (SQLITE_OPE
31390 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a  N_MAIN_JOURNAL).
313a0 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 23            );.  #
313b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
313c0 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
313d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
313e0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e  lite3JournalOpen
313f0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56  (.            pV
31400 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
31410 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
31420 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75  d, flags, jrnlBu
31430 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
31440 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 23 65  .        );.  #e
31450 6c 73 65 0a 20 20 20 20 20 20 20 20 72 63 20 3d  lse.        rc =
31460 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
31470 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
31480 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
31490 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  fd, flags, 0);. 
314a0 20 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a   #endif.      }.
314b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
314c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
314d0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
314e0 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  d) );.    }.  . 
314f0 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
31500 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
31510 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a   header to the j
31520 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20  ournal file and 
31530 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65  open .    ** the
31540 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   sub-journal if 
31550 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a  necessary..    *
31560 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
31570 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31580 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20   /* TODO: Check 
31590 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20  if all of these 
315a0 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69  are really requi
315b0 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50  red. */.      pP
315c0 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
315d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
315e0 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
315f0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
31600 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  aster = 0;.     
31610 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
31620 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Hdr = 0;.      r
31630 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
31640 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
31650 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
31660 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31670 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
31680 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
31690 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
316a0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
316b0 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  nal = 0;.  }else
316c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
316d0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
316e0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
316f0 44 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  D );.    pPager-
31700 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
31710 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b  WRITER_CACHEMOD;
31720 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
31730 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  c;.}../*.** Begi
31740 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
31750 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65  ction on the spe
31760 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a  cified pager obj
31770 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72  ect. If a .** wr
31780 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
31790 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
317a0 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75   opened, this fu
317b0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
317c0 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
317d0 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  exFlag argument 
317e0 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61  is false, then a
317f0 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 20  cquire at least 
31800 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f  a RESERVED.** lo
31810 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
31820 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c  se file. If exFl
31830 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
31840 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73   acquire at leas
31850 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56  t.** an EXCLUSIV
31860 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20  E lock. If such 
31870 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  a lock is alread
31880 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69  y held, no locki
31890 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  ng .** functions
318a0 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e   need be called.
318b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75  .**.** If the su
318c0 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d  bjInMemory argum
318d0 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ent is non-zero,
318e0 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f   then any sub-jo
318f0 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20  urnal opened.** 
31900 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e  within this tran
31910 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
31920 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
31930 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69  memory file. Thi
31940 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65  s.** has no effe
31950 63 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f  ct if the sub-jo
31960 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79  urnal is already
31970 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d   opened (as it m
31980 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75  ay be when.** ru
31990 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
319a0 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74  ve mode) or if t
319b0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64  he transaction d
319c0 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
319d0 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  a.** sub-journal
319e0 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d  . If the subjInM
319f0 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69  emory argument i
31a00 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79  s zero, then any
31a10 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62   required.** sub
31a20 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c  -journal is impl
31a30 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72  emented in-memor
31a40 79 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61  y if pPager is a
31a50 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
31a60 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69  base, .** or usi
31a70 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ng a temporary f
31a80 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ile otherwise..*
31a90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
31aa0 65 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70  erBegin(Pager *p
31ab0 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61  Pager, int exFla
31ac0 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d  g, int subjInMem
31ad0 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ory){.  int rc =
31ae0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
31af0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
31b00 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
31b10 45 52 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ER );.  pPager->
31b20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28  subjInMemory = (
31b30 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b  u8)subjInMemory;
31b40 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ..  if( ALWAYS(p
31b50 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
31b60 41 47 45 52 5f 52 45 41 44 45 52 29 20 29 7b 0a  AGER_READER) ){.
31b70 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
31b80 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
31b90 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61  0 );..    if( pa
31ba0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
31bb0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
31bc0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63 6f   the pager is co
31bd0 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20  nfigured to use 
31be0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
31bf0 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20  lusive, and an. 
31c00 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76       ** exclusiv
31c10 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
31c20 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c  tabase is not al
31c30 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61  ready held, obta
31c40 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20  in it now..     
31c50 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
31c60 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
31c70 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33 57 61  ode && sqlite3Wa
31c80 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70  lExclusiveMode(p
31c90 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29  Pager->pWal, -1)
31ca0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
31cb0 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
31cc0 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
31cd0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  OCK);.        if
31ce0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31cf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
31d00 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
31d10 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
31d20 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
31d30 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
31d40 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1);.      }..   
31d50 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77     /* Grab the w
31d60 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
31d70 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75   log file. If su
31d80 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64  ccessful, upgrad
31d90 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41  e to.      ** PA
31da0 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61  GER_RESERVED sta
31db0 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  te. Otherwise, r
31dc0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
31dd0 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
31de0 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  r..      ** The 
31df0 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20  busy-handler is 
31e00 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61  not invoked if a
31e10 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f  nother connectio
31e20 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20  n already.      
31e30 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69  ** holds the wri
31e40 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73  te-lock. If poss
31e50 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20  ible, the upper 
31e60 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20  layer will call 
31e70 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  it..      */.   
31e80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
31e90 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
31ea0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
31eb0 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pWal);.    }else
31ec0 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69  {.      /* Obtai
31ed0 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
31ee0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
31ef0 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65  e file. If the e
31f00 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a  xFlag parameter.
31f10 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65        ** is true
31f20 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65  , then immediate
31f30 6c 79 20 75 70 67 72 61 64 65 20 74 68 69 73 20  ly upgrade this 
31f40 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
31f50 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20  lock. The.      
31f60 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  ** busy-handler 
31f70 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20  callback can be 
31f80 75 73 65 64 20 77 68 65 6e 20 75 70 67 72 61 64  used when upgrad
31f90 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55  ing to the EXCLU
31fa0 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  SIVE.      ** lo
31fb0 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e  ck, but not when
31fc0 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52   obtaining the R
31fd0 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20  ESERVED lock..  
31fe0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
31ff0 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
32000 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c  ager, RESERVED_L
32010 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
32020 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
32030 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   exFlag ){.     
32040 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
32050 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
32060 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
32070 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
32080 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
32090 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
320a0 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57    /* Change to W
320b0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
320c0 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  te..      **.   
320d0 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73     ** WAL mode s
320e0 65 74 73 20 50 61 67 65 72 2e 65 53 74 61 74 65  ets Pager.eState
320f0 20 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52   to PAGER_WRITER
32100 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45  _LOCKED or CACHE
32110 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65  MOD.      ** whe
32120 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e  n it has an open
32130 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75   transaction, bu
32140 74 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44  t never to DBMOD
32150 20 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20   or FINISHED..  
32160 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62      ** This is b
32170 65 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20  ecause in those 
32180 73 74 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  states the code 
32190 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76  to roll back sav
321a0 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a  epoint .      **
321b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61   transactions ma
321c0 79 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  y copy data from
321d0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
321e0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
321f0 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  se .      ** fil
32200 65 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74  e as well as int
32210 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  o the page cache
32220 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65  . Which would be
32230 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20   incorrect in . 
32240 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65       ** WAL mode
32250 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
32260 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
32270 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  = PAGER_WRITER_L
32280 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61  OCKED;.      pPa
32290 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
322a0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
322b0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
322c0 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 50 61  dbFileSize = pPa
322d0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
322e0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69     pPager->dbOri
322f0 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  gSize = pPager->
32300 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50  dbSize;.      pP
32310 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
32320 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
32330 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
32340 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
32350 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
32360 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73  READER );.    as
32370 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
32380 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  _OK || pPager->e
32390 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
323a0 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  TER_LOCKED );.  
323b0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
323c0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
323d0 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50  ger) );.  }..  P
323e0 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41 4e  AGERTRACE(("TRAN
323f0 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50  SACTION %d\n", P
32400 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
32410 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
32420 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73  ../*.** Mark a s
32430 69 6e 67 6c 65 20 64 61 74 61 20 70 61 67 65 20  ingle data page 
32440 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68  as writeable. Th
32450 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
32460 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d  n into the .** m
32470 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73  ain journal or s
32480 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65  ub-journal as re
32490 71 75 69 72 65 64 2e 20 49 66 20 74 68 65 20 70  quired. If the p
324a0 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
324b0 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68  nto.** one of th
324c0 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20  e journals, the 
324d0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
324e0 74 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20  t is set in the 
324f0 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  .** Pager.pInJou
32500 72 6e 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20  rnal bitvec and 
32510 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
32520 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
32530 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e  bitvecs.** of an
32540 79 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  y open savepoint
32550 73 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  s as appropriate
32560 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
32570 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64  pager_write(PgHd
32580 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20  r *pPg){.  void 
32590 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44  *pData = pPg->pD
325a0 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ata;.  Pager *pP
325b0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
325c0 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
325d0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
325e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
325f0 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73  not called unles
32600 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
32610 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
32620 79 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74 61  y .  ** been sta
32630 72 74 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61  rted. The journa
32640 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61  l file may or ma
32650 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61 74  y not be open at
32660 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a   this point..  *
32670 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 63 61  * It is never ca
32680 6c 6c 65 64 20 69 6e 20 74 68 65 20 45 52 52 4f  lled in the ERRO
32690 52 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20  R state..  */.  
326a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
326b0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
326c0 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20  ITER_LOCKED.    
326d0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
326e0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
326f0 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
32700 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
32710 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
32720 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20  ER_DBMOD.  );.  
32730 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
32740 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
32750 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  r) );..  /* If a
32760 6e 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e  n error has been
32770 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65 74 65   previously dete
32780 63 74 65 64 2c 20 72 65 70 6f 72 74 20 74 68 65  cted, report the
32790 20 73 61 6d 65 20 65 72 72 6f 72 0a 20 20 2a 2a   same error.  **
327a0 20 61 67 61 69 6e 2e 20 54 68 69 73 20 73 68 6f   again. This sho
327b0 75 6c 64 20 6e 6f 74 20 68 61 70 70 65 6e 2c 20  uld not happen, 
327c0 62 75 74 20 74 68 65 20 63 68 65 63 6b 20 70 72  but the check pr
327d0 6f 76 69 64 65 73 20 72 6f 62 75 73 74 6e 65 73  ovides robustnes
327e0 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  s. */.  if( NEVE
327f0 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
32800 65 29 20 29 20 20 72 65 74 75 72 6e 20 70 50 61  e) )  return pPa
32810 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20  ger->errCode;.. 
32820 20 2f 2a 20 48 69 67 68 65 72 2d 6c 65 76 65 6c   /* Higher-level
32830 20 72 6f 75 74 69 6e 65 73 20 6e 65 76 65 72 20   routines never 
32840 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
32850 6f 6e 20 69 66 20 64 61 74 61 62 61 73 65 20 69  on if database i
32860 73 20 6e 6f 74 0a 20 20 2a 2a 20 77 72 69 74 61  s not.  ** writa
32870 62 6c 65 2e 20 20 42 75 74 20 63 68 65 63 6b 20  ble.  But check 
32880 61 6e 79 77 61 79 2c 20 6a 75 73 74 20 66 6f 72  anyway, just for
32890 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a   robustness. */.
328a0 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
328b0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 20  er->readOnly) ) 
328c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
328d0 52 4d 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47  RM;..  CHECK_PAG
328e0 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61  E(pPg);..  /* Ma
328f0 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64  rk the page as d
32900 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61  irty.  If the pa
32910 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ge has already b
32920 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a  een written.  **
32930 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
32940 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75  then we can retu
32950 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  rn right away.. 
32960 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61   */.  sqlite3Pca
32970 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
32980 29 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e 4a  );.  if( pageInJ
32990 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21  ournal(pPg) && !
329a0 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
329b0 28 70 50 67 29 20 29 7b 0a 20 20 20 20 61 73 73  (pPg) ){.    ass
329c0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
329d0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
329e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
329f0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
32a00 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29  RITER_CACHEMOD )
32a10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20  ;.  }else{..    
32a20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
32a30 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
32a40 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
32a50 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
32a60 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
32a70 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
32a80 6e 61 6c 20 6f 72 20 74 68 65 20 63 68 65 63 6b  nal or the check
32a90 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  point journal.  
32aa0 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20    ** or both..  
32ab0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 48 69 67 68    **.    ** High
32ac0 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65  er level routine
32ad0 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 6f  s have already o
32ae0 62 74 61 69 6e 65 64 20 74 68 65 20 6e 65 63 65  btained the nece
32af0 73 73 61 72 79 20 6c 6f 63 6b 73 0a 20 20 20 20  ssary locks.    
32b00 2a 2a 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20  ** to begin the 
32b10 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
32b20 6e 2c 20 62 75 74 20 74 68 65 20 72 6f 6c 6c 62  n, but the rollb
32b30 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ack journal migh
32b40 74 20 6e 6f 74 20 0a 20 20 20 20 2a 2a 20 79 65  t not .    ** ye
32b50 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e 20  t be open. Open 
32b60 69 74 20 6e 6f 77 20 69 66 20 74 68 69 73 20 69  it now if this i
32b70 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20  s the case..    
32b80 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
32b90 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
32ba0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
32bb0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
32bc0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
32bd0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
32be0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
32bf0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
32c00 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
32c10 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
32c20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
32c30 48 45 4d 4f 44 20 29 3b 0a 20 20 20 20 61 73 73  HEMOD );.    ass
32c40 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
32c50 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
32c60 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65  );.  .    /* The
32c70 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
32c80 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20  rnal now exists 
32c90 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45  and we have a RE
32ca0 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20  SERVED or an.   
32cb0 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
32cc0 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64  ck on the main d
32cd0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57  atabase file.  W
32ce0 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
32cf0 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20   page to.    ** 
32d00 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
32d10 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73  journal if it is
32d20 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61   not there alrea
32d30 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  dy..    */.    i
32d40 66 28 20 21 70 61 67 65 49 6e 4a 6f 75 72 6e 61  f( !pageInJourna
32d50 6c 28 70 50 67 29 20 26 26 20 21 70 61 67 65 72  l(pPg) && !pager
32d60 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
32d70 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
32d80 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
32d90 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  er)==0 );.      
32da0 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  if( pPg->pgno<=p
32db0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
32dc0 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  e && isOpen(pPag
32dd0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
32de0 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20      u32 cksum;. 
32df0 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61         char *pDa
32e00 74 61 32 3b 0a 20 20 20 20 20 20 20 20 69 36 34  ta2;.        i64
32e10 20 69 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e   iOff = pPager->
32e20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 20  journalOff;..   
32e30 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c       /* We shoul
32e40 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f  d never write to
32e50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
32e60 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a  e the page that.
32e70 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
32e80 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ins the database
32e90 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c   locks.  The fol
32ea0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65  lowing assert ve
32eb0 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 2a  rifies.        *
32ec0 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  * that we do not
32ed0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  . */.        ass
32ee0 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d  ert( pPg->pgno!=
32ef0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
32f00 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 20 20  ager) );..      
32f10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
32f20 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d 70 50  ->journalHdr<=pP
32f30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
32f40 20 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45   );.        CODE
32f50 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
32f60 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20  , pPg->pgno, 7, 
32f70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
32f80 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20  MEM, pData2);.  
32f90 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61        cksum = pa
32fa0 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
32fb0 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a  , (u8*)pData2);.
32fc0 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65 6e  .        /* Even
32fd0 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64 69 73   if an IO or dis
32fe0 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75  kfull error occu
32ff0 72 73 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c  rs while journal
33000 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20  ling the.       
33010 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
33020 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74  block above, set
33030 20 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66   the need-sync f
33040 6c 61 67 20 66 6f 72 20 74 68 65 20 70 61 67 65  lag for the page
33050 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68  ..        ** Oth
33060 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65  erwise, when the
33070 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
33080 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65  rolled back, the
33090 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20 20 20   logic in.      
330a0 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e    ** playback_on
330b0 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68  e_page() will th
330c0 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70 61 67  ink that the pag
330d0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  e needs to be re
330e0 73 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a  stored.        *
330f0 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  * in the databas
33100 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61  e file. And if a
33110 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
33120 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f  s while doing so
33130 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
33140 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79  n corruption may
33150 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20   follow..       
33160 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 67 2d   */.        pPg-
33170 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
33180 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20 20 20  NEED_SYNC;..    
33190 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
331a0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
331b0 2c 20 69 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e  , iOff, pPg->pgn
331c0 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
331d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
331e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
331f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
33200 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
33210 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
33220 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f  er->pageSize, iO
33230 66 66 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 69  ff+4);.        i
33240 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
33250 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
33260 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
33270 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
33280 66 64 2c 20 69 4f 66 66 2b 70 50 61 67 65 72 2d  fd, iOff+pPager-
33290 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 63 6b 73  >pageSize+4, cks
332a0 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  um);.        if(
332b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
332c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
332d0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
332e0 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25  OUT %p %d %lld %
332f0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
33300 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20  g->pgno, .      
33310 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
33320 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
33330 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
33340 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  );.        PAGER
33350 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
33360 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
33370 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  );.        PAGER
33380 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20  TRACE(("JOURNAL 
33390 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
333a0 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38 78  ync=%d hash(%08x
333b0 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
333c0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
333d0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a  r), pPg->pgno, .
333e0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70               ((p
333f0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
33400 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c  NEED_SYNC)?1:0),
33410 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
33420 70 50 67 29 29 29 3b 0a 0a 20 20 20 20 20 20 20  pPg)));..       
33430 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
33440 4f 66 66 20 2b 3d 20 38 20 2b 20 70 50 61 67 65  Off += 8 + pPage
33450 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
33460 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
33470 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  c++;.        ass
33480 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
33490 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
334a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
334b0 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
334c0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
334d0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
334e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
334f0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
33500 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
33510 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33520 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
33530 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 72  MEM );.        r
33540 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  c |= addToSavepo
33550 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
33560 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
33570 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
33580 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33590 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
335a0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
335b0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
335c0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
335d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
335e0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
335f0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
33600 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 7b 0a  WRITER_DBMOD ){.
33610 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66            pPg->f
33620 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
33630 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20  ED_SYNC;.       
33640 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45 52   }.        PAGER
33650 54 52 41 43 45 28 28 22 41 50 50 45 4e 44 20 25  TRACE(("APPEND %
33660 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
33670 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  nc=%d\n",.      
33680 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
33690 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
336a0 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  pgno,.          
336b0 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67       ((pPg->flag
336c0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
336d0 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 20  C)?1:0)));.     
336e0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
336f0 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  /* If the statem
33700 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ent journal is o
33710 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
33720 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20   is not in it,. 
33730 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65     ** then write
33740 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
33750 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65  e to the stateme
33760 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74  nt journal.  Not
33770 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
33780 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
33790 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65  nal format diffe
337a0 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e  rs from the stan
337b0 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  dard journal for
337c0 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  mat.    ** in th
337d0 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20  at it omits the 
337e0 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68  checksums and th
337f0 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f  e header..    */
33800 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52 65 71  .    if( subjReq
33810 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
33820 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62  {.      rc = sub
33830 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
33840 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
33850 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74  * Update the dat
33860 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72  abase size and r
33870 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  eturn..  */.  if
33880 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
33890 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  <pPg->pgno ){.  
338a0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
338b0 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
338c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
338d0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64  ../*.** Mark a d
338e0 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
338f0 65 61 62 6c 65 2e 20 54 68 69 73 20 72 6f 75 74  eable. This rout
33900 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c  ine must be call
33910 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20 6d 61  ed before .** ma
33920 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f 20  king changes to 
33930 61 20 70 61 67 65 2e 20 54 68 65 20 63 61 6c 6c  a page. The call
33940 65 72 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68  er must check th
33950 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 0a  e return value .
33960 2a 2a 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ** of this funct
33970 69 6f 6e 20 61 6e 64 20 62 65 20 63 61 72 65 66  ion and be caref
33980 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61 6e 67 65  ul not to change
33990 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75   any page data u
339a0 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69 73 20 72  nless .** this r
339b0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
339c0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
339d0 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
339e0 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63  etween this func
339f0 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77  tion and pager_w
33a00 72 69 74 65 28 29 20 69 73 20 74 68 61 74 20 74  rite() is that t
33a10 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
33a20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20  also deals with 
33a30 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  the special case
33a40 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65   where 2 or more
33a50 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e   pages.** fit on
33a60 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73   a single disk s
33a70 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63  ector. In this c
33a80 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64  ase all co-resid
33a90 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73  ent pages.** mus
33aa0 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  t have been writ
33ab0 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
33ac0 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72  al file before r
33ad0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
33ae0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
33af0 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rs, SQLITE_NOMEM
33b00 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
33b10 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
33b20 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70 72 69 61  .** as appropria
33b30 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  te. Otherwise, S
33b40 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
33b50 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
33b60 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61  te(DbPage *pDbPa
33b70 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ge){.  int rc = 
33b80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67  SQLITE_OK;..  Pg
33b90 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61  Hdr *pPg = pDbPa
33ba0 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge;.  Pager *pPa
33bb0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
33bc0 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50  r;.  Pgno nPageP
33bd0 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67  erSector = (pPag
33be0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70  er->sectorSize/p
33bf0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
33c00 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
33c10 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
33c20 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
33c30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
33c40 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
33c50 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61  GER_ERROR );.  a
33c60 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
33c70 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
33c80 29 20 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67  ) );..  if( nPag
33c90 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a  ePerSector>1 ){.
33ca0 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f      Pgno nPageCo
33cb0 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  unt;          /*
33cc0 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
33cd0 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
33ce0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50  se file */.    P
33cf0 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20  gno pg1;        
33d00 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
33d10 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
33d20 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
33d30 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  ted on. */.    i
33d40 6e 74 20 6e 50 61 67 65 20 3d 20 30 3b 20 20 20  nt nPage = 0;   
33d50 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
33d60 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72  er of pages star
33d70 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a  ting at pg1 to j
33d80 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e  ournal */.    in
33d90 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
33da0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
33db0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
33dc0 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  nt needSync = 0;
33dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
33de0 20 69 66 20 61 6e 79 20 70 61 67 65 20 68 61 73   if any page has
33df0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
33e00 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20   */..    /* Set 
33e10 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69  the doNotSyncSpi
33e20 6c 6c 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68  ll flag to 1. Th
33e30 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77 65  is is because we
33e40 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a 20 20   cannot allow.  
33e50 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 68    ** a journal h
33e60 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74  eader to be writ
33e70 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20  ten between the 
33e80 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20  pages journaled 
33e90 62 79 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66  by.    ** this f
33ea0 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  unction..    */.
33eb0 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
33ec0 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  DB );.    assert
33ed0 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
33ee0 79 6e 63 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20  yncSpill==0 );. 
33ef0 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
33f00 53 79 6e 63 53 70 69 6c 6c 2b 2b 3b 0a 0a 20 20  SyncSpill++;..  
33f10 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20    /* This trick 
33f20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74  assumes that bot
33f30 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  h the page-size 
33f40 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
33f50 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e  are.    ** an in
33f60 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32  teger power of 2
33f70 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62  . It sets variab
33f80 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64  le pg1 to the id
33f90 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20  entifier.    ** 
33fa0 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  of the first pag
33fb0 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  e of the sector 
33fc0 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f  pPg is located o
33fd0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67  n..    */.    pg
33fe0 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d  1 = ((pPg->pgno-
33ff0 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53  1) & ~(nPagePerS
34000 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a  ector-1)) + 1;..
34010 20 20 20 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d      nPageCount =
34020 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
34030 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
34040 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  no>nPageCount ){
34050 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28  .      nPage = (
34060 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29  pPg->pgno - pg1)
34070 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  +1;.    }else if
34080 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53  ( (pg1+nPagePerS
34090 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f  ector-1)>nPageCo
340a0 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
340b0 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b  ge = nPageCount+
340c0 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65  1-pg1;.    }else
340d0 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
340e0 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a  nPagePerSector;.
340f0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
34100 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61  (nPage>0);.    a
34110 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e  ssert(pg1<=pPg->
34120 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  pgno);.    asser
34130 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50  t((pg1+nPage)>pP
34140 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66  g->pgno);..    f
34150 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
34160 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
34170 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  OK; ii++){.     
34180 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69   Pgno pg = pg1+i
34190 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  i;.      PgHdr *
341a0 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28  pPage;.      if(
341b0 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c   pg==pPg->pgno |
341c0 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63  | !sqlite3Bitvec
341d0 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
341e0 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a  Journal, pg) ){.
341f0 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d          if( pg!=
34200 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
34210 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
34220 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
34230 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
34240 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20  pg, &pPage);.   
34250 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
34260 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34270 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
34280 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
34290 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
342a0 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47   pPage->flags&PG
342b0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
342c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
342d0 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
342e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
342f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
34300 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
34310 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
34320 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
34330 73 65 20 69 66 28 20 28 70 50 61 67 65 20 3d 20  se if( (pPage = 
34340 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
34350 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a  ger, pg))!=0 ){.
34360 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
34370 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  e->flags&PGHDR_N
34380 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20  EED_SYNC ){.    
34390 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
343a0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
343b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
343c0 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
343d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
343e0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 47 48     /* If the PGH
343f0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
34400 67 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e 79  g is set for any
34410 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70 61   of the nPage pa
34420 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61 72  ges .    ** star
34430 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65  ting at pg1, the
34440 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  n it needs to be
34450 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20   set for all of 
34460 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20  them. Because.  
34470 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20    ** writing to 
34480 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61  any of these nPa
34490 67 65 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d  ge pages may dam
344a0 61 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20  age the others, 
344b0 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  the.    ** journ
344c0 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e  al file must con
344d0 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63 6f  tain sync()ed co
344e0 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74  pies of all of t
344f0 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72  hem.    ** befor
34500 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63 61  e any of them ca
34510 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74  n be written out
34520 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
34530 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
34540 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
34550 5f 4f 4b 20 26 26 20 6e 65 65 64 53 79 6e 63 20  _OK && needSync 
34560 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
34570 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20   !MEMDB );.     
34580 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50   for(ii=0; ii<nP
34590 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  age; ii++){.    
345a0 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
345b0 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
345c0 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b  pPager, pg1+ii);
345d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
345e0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
345f0 70 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20  pPage->flags |= 
34600 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
34610 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
34620 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
34630 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
34640 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
34650 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
34660 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  ->doNotSyncSpill
34670 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==1 );.    pPage
34680 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c  r->doNotSyncSpil
34690 6c 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  l--;.  }else{.  
346a0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
346b0 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  te(pDbPage);.  }
346c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
346d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
346e0 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67  UE if the page g
346f0 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
34700 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75  ment was previou
34710 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f  sly passed.** to
34720 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
34730 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20  te().  In other 
34740 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
34750 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a  UE if it is ok.*
34760 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  * to change the 
34770 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
34780 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  age..*/.#ifndef 
34790 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74  NDEBUG.int sqlit
347a0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
347b0 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  le(DbPage *pPg){
347c0 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 66  .  return pPg->f
347d0 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
347e0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
347f0 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
34800 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
34810 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74  he pager that it
34820 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
34830 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68  y to.** write th
34840 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  e information on
34850 20 70 61 67 65 20 70 50 67 20 62 61 63 6b 20 74   page pPg back t
34860 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e  o the disk, even
34870 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20   though.** that 
34880 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61  page might be ma
34890 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20  rked as dirty.  
348a0 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f  This happens, fo
348b0 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a  r example, when.
348c0 2a 2a 20 74 68 65 20 70 61 67 65 20 68 61 73 20  ** the page has 
348d0 62 65 65 6e 20 61 64 64 65 64 20 61 73 20 61 20  been added as a 
348e0 6c 65 61 66 20 6f 66 20 74 68 65 20 66 72 65 65  leaf of the free
348f0 6c 69 73 74 20 61 6e 64 20 73 6f 20 69 74 73 0a  list and so its.
34900 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f  ** content no lo
34910 6e 67 65 72 20 6d 61 74 74 65 72 73 2e 0a 2a 2a  nger matters..**
34920 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e  .** The overlyin
34930 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72  g software layer
34940 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
34950 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20  ine when all of 
34960 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74  the data.** on t
34970 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 73  he given page is
34980 20 75 6e 75 73 65 64 2e 20 54 68 65 20 70 61 67   unused. The pag
34990 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67  er marks the pag
349a0 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a  e as clean so.**
349b0 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f   that it does no
349c0 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f  t get written to
349d0 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73   disk..**.** Tes
349e0 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69  ts show that thi
349f0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  s optimization c
34a00 61 6e 20 71 75 61 64 72 75 70 6c 65 20 74 68 65  an quadruple the
34a10 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20   speed of large 
34a20 0a 2a 2a 20 44 45 4c 45 54 45 20 6f 70 65 72 61  .** DELETE opera
34a30 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tions..*/.void s
34a40 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
34a50 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29  rite(PgHdr *pPg)
34a60 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
34a70 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
34a80 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66 6c 61  .  if( (pPg->fla
34a90 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20  gs&PGHDR_DIRTY) 
34aa0 26 26 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  && pPager->nSave
34ab0 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  point==0 ){.    
34ac0 50 41 47 45 52 54 52 41 43 45 28 28 22 44 4f 4e  PAGERTRACE(("DON
34ad0 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20  T_WRITE page %d 
34ae0 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  of %d\n", pPg->p
34af0 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
34b00 67 65 72 29 29 29 3b 0a 20 20 20 20 49 4f 54 52  ger)));.    IOTR
34b10 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25  ACE(("CLEAN %p %
34b20 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
34b30 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 70 50  g->pgno)).    pP
34b40 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
34b50 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b 0a 23 69  R_DONT_WRITE;.#i
34b60 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
34b70 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
34b80 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
34b90 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
34ba0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f  .#endif.  }.}../
34bb0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
34bc0 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69  e is called to i
34bd0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
34be0 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ue of the databa
34bf0 73 65 20 66 69 6c 65 20 0a 2a 2a 20 63 68 61 6e  se file .** chan
34c00 67 65 2d 63 6f 75 6e 74 65 72 2c 20 73 74 6f 72  ge-counter, stor
34c10 65 64 20 61 73 20 61 20 34 2d 62 79 74 65 20 62  ed as a 4-byte b
34c20 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
34c30 72 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a 2a  r starting at .*
34c40 2a 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  * byte offset 24
34c50 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69   of the pager fi
34c60 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
34c70 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c   isDirectMode fl
34c80 61 67 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  ag is zero, then
34c90 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79   this is done by
34ca0 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c   calling .** sql
34cb0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
34cc0 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 6e   on page 1, then
34cd0 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63   modifying the c
34ce0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
34cf0 2a 20 70 61 67 65 20 64 61 74 61 2e 20 49 6e 20  * page data. In 
34d00 74 68 69 73 20 63 61 73 65 20 74 68 65 20 66 69  this case the fi
34d10 6c 65 20 77 69 6c 6c 20 62 65 20 75 70 64 61 74  le will be updat
34d20 65 64 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ed when the curr
34d30 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
34d40 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
34d50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69 72  .**.** The isDir
34d60 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 6d 61 79  ectMode flag may
34d70 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72   only be non-zer
34d80 6f 20 69 66 20 74 68 65 20 6c 69 62 72 61 72 79  o if the library
34d90 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a   was compiled.**
34da0 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
34db0 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
34dc0 52 49 54 45 20 6d 61 63 72 6f 20 64 65 66 69 6e  RITE macro defin
34dd0 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
34de0 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72 65 63 74  ,.** if isDirect
34df0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
34e00 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
34e10 66 69 6c 65 20 69 73 20 75 70 64 61 74 65 64 20  file is updated 
34e20 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77  directly.** by w
34e30 72 69 74 69 6e 67 20 61 6e 20 75 70 64 61 74 65  riting an update
34e40 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67  d version of pag
34e50 65 20 31 20 75 73 69 6e 67 20 61 20 63 61 6c 6c  e 1 using a call
34e60 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69   to the .** sqli
34e70 74 65 33 4f 73 57 72 69 74 65 28 29 20 66 75 6e  te3OsWrite() fun
34e80 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
34e90 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f   int pager_incr_
34ea0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61  changecounter(Pa
34eb0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
34ec0 20 69 73 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a   isDirectMode){.
34ed0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
34ee0 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
34ef0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
34f00 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
34f10 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
34f20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
34f30 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
34f40 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  MOD.  );.  asser
34f50 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
34f60 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
34f70 0a 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65 20 61  ..  /* Declare a
34f80 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f  nd initialize co
34f90 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 27  nstant integer '
34fa0 69 73 44 69 72 65 63 74 27 2e 20 49 66 20 74 68  isDirect'. If th
34fb0 65 0a 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 77 72  e.  ** atomic-wr
34fc0 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
34fd0 20 69 73 20 65 6e 61 62 6c 65 64 20 69 6e 20 74   is enabled in t
34fe0 68 69 73 20 62 75 69 6c 64 2c 20 74 68 65 6e 20  his build, then 
34ff0 69 73 44 69 72 65 63 74 0a 20 20 2a 2a 20 69 73  isDirect.  ** is
35000 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
35010 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  the value passed
35020 20 61 73 20 74 68 65 20 69 73 44 69 72 65 63 74   as the isDirect
35030 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 0a 20  Mode parameter. 
35040 20 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63   ** to this func
35050 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c  tion. Otherwise,
35060 20 69 74 20 69 73 20 61 6c 77 61 79 73 20 73 65   it is always se
35070 74 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a  t to zero..  **.
35080 20 20 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73    ** The idea is
35090 20 74 68 61 74 20 69 66 20 74 68 65 20 61 74 6f   that if the ato
350a0 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
350b0 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20  zation is not.  
350c0 2a 2a 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  ** enabled at co
350d0 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 20  mpile time, the 
350e0 63 6f 6d 70 69 6c 65 72 20 63 61 6e 20 6f 6d 69  compiler can omi
350f0 74 20 74 68 65 20 74 65 73 74 73 20 6f 66 0a 20  t the tests of. 
35100 20 2a 2a 20 27 69 73 44 69 72 65 63 74 27 20 62   ** 'isDirect' b
35110 65 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20 61 73  elow, as well as
35120 20 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f   the block enclo
35130 73 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  sed in the.  ** 
35140 22 69 66 28 20 69 73 44 69 72 65 63 74 20 29 22  "if( isDirect )"
35150 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f   condition..  */
35160 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
35170 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
35180 49 54 45 0a 23 20 64 65 66 69 6e 65 20 44 49 52  ITE.# define DIR
35190 45 43 54 5f 4d 4f 44 45 20 30 0a 20 20 61 73 73  ECT_MODE 0.  ass
351a0 65 72 74 28 20 69 73 44 69 72 65 63 74 4d 6f 64  ert( isDirectMod
351b0 65 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44  e==0 );.  UNUSED
351c0 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44 69 72  _PARAMETER(isDir
351d0 65 63 74 4d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a  ectMode);.#else.
351e0 23 20 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f  # define DIRECT_
351f0 4d 4f 44 45 20 69 73 44 69 72 65 63 74 4d 6f 64  MODE isDirectMod
35200 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  e.#endif..  if( 
35210 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43  !pPager->changeC
35220 6f 75 6e 74 44 6f 6e 65 20 26 26 20 70 50 61 67  ountDone && pPag
35230 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a  er->dbSize>0 ){.
35240 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64      PgHdr *pPgHd
35250 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
35260 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74    /* Reference t
35270 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 20 20  o page 1 */.    
35280 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  u32 change_count
35290 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er;           /*
352a0 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f   Initial value o
352b0 66 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  f change-counter
352c0 20 66 69 65 6c 64 20 2a 2f 0a 0a 20 20 20 20 61   field */..    a
352d0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
352e0 74 65 6d 70 46 69 6c 65 20 26 26 20 69 73 4f 70  tempFile && isOp
352f0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
35300 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70  ;..    /* Open p
35310 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c  age 1 of the fil
35320 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a  e for writing. *
35330 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
35340 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
35350 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a  r, 1, &pPgHdr);.
35360 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 48      assert( pPgH
35370 64 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  dr==0 || rc==SQL
35380 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f  ITE_OK );..    /
35390 2a 20 49 66 20 70 61 67 65 20 6f 6e 65 20 77 61  * If page one wa
353a0 73 20 66 65 74 63 68 65 64 20 73 75 63 63 65 73  s fetched succes
353b0 73 66 75 6c 6c 79 2c 20 61 6e 64 20 74 68 69 73  sfully, and this
353c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74   function is not
353d0 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e  .    ** operatin
353e0 67 20 69 6e 20 64 69 72 65 63 74 2d 6d 6f 64 65  g in direct-mode
353f0 2c 20 6d 61 6b 65 20 70 61 67 65 20 31 20 77 72  , make page 1 wr
35400 69 74 61 62 6c 65 2e 20 20 57 68 65 6e 20 6e 6f  itable.  When no
35410 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 64 69 72  t in .    ** dir
35420 65 63 74 20 6d 6f 64 65 2c 20 70 61 67 65 20 31  ect mode, page 1
35430 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20   is always held 
35440 69 6e 20 63 61 63 68 65 20 61 6e 64 20 68 65 6e  in cache and hen
35450 63 65 20 74 68 65 20 50 61 67 65 72 47 65 74 28  ce the PagerGet(
35460 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 69  ).    ** above i
35470 73 20 61 6c 77 61 79 73 20 73 75 63 63 65 73 73  s always success
35480 66 75 6c 20 2d 20 68 65 6e 63 65 20 74 68 65 20  ful - hence the 
35490 41 4c 57 41 59 53 20 6f 6e 20 72 63 3d 3d 53 51  ALWAYS on rc==SQ
354a0 4c 49 54 45 5f 4f 4b 2e 0a 20 20 20 20 2a 2f 0a  LITE_OK..    */.
354b0 20 20 20 20 69 66 28 20 21 44 49 52 45 43 54 5f      if( !DIRECT_
354c0 4d 4f 44 45 20 26 26 20 41 4c 57 41 59 53 28 72  MODE && ALWAYS(r
354d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b  c==SQLITE_OK) ){
354e0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
354f0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
35500 67 48 64 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  gHdr);.    }..  
35510 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
35520 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
35530 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  Increment the va
35540 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e  lue just read an
35550 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20  d write it back 
35560 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20  to byte 24. */. 
35570 20 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e       change_coun
35580 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ter = sqlite3Get
35590 34 62 79 74 65 28 28 75 38 2a 29 70 50 61 67 65  4byte((u8*)pPage
355a0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 3b 0a  r->dbFileVers);.
355b0 20 20 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75        change_cou
355c0 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 70 75  nter++;.      pu
355d0 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
355e0 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 32  pPgHdr->pData)+2
355f0 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  4, change_counte
35600 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41 6c  r);..      /* Al
35610 73 6f 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c  so store the SQL
35620 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  ite version numb
35630 65 72 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e  er in bytes 96..
35640 39 39 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20  99 and in.      
35650 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20  ** bytes 92..95 
35660 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65  store the change
35670 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69   counter for whi
35680 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e  ch the version n
35690 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 69  umber.      ** i
356a0 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 20 20  s valid. */.    
356b0 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
356c0 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74  ar*)pPgHdr->pDat
356d0 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f  a)+92, change_co
356e0 75 6e 74 65 72 29 3b 0a 20 20 20 20 20 20 70 75  unter);.      pu
356f0 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
35700 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 39  pPgHdr->pData)+9
35710 36 2c 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f  6, SQLITE_VERSIO
35720 4e 5f 4e 55 4d 42 45 52 29 3b 0a 0a 20 20 20 20  N_NUMBER);..    
35730 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20    /* If running 
35740 69 6e 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20  in direct mode, 
35750 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  write the conten
35760 74 73 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20  ts of page 1 to 
35770 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  the file. */.   
35780 20 20 20 69 66 28 20 44 49 52 45 43 54 5f 4d 4f     if( DIRECT_MO
35790 44 45 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  DE ){.        co
357a0 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 3b 0a  nst void *zBuf;.
357b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
357c0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
357d0 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ze>0 );.        
357e0 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
357f0 50 67 48 64 72 2d 3e 70 44 61 74 61 2c 20 31 2c  PgHdr->pData, 1,
35800 20 36 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   6, rc=SQLITE_NO
35810 4d 45 4d 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20  MEM, zBuf);.    
35820 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
35830 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
35840 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
35850 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
35860 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d  d, zBuf, pPager-
35870 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20  >pageSize, 0);. 
35880 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
35890 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
358a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
358b0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
358c0 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  untDone = 1;.   
358d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
358e0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67  se{.        pPag
358f0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
35900 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  one = 1;.      }
35910 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
35920 65 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20  elease the page 
35930 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20  reference. */.  
35940 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
35950 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d  ref(pPgHdr);.  }
35960 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
35970 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
35980 70 61 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69  pager file to di
35990 73 6b 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  sk. This is a no
359a0 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72  -op for in-memor
359b0 79 20 66 69 6c 65 73 0a 2a 2a 20 6f 72 20 70 61  y files.** or pa
359c0 67 65 73 20 77 69 74 68 20 74 68 65 20 50 61 67  ges with the Pag
359d0 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 73  er.noSync flag s
359e0 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  et..**.** If suc
359f0 63 65 73 73 66 75 6c 2c 20 6f 72 20 63 61 6c 6c  cessful, or call
35a00 65 64 20 6f 6e 20 61 20 70 61 67 65 72 20 66 6f  ed on a pager fo
35a10 72 20 77 68 69 63 68 20 69 74 20 69 73 20 61 20  r which it is a 
35a20 6e 6f 2d 6f 70 2c 20 74 68 69 73 0a 2a 2a 20 66  no-op, this.** f
35a30 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
35a40 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72  SQLITE_OK. Other
35a50 77 69 73 65 2c 20 61 6e 20 49 4f 20 65 72 72 6f  wise, an IO erro
35a60 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
35a70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
35a80 65 33 50 61 67 65 72 53 79 6e 63 28 50 61 67 65  e3PagerSync(Page
35a90 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
35aa0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
35ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ac0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
35ad0 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21  e */.  assert( !
35ae0 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70  MEMDB );.  if( p
35af0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
35b00 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
35b10 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
35b20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
35b30 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
35b40 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
35b50 61 67 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ags);.  }.  retu
35b60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
35b70 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
35b80 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
35b90 20 77 68 69 6c 65 20 61 20 77 72 69 74 65 2d 74   while a write-t
35ba0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
35bb0 74 69 76 65 20 69 6e 0a 2a 2a 20 72 6f 6c 6c 62  tive in.** rollb
35bc0 61 63 6b 2e 20 49 66 20 74 68 65 20 63 6f 6e 6e  ack. If the conn
35bd0 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 57 41 4c  ection is in WAL
35be0 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6c 6c   mode, this call
35bf0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 0a 2a 2a   is a no-op. .**
35c00 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
35c10 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 6f  he connection do
35c20 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68  es not already h
35c30 61 76 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ave an EXCLUSIVE
35c40 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65   lock on .** the
35c50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
35c60 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  an attempt is ma
35c70 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 6f 6e 65  de to obtain one
35c80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  ..**.** If the E
35c90 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
35ca0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 6f 72   already held or
35cb0 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
35cc0 6f 62 74 61 69 6e 20 69 74 20 69 73 0a 2a 2a 20  obtain it is.** 
35cd0 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 74  successful, or t
35ce0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  he connection is
35cf0 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 53 51   in WAL mode, SQ
35d00 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
35d10 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ned..** Otherwis
35d20 65 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54 45  e, either SQLITE
35d30 5f 42 55 53 59 20 6f 72 20 61 6e 20 53 51 4c 49  _BUSY or an SQLI
35d40 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72  TE_IOERR_XXX err
35d50 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72  or code is .** r
35d60 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
35d70 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c  sqlite3PagerExcl
35d80 75 73 69 76 65 4c 6f 63 6b 28 50 61 67 65 72 20  usiveLock(Pager 
35d90 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
35da0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
35db0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
35dc0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
35dd0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
35de0 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
35df0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
35e00 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 0a 20  _WRITER_DBMOD . 
35e10 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
35e20 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
35e30 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 0a 20 20  RITER_LOCKED .  
35e40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
35e50 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
35e60 70 50 61 67 65 72 29 20 29 3b 0a 20 20 69 66 28  pPager) );.  if(
35e70 20 30 3d 3d 70 61 67 65 72 55 73 65 57 61 6c 28   0==pagerUseWal(
35e80 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
35e90 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
35ea0 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
35eb0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
35ec0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
35ed0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
35ee0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
35ef0 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70   for the pager p
35f00 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70  Pager. zMaster p
35f10 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d  oints to the nam
35f20 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72  e.** of a master
35f30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
35f40 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
35f50 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e  tten into the in
35f60 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72  dividual.** jour
35f70 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65  nal file. zMaste
35f80 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77  r may be NULL, w
35f90 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65  hich is interpre
35fa0 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72  ted as no master
35fb0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73  .** journal (a s
35fc0 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
35fd0 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
35fe0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
35ff0 65 6e 73 75 72 65 73 20 74 68 61 74 3a 0a 2a 2a  ensures that:.**
36000 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61  .**   * The data
36010 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65  base file change
36020 2d 63 6f 75 6e 74 65 72 20 69 73 20 75 70 64 61  -counter is upda
36030 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68 65 20  ted,.**   * the 
36040 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
36050 64 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61 74  d (unless the at
36060 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
36070 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64 29  ization is used)
36080 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64 69 72  ,.**   * all dir
36090 74 79 20 70 61 67 65 73 20 61 72 65 20 77 72 69  ty pages are wri
360a0 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
360b0 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a 20 20  base file, .**  
360c0 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20   * the database 
360d0 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65  file is truncate
360e0 64 20 28 69 66 20 72 65 71 75 69 72 65 64 29 2c  d (if required),
360f0 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20   and.**   * the 
36100 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79  database file sy
36110 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  nced. .**.** The
36120 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74   only thing that
36130 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d   remains to comm
36140 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
36150 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c 69 7a  on is to finaliz
36160 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c 20 74  e .** (delete, t
36170 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20  runcate or zero 
36180 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20 6f  the first part o
36190 66 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  f) the journal f
361a0 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65 6c 65  ile (or .** dele
361b0 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
361c0 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70  urnal file if sp
361d0 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20  ecified)..**.** 
361e0 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61  Note that if zMa
361f0 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73  ster==NULL, this
36200 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72   does not overwr
36210 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76  ite a previous v
36220 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74  alue.** passed t
36230 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65  o an sqlite3Page
36240 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
36250 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ) call..**.** If
36260 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d   the final param
36270 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20  eter - noSync - 
36280 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
36290 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
362a0 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74  itself.** is not
362b0 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61 6c   synced. The cal
362c0 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73 71  ler must call sq
362d0 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 29  lite3PagerSync()
362e0 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20   directly to.** 
362f0 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
36300 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61  e file before ca
36310 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73  lling CommitPhas
36320 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74 65  eTwo() to delete
36330 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
36340 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73  file in this cas
36350 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
36360 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
36370 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a 70  eOne(.  Pager *p
36380 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
36390 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
363a0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
363b0 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
363c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
363d0 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  If not NULL, the
363e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
363f0 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  name */.  int no
36400 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20  Sync            
36410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
36420 65 20 74 6f 20 6f 6d 69 74 20 74 68 65 20 78 53  e to omit the xS
36430 79 6e 63 20 6f 6e 20 74 68 65 20 64 62 20 66 69  ync on the db fi
36440 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  le */.){.  int r
36450 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
36460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
36470 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
36480 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
36490 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
364a0 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20  ITER_LOCKED.    
364b0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
364c0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
364d0 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
364e0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
364f0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
36500 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20  ER_DBMOD.       
36510 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
36520 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20  e==PAGER_ERROR. 
36530 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
36540 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
36550 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f  (pPager) );..  /
36560 2a 20 49 66 20 61 20 70 72 69 6f 72 20 65 72 72  * If a prior err
36570 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 72 65 70  or occurred, rep
36580 6f 72 74 20 74 68 61 74 20 65 72 72 6f 72 20 61  ort that error a
36590 67 61 69 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 70  gain. */.  if( p
365a0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
365b0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
365c0 65 72 72 43 6f 64 65 3b 0a 0a 20 20 50 41 47 45  errCode;..  PAGE
365d0 52 54 52 41 43 45 28 28 22 44 41 54 41 42 41 53  RTRACE(("DATABAS
365e0 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20  E SYNC: File=%s 
365f0 7a 4d 61 73 74 65 72 3d 25 73 20 6e 53 69 7a 65  zMaster=%s nSize
36600 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70  =%d\n", .      p
36610 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
36620 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
36630 72 2d 3e 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20  r->dbSize));..  
36640 2f 2a 20 49 66 20 6e 6f 20 64 61 74 61 62 61 73  /* If no databas
36650 65 20 63 68 61 6e 67 65 73 20 68 61 76 65 20 62  e changes have b
36660 65 65 6e 20 6d 61 64 65 2c 20 72 65 74 75 72 6e  een made, return
36670 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 69 66 28   early. */.  if(
36680 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c   pPager->eState<
36690 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
366a0 48 45 4d 4f 44 20 29 20 72 65 74 75 72 6e 20 53  HEMOD ) return S
366b0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
366c0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 2f 2a   MEMDB ){.    /*
366d0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   If this is an i
366e0 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20  n-memory db, or 
366f0 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62 65  no pages have be
36700 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f  en written to, o
36710 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 75  r this.    ** fu
36720 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  nction has alrea
36730 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20  dy been called, 
36740 69 74 20 69 73 20 6d 6f 73 74 6c 79 20 61 20 6e  it is mostly a n
36750 6f 2d 6f 70 2e 20 20 48 6f 77 65 76 65 72 2c 20  o-op.  However, 
36760 61 6e 79 0a 20 20 20 20 2a 2a 20 62 61 63 6b 75  any.    ** backu
36770 70 20 69 6e 20 70 72 6f 67 72 65 73 73 20 6e 65  p in progress ne
36780 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 61 72  eds to be restar
36790 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
367a0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73  sqlite3BackupRes
367b0 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61  tart(pPager->pBa
367c0 63 6b 75 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ckup);.  }else{.
367d0 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
367e0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
367f0 20 20 20 20 20 50 67 48 64 72 20 2a 70 4c 69 73       PgHdr *pLis
36800 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  t = sqlite3Pcach
36810 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
36820 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20  r->pPCache);.   
36830 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a     if( pList ){.
36840 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
36850 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67  erWalFrames(pPag
36860 65 72 2c 20 70 4c 69 73 74 2c 20 70 50 61 67 65  er, pList, pPage
36870 72 2d 3e 64 62 53 69 7a 65 2c 20 31 2c 20 0a 20  r->dbSize, 1, . 
36880 20 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67             (pPag
36890 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3f 20 70  er->fullSync ? p
368a0 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
368b0 73 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20 29  s : 0).        )
368c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
368d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
368e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
368f0 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
36900 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ll(pPager->pPCac
36910 68 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  he);.      }.   
36920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
36930 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
36940 6c 6f 63 6b 20 75 70 64 61 74 65 73 20 74 68 65  lock updates the
36950 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e   change-counter.
36960 20 45 78 61 63 74 6c 79 20 68 6f 77 20 69 74 0a   Exactly how it.
36970 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 74 68        ** does th
36980 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68  is depends on wh
36990 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
369a0 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f   atomic-update o
369b0 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20  ptimization.    
369c0 20 20 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65 64    ** was enabled
369d0 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
369e0 2c 20 61 6e 64 20 69 66 20 74 68 69 73 20 74 72  , and if this tr
369f0 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65 74 73 20  ansaction meets 
36a00 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 72 75  the .      ** ru
36a10 6e 74 69 6d 65 20 63 72 69 74 65 72 69 61 20 74  ntime criteria t
36a20 6f 20 75 73 65 20 74 68 65 20 6f 70 65 72 61 74  o use the operat
36a30 69 6f 6e 3a 20 0a 20 20 20 20 20 20 2a 2a 0a 20  ion: .      **. 
36a40 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 65       **    * The
36a50 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70   file-system sup
36a60 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63  ports the atomic
36a70 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74 79 20  -write property 
36a80 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  for.      **    
36a90 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65    blocks of size
36aa0 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 20   page-size, and 
36ab0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 54  .      **    * T
36ac0 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f  his commit is no
36ad0 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74  t part of a mult
36ae0 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69  i-file transacti
36af0 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  on, and.      **
36b00 20 20 20 20 2a 20 45 78 61 63 74 6c 79 20 6f 6e      * Exactly on
36b10 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
36b20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f  modified and sto
36b30 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
36b40 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  l file..      **
36b50 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
36b60 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61   optimization wa
36b70 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61 74  s not enabled at
36b80 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74   compile time, t
36b90 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hen the.      **
36ba0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
36bb0 67 65 63 6f 75 6e 74 65 72 28 29 20 66 75 6e 63  gecounter() func
36bc0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
36bd0 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
36be0 6e 67 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 75  nge.      ** cou
36bf0 6e 74 65 72 20 69 6e 20 27 69 6e 64 69 72 65 63  nter in 'indirec
36c00 74 2d 6d 6f 64 65 27 2e 20 49 66 20 74 68 65 20  t-mode'. If the 
36c10 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
36c20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 62 75 74 0a  compiled in but.
36c30 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
36c40 61 70 70 6c 69 63 61 62 6c 65 20 74 6f 20 74 68  applicable to th
36c50 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
36c60 63 61 6c 6c 20 73 71 6c 69 74 65 33 4a 6f 75 72  call sqlite3Jour
36c70 6e 61 6c 43 72 65 61 74 65 28 29 0a 20 20 20 20  nalCreate().    
36c80 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72    ** to make sur
36c90 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
36ca0 6c 65 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20  le has actually 
36cb0 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 74 68  been created, th
36cc0 65 6e 20 63 61 6c 6c 0a 20 20 20 20 20 20 2a 2a  en call.      **
36cd0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
36ce0 67 65 63 6f 75 6e 74 65 72 28 29 20 74 6f 20 75  gecounter() to u
36cf0 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
36d00 2d 63 6f 75 6e 74 65 72 20 69 6e 20 69 6e 64 69  -counter in indi
36d10 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 6d 6f  rect.      ** mo
36d20 64 65 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  de. .      **.  
36d30 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
36d40 2c 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  , if the optimiz
36d50 61 74 69 6f 6e 20 69 73 20 62 6f 74 68 20 65 6e  ation is both en
36d60 61 62 6c 65 64 20 61 6e 64 20 61 70 70 6c 69 63  abled and applic
36d70 61 62 6c 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74  able,.      ** t
36d80 68 65 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f 69  hen call pager_i
36d90 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
36da0 72 28 29 20 74 6f 20 75 70 64 61 74 65 20 74 68  r() to update th
36db0 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
36dc0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 27 64 69  .      ** in 'di
36dd0 72 65 63 74 27 20 6d 6f 64 65 2e 20 49 6e 20 74  rect' mode. In t
36de0 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75  his case the jou
36df0 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e  rnal file will n
36e00 65 76 65 72 20 62 65 0a 20 20 20 20 20 20 2a 2a  ever be.      **
36e10 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 69   created for thi
36e20 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  s transaction.. 
36e30 20 20 20 20 20 2a 2f 0a 20 20 23 69 66 64 65 66       */.  #ifdef
36e40 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
36e50 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
36e60 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
36e70 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
36e80 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
36e90 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
36ea0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
36eb0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
36ec0 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20  LMODE_OFF .     
36ed0 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
36ee0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
36ef0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
36f00 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20  WAL .      );.  
36f10 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72      if( !zMaster
36f20 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
36f30 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  r->jfd) .       
36f40 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
36f50 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65  alOff==jrnlBuffe
36f60 72 53 69 7a 65 28 70 50 61 67 65 72 29 20 0a 20  rSize(pPager) . 
36f70 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d        && pPager-
36f80 3e 64 62 53 69 7a 65 3e 3d 70 50 61 67 65 72 2d  >dbSize>=pPager-
36f90 3e 64 62 4f 72 69 67 53 69 7a 65 0a 20 20 20 20  >dbOrigSize.    
36fa0 20 20 20 26 26 20 28 30 3d 3d 28 70 50 67 20 3d     && (0==(pPg =
36fb0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69   sqlite3PcacheDi
36fc0 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
36fd0 70 50 43 61 63 68 65 29 29 20 7c 7c 20 30 3d 3d  pPCache)) || 0==
36fe0 70 50 67 2d 3e 70 44 69 72 74 79 29 0a 20 20 20  pPg->pDirty).   
36ff0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
37000 20 55 70 64 61 74 65 20 74 68 65 20 64 62 20 66   Update the db f
37010 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  ile change count
37020 65 72 20 76 69 61 20 74 68 65 20 64 69 72 65 63  er via the direc
37030 74 2d 77 72 69 74 65 20 6d 65 74 68 6f 64 2e 20  t-write method. 
37040 54 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  The .        ** 
37050 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77  following call w
37060 69 6c 6c 20 6d 6f 64 69 66 79 20 74 68 65 20 69  ill modify the i
37070 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
37080 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61 67 65 20  ntation of page 
37090 31 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  1 .        ** to
370a0 20 69 6e 63 6c 75 64 65 20 74 68 65 20 75 70 64   include the upd
370b0 61 74 65 64 20 63 68 61 6e 67 65 20 63 6f 75 6e  ated change coun
370c0 74 65 72 20 61 6e 64 20 74 68 65 6e 20 77 72 69  ter and then wri
370d0 74 65 20 70 61 67 65 20 31 20 0a 20 20 20 20 20  te page 1 .     
370e0 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74     ** directly t
370f0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
37100 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20  ile. Because of 
37110 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
37120 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f   .        ** pro
37130 70 65 72 74 79 20 6f 66 20 74 68 65 20 68 6f 73  perty of the hos
37140 74 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74  t file-system, t
37150 68 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20  his is safe..   
37160 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
37170 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f  rc = pager_incr_
37180 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50  changecounter(pP
37190 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  ager, 1);.      
371a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
371b0 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
371c0 61 6c 43 72 65 61 74 65 28 70 50 61 67 65 72 2d  alCreate(pPager-
371d0 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69  >jfd);.        i
371e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
371f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
37200 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68   = pager_incr_ch
37210 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67  angecounter(pPag
37220 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
37230 7d 0a 20 20 20 20 20 20 7d 0a 20 20 23 65 6c 73  }.      }.  #els
37240 65 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  e.      rc = pag
37250 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
37260 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30 29  unter(pPager, 0)
37270 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20 20 20 20  ;.  #endif.     
37280 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37290 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
372a0 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
372b0 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  .  .      /* If 
372c0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
372d0 20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64 61   has made the da
372e0 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20  tabase smaller, 
372f0 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20  then all pages. 
37300 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69       ** being di
37310 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74  scarded by the t
37320 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62  runcation must b
37330 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
37340 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
37350 2a 20 66 69 6c 65 2e 20 54 68 69 73 20 63 61 6e  * file. This can
37360 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 6e 20   only happen in 
37370 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
37380 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
37390 20 2a 2a 20 42 65 66 6f 72 65 20 72 65 61 64 69   ** Before readi
373a0 6e 67 20 74 68 65 20 70 61 67 65 73 20 77 69 74  ng the pages wit
373b0 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 6c  h page numbers l
373c0 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a  arger than the .
373d0 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74        ** current
373e0 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
373f0 64 62 53 69 7a 65 2c 20 73 65 74 20 64 62 53 69  dbSize, set dbSi
37400 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76  ze back to the v
37410 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  alue.      ** th
37420 61 74 20 69 74 20 74 6f 6f 6b 20 61 74 20 74 68  at it took at th
37430 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
37440 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4f 74 68 65  ransaction. Othe
37450 72 77 69 73 65 2c 20 74 68 65 0a 20 20 20 20 20  rwise, the.     
37460 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   ** calls to sql
37470 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 72  ite3PagerGet() r
37480 65 74 75 72 6e 20 7a 65 72 6f 65 64 20 70 61 67  eturn zeroed pag
37490 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 0a 20  es instead of . 
374a0 20 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20       ** reading 
374b0 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61  data from the da
374c0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
374d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57     **.      ** W
374e0 68 65 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  hen journal_mode
374f0 3d 3d 4f 46 46 20 74 68 65 20 64 62 4f 72 69 67  ==OFF the dbOrig
37500 53 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20 7a  Size is always z
37510 65 72 6f 2c 20 73 6f 20 74 68 69 73 0a 20 20 20  ero, so this.   
37520 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6e 65 76 65     ** block neve
37530 72 20 72 75 6e 73 20 69 66 20 6a 6f 75 72 6e 61  r runs if journa
37540 6c 5f 6d 6f 64 65 3d 4f 46 46 2e 0a 20 20 20 20  l_mode=OFF..    
37550 20 20 2a 2f 0a 20 20 23 69 66 6e 64 65 66 20 53    */.  #ifndef S
37560 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
37570 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
37580 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70  pPager->dbSize<p
37590 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
375a0 65 20 0a 20 20 20 20 20 20 20 26 26 20 70 50 61  e .       && pPa
375b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
375c0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
375d0 4f 44 45 5f 4f 46 46 0a 20 20 20 20 20 20 29 7b  ODE_OFF.      ){
375e0 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 3b  .        Pgno i;
375f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37610 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
37620 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  ariable */.     
37630 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20 69 53     const Pgno iS
37640 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50  kip = PAGER_MJ_P
37650 47 4e 4f 28 70 50 61 67 65 72 29 3b 20 2f 2a 20  GNO(pPager); /* 
37660 50 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 70 61 67  Pending lock pag
37670 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e  e */.        con
37680 73 74 20 50 67 6e 6f 20 64 62 53 69 7a 65 20 3d  st Pgno dbSize =
37690 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
376a0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
376b0 73 65 20 69 6d 61 67 65 20 73 69 7a 65 20 2a 2f  se image size */
376c0 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72   .        pPager
376d0 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
376e0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20  r->dbOrigSize;. 
376f0 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d 64 62         for( i=db
37700 53 69 7a 65 2b 31 3b 20 69 3c 3d 70 50 61 67 65  Size+1; i<=pPage
37710 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 20 69  r->dbOrigSize; i
37720 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ++ ){.          
37730 69 66 28 20 21 73 71 6c 69 74 65 33 42 69 74 76  if( !sqlite3Bitv
37740 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
37750 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26  InJournal, i) &&
37760 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20   i!=iSkip ){.   
37770 20 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a           PgHdr *
37780 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
37790 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 6a 6f     /* Page to jo
377a0 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 20 20 20  urnal */.       
377b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
377c0 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
377d0 2c 20 69 2c 20 26 70 50 61 67 65 29 3b 0a 20 20  , i, &pPage);.  
377e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
377f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
37800 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
37810 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  one_exit;.      
37820 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
37830 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
37840 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
37850 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
37860 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
37870 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
37880 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
37890 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
378a0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20  _exit;.         
378b0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
378c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
378d0 69 7a 65 20 3d 20 64 62 53 69 7a 65 3b 0a 20 20  ize = dbSize;.  
378e0 20 20 20 20 7d 20 0a 20 20 23 65 6e 64 69 66 0a      } .  #endif.
378f0 20 20 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74    .      /* Writ
37900 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
37910 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74  rnal name into t
37920 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
37930 20 49 66 20 61 20 6d 61 73 74 65 72 20 0a 20 20   If a master .  
37940 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
37950 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72  ile name has alr
37960 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
37970 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
37980 20 66 69 6c 65 2c 20 0a 20 20 20 20 20 20 2a 2a   file, .      **
37990 20 6f 72 20 69 66 20 7a 4d 61 73 74 65 72 20 69   or if zMaster i
379a0 73 20 4e 55 4c 4c 20 28 6e 6f 20 6d 61 73 74 65  s NULL (no maste
379b0 72 20 6a 6f 75 72 6e 61 6c 29 2c 20 74 68 65 6e  r journal), then
379c0 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
379d0 6e 6f 2d 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a  no-op..      */.
379e0 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
379f0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
37a00 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
37a10 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
37a20 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63  LITE_OK ) goto c
37a30 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
37a40 65 78 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f  exit;.  .      /
37a50 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
37a60 61 6c 20 66 69 6c 65 20 61 6e 64 20 77 72 69 74  al file and writ
37a70 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  e all dirty page
37a80 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
37a90 65 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  e..      ** If t
37aa0 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65  he atomic-update
37ab0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
37ac0 20 62 65 69 6e 67 20 75 73 65 64 2c 20 74 68 69   being used, thi
37ad0 73 20 73 79 6e 63 20 77 69 6c 6c 20 6e 6f 74 20  s sync will not 
37ae0 0a 20 20 20 20 20 20 2a 2a 20 63 72 65 61 74 65  .      ** create
37af0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
37b00 65 20 6f 72 20 70 65 72 66 6f 72 6d 20 61 6e 79  e or perform any
37b10 20 72 65 61 6c 20 49 4f 2e 0a 20 20 20 20 20 20   real IO..      
37b20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61  **.      ** Beca
37b30 75 73 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  use the change-c
37b40 6f 75 6e 74 65 72 20 70 61 67 65 20 77 61 73 20  ounter page was 
37b50 6a 75 73 74 20 6d 6f 64 69 66 69 65 64 2c 20 75  just modified, u
37b60 6e 6c 65 73 73 20 74 68 65 0a 20 20 20 20 20 20  nless the.      
37b70 2a 2a 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65  ** atomic-update
37b80 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
37b90 20 75 73 65 64 20 69 74 20 69 73 20 61 6c 6d 6f   used it is almo
37ba0 73 74 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  st certain that 
37bb0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  the.      ** jou
37bc0 72 6e 61 6c 20 72 65 71 75 69 72 65 73 20 61 20  rnal requires a 
37bd0 73 79 6e 63 20 68 65 72 65 2e 20 48 6f 77 65 76  sync here. Howev
37be0 65 72 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  er, in locking_m
37bf0 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 0a 20 20  ode=exclusive.  
37c00 20 20 20 20 2a 2a 20 6f 6e 20 61 20 73 79 73 74      ** on a syst
37c10 65 6d 20 75 6e 64 65 72 20 6d 65 6d 6f 72 79 20  em under memory 
37c20 70 72 65 73 73 75 72 65 20 69 74 20 69 73 20 6a  pressure it is j
37c30 75 73 74 20 70 6f 73 73 69 62 6c 65 20 74 68 61  ust possible tha
37c40 74 20 74 68 69 73 20 69 73 20 0a 20 20 20 20 20  t this is .     
37c50 20 2a 2a 20 6e 6f 74 20 74 68 65 20 63 61 73 65   ** not the case
37c60 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
37c70 74 20 69 73 20 6c 69 6b 65 6c 79 20 65 6e 6f 75  t is likely enou
37c80 67 68 20 74 68 61 74 20 74 68 65 20 72 65 64 75  gh that the redu
37c90 6e 64 61 6e 74 0a 20 20 20 20 20 20 2a 2a 20 78  ndant.      ** x
37ca0 53 79 6e 63 28 29 20 63 61 6c 6c 20 77 69 6c 6c  Sync() call will
37cb0 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61   be changed to a
37cc0 20 6e 6f 2d 6f 70 20 62 79 20 74 68 65 20 4f 53   no-op by the OS
37cd0 20 61 6e 79 68 6f 77 2e 20 0a 20 20 20 20 20 20   anyhow. .      
37ce0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79  */.      rc = sy
37cf0 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
37d00 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
37d10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
37d20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
37d30 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 0a 20  e_one_exit;.  . 
37d40 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
37d50 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
37d60 50 61 67 65 72 2c 73 71 6c 69 74 65 33 50 63 61  Pager,sqlite3Pca
37d70 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
37d80 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29 3b 0a  ger->pPCache));.
37d90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
37da0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
37db0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
37dc0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
37dd0 4b 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 67  KED );.        g
37de0 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65  oto commit_phase
37df0 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20  _one_exit;.     
37e00 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
37e10 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70  PcacheCleanAll(p
37e20 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
37e30 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  .  .      /* If 
37e40 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
37e50 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61 6d 65   is not the same
37e60 20 73 69 7a 65 20 61 73 20 74 68 65 20 64 61 74   size as the dat
37e70 61 62 61 73 65 20 69 6d 61 67 65 2c 0a 20 20 20  abase image,.   
37e80 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65 20 70     ** then use p
37e90 61 67 65 72 5f 74 72 75 6e 63 61 74 65 20 74 6f  ager_truncate to
37ea0 20 67 72 6f 77 20 6f 72 20 73 68 72 69 6e 6b 20   grow or shrink 
37eb0 74 68 65 20 66 69 6c 65 20 68 65 72 65 2e 0a 20  the file here.. 
37ec0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
37ed0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
37ee0 21 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  !=pPager->dbFile
37ef0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
37f00 50 67 6e 6f 20 6e 4e 65 77 20 3d 20 70 50 61 67  Pgno nNew = pPag
37f10 65 72 2d 3e 64 62 53 69 7a 65 20 2d 20 28 70 50  er->dbSize - (pP
37f20 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 41  ager->dbSize==PA
37f30 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
37f40 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73  er));.        as
37f50 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
37f60 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
37f70 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 20 20  ER_DBMOD );.    
37f80 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
37f90 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
37fa0 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69  nNew);.        i
37fb0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
37fc0 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70   ) goto commit_p
37fd0 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20  hase_one_exit;. 
37fe0 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
37ff0 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 73 79 6e 63  /* Finally, sync
38000 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
38010 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  le. */.      if(
38020 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
38030 20 26 26 20 21 6e 6f 53 79 6e 63 20 29 7b 0a 20   && !noSync ){. 
38040 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
38050 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
38060 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  ->fd, pPager->sy
38070 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 20  nc_flags);.     
38080 20 7d 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45   }.      IOTRACE
38090 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c  (("DBSYNC %p\n",
380a0 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 7d 0a   pPager)).    }.
380b0 20 20 7d 0a 0a 63 6f 6d 6d 69 74 5f 70 68 61 73    }..commit_phas
380c0 65 5f 6f 6e 65 5f 65 78 69 74 3a 0a 20 20 69 66  e_one_exit:.  if
380d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
380e0 26 26 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  && !pagerUseWal(
380f0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70  pPager) ){.    p
38100 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
38110 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
38120 49 53 48 45 44 3b 0a 20 20 7d 0a 20 20 72 65 74  ISHED;.  }.  ret
38130 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
38140 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
38150 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
38160 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
38170 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 6c  e has been compl
38180 65 74 65 6c 79 0a 2a 2a 20 75 70 64 61 74 65 64  etely.** updated
38190 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20   to reflect the 
381a0 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20  changes made by 
381b0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
381c0 73 61 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 73  saction and.** s
381d0 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 54  ynced to disk. T
381e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
381f0 73 74 69 6c 6c 20 65 78 69 73 74 73 20 69 6e 20  still exists in 
38200 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
38210 0a 2a 2a 20 74 68 6f 75 67 68 2c 20 61 6e 64 20  .** though, and 
38220 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
38230 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  urs at this poin
38240 74 20 69 74 20 77 69 6c 6c 20 65 76 65 6e 74 75  t it will eventu
38250 61 6c 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20  ally.** be used 
38260 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  as a hot-journal
38270 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
38280 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
38290 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
382a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69  This function fi
382b0 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72  nalizes the jour
382c0 6e 61 6c 20 66 69 6c 65 2c 20 65 69 74 68 65 72  nal file, either
382d0 20 62 79 20 64 65 6c 65 74 69 6e 67 2c 20 0a 2a   by deleting, .*
382e0 2a 20 74 72 75 6e 63 61 74 69 6e 67 20 6f 72 20  * truncating or 
382f0 70 61 72 74 69 61 6c 6c 79 20 7a 65 72 6f 69 6e  partially zeroin
38300 67 20 69 74 2c 20 73 6f 20 74 68 61 74 20 69 74  g it, so that it
38310 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20   cannot be used 
38320 0a 2a 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f 75 72  .** for hot-jour
38330 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 6e  nal rollback. On
38340 63 65 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20  ce this is done 
38350 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
38360 69 73 0a 2a 2a 20 69 72 72 65 76 6f 63 61 62 6c  is.** irrevocabl
38370 79 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  y committed..**.
38380 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
38390 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72  ccurs, an IO err
383a0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
383b0 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65  ned and the page
383c0 72 0a 2a 2a 20 6d 6f 76 65 73 20 69 6e 74 6f 20  r.** moves into 
383d0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
383e0 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
383f0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
38400 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
38410 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
38420 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67  eTwo(Pager *pPag
38430 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
38440 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
38450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
38460 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
38470 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
38480 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63   should not be c
38490 61 6c 6c 65 64 20 69 66 20 61 20 70 72 69 6f 72  alled if a prior
384a0 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
384b0 72 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20 69 66  red..  ** But if
384c0 20 28 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e   (due to a codin
384d0 67 20 65 72 72 6f 72 20 65 6c 73 65 77 68 65 72  g error elsewher
384e0 65 20 69 6e 20 74 68 65 20 73 79 73 74 65 6d 29  e in the system)
384f0 20 69 74 20 64 6f 65 73 20 67 65 74 0a 20 20 2a   it does get.  *
38500 2a 20 63 61 6c 6c 65 64 2c 20 6a 75 73 74 20 72  * called, just r
38510 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 65  eturn the same e
38520 72 72 6f 72 20 63 6f 64 65 20 77 69 74 68 6f 75  rror code withou
38530 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
38540 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
38550 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
38560 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  ) ) return pPage
38570 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 61  r->errCode;..  a
38580 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
38590 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
385a0 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20  TER_LOCKED.     
385b0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
385c0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
385d0 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20 20 20  R_FINISHED.     
385e0 20 20 7c 7c 20 28 70 61 67 65 72 55 73 65 57 61    || (pagerUseWa
385f0 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61  l(pPager) && pPa
38600 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
38610 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
38620 4f 44 29 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  OD).  );.  asser
38630 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
38640 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
38650 0a 0a 20 20 2f 2a 20 41 6e 20 6f 70 74 69 6d 69  ..  /* An optimi
38660 7a 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 64  zation. If the d
38670 61 74 61 62 61 73 65 20 77 61 73 20 6e 6f 74 20  atabase was not 
38680 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 69 65  actually modifie
38690 64 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 74 68  d during.  ** th
386a0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
386b0 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
386c0 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
386d0 65 2d 6d 6f 64 65 20 61 6e 64 20 69 73 0a 20 20  e-mode and is.  
386e0 2a 2a 20 75 73 69 6e 67 20 70 65 72 73 69 73 74  ** using persist
386f0 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68  ent journals, th
38700 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
38710 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
38720 2a 0a 20 20 2a 2a 20 54 68 65 20 73 74 61 72 74  *.  ** The start
38730 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20