/ Hex Artifact Content
Login

Artifact ad850e0b0547ff3781676c311c276123b5e07902:


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 2a 20 41 20 77 72 69 74 65 20  **    * A write 
2a20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
2a30: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
2a40: 6e 20 45 58 43 4c 55 53 49 56 45 20 6f 72 20 67  n EXCLUSIVE or g
2a50: 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 68  reater lock is h
2a60: 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
2a70: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  ase file..**    
2a80: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
2a90: 6c 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  le is open and t
2aa0: 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20  he first header 
2ab0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
2ac0: 20 0a 2a 2a 20 20 20 20 20 20 61 6e 64 20 73 79   .**      and sy
2ad0: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
2ae0: 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e      * The conten
2af0: 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 63  ts of the page c
2b00: 61 63 68 65 20 68 61 76 65 20 62 65 65 6e 20 6d  ache have been m
2b10: 6f 64 69 66 69 65 64 20 28 61 6e 64 20 70 6f 73  odified (and pos
2b20: 73 69 62 6c 79 0a 2a 2a 20 20 20 20 20 20 77 72  sibly.**      wr
2b30: 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 29 2e 0a  itten to disk)..
2b40: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 46 49  **.**  WRITER_FI
2b50: 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  NISHED:.**.**   
2b60: 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73   * A write trans
2b70: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
2b80: 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43  ..**    * An EXC
2b90: 4c 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65  LUSIVE or greate
2ba0: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2bb0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2bc0: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c  ile..**    * All
2bd0: 20 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e   writing and syn
2be0: 63 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  cing of journal 
2bf0: 61 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74  and database dat
2c00: 61 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a  a has finished..
2c10: 2a 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72  **      If no er
2c20: 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 61 6c 6c  ror occured, all
2c30: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
2c40: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
2c50: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
2c60: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
2c70: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
2c80: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
2c90: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
2ca0: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
2cb0: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
2cc0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
2cd0: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
2ce0: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
2cf0: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
2d00: 77 68 65 6e 20 61 6e 20 49 4f 2c 20 4f 4f 4d 20  when an IO, OOM 
2d10: 6f 72 20 64 69 73 6b 2d 66 75 6c 6c 20 65 72 72  or disk-full err
2d20: 6f 72 20 0a 2a 2a 20 20 20 20 6f 63 63 75 72 73  or .**    occurs
2d30: 20 61 74 20 61 20 70 6f 69 6e 74 20 69 6e 20 74   at a point in t
2d40: 68 65 20 63 6f 64 65 20 74 68 61 74 20 6d 61 6b  he code that mak
2d50: 65 73 20 69 74 20 64 69 66 66 69 63 75 6c 74 20  es it difficult 
2d60: 74 6f 20 62 65 20 73 75 72 65 0a 2a 2a 20 20 20  to be sure.**   
2d70: 20 74 68 61 74 20 74 68 65 20 69 6e 2d 6d 65 6d   that the in-mem
2d80: 6f 72 79 20 70 61 67 65 72 20 73 74 61 74 65 20  ory pager state 
2d90: 28 63 61 63 68 65 20 63 6f 6e 74 65 6e 74 73 2c  (cache contents,
2da0: 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20 61   db size etc.) a
2db0: 72 65 0a 2a 2a 20 20 20 20 63 6f 6e 73 69 73 74  re.**    consist
2dc0: 65 6e 74 20 77 69 74 68 20 74 68 65 20 63 6f 6e  ent with the con
2dd0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 66 69 6c  tents of the fil
2de0: 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  e-system..**.** 
2df0: 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20     For example, 
2e00: 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
2e10: 63 63 75 72 73 20 77 68 69 6c 65 20 70 65 72 66  ccurs while perf
2e20: 6f 72 6d 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  orming a rollbac
2e30: 6b 2c 20 0a 2a 2a 20 20 20 20 74 68 65 20 63 6f  k, .**    the co
2e40: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2e50: 67 65 2d 63 61 63 68 65 20 6d 61 79 20 62 65 20  ge-cache may be 
2e60: 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
2e70: 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 2a  sistent state..*
2e80: 2a 20 20 20 20 41 74 20 74 68 69 73 20 70 6f 69  *    At this poi
2e90: 6e 74 20 69 74 20 77 6f 75 6c 64 20 62 65 20 64  nt it would be d
2ea0: 61 6e 67 65 72 6f 75 73 20 74 6f 20 63 68 61 6e  angerous to chan
2eb0: 67 65 20 62 61 63 6b 20 74 6f 20 52 45 41 44 45  ge back to READE
2ec0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 28 61  R state.**    (a
2ed0: 73 20 75 73 75 61 6c 6c 79 20 68 61 70 70 65 6e  s usually happen
2ee0: 73 20 61 66 74 65 72 20 61 20 72 6f 6c 6c 62 61  s after a rollba
2ef0: 63 6b 29 2e 20 41 6e 79 20 73 75 62 73 65 71 75  ck). Any subsequ
2f00: 65 6e 74 20 72 65 61 64 65 72 73 20 6d 69 67 68  ent readers migh
2f10: 74 0a 2a 2a 20 20 20 20 72 65 70 6f 72 74 20 64  t.**    report d
2f20: 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
2f30: 6f 6e 20 28 64 75 65 20 74 6f 20 74 68 65 20 69  on (due to the i
2f40: 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68  nconsistent cach
2f50: 65 29 2c 20 61 6e 64 20 69 66 0a 2a 2a 20 20 20  e), and if.**   
2f60: 20 74 68 65 79 20 75 70 67 72 61 64 65 20 74 6f   they upgrade to
2f70: 20 77 72 69 74 65 72 73 2c 20 74 68 65 79 20 6d   writers, they m
2f80: 61 79 20 69 6e 61 64 76 65 72 74 65 6e 74 6c 79  ay inadvertently
2f90: 20 63 6f 72 72 75 70 74 20 74 68 65 20 64 61 74   corrupt the dat
2fa0: 61 62 61 73 65 0a 2a 2a 20 20 20 20 66 69 6c 65  abase.**    file
2fb0: 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 69 73 20  . To avoid this 
2fc0: 68 61 7a 61 72 64 2c 20 74 68 65 20 70 61 67 65  hazard, the page
2fd0: 72 20 73 77 69 74 63 68 65 73 20 69 6e 74 6f 20  r switches into 
2fe0: 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 0a  the ERROR state.
2ff0: 2a 2a 20 20 20 20 69 6e 73 74 65 61 64 20 6f 66  **    instead of
3000: 20 52 45 41 44 45 52 20 66 6f 6c 6c 6f 77 69 6e   READER followin
3010: 67 20 73 75 63 68 20 61 6e 20 65 72 72 6f 72 2e  g such an error.
3020: 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 6e 63 65 20 69  .**.**    Once i
3030: 74 20 68 61 73 20 65 6e 74 65 72 65 64 20 74 68  t has entered th
3040: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 61  e ERROR state, a
3050: 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
3060: 65 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20  e the pager.**  
3070: 20 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69    to read or wri
3080: 74 65 20 64 61 74 61 20 72 65 74 75 72 6e 73 20  te data returns 
3090: 61 6e 20 65 72 72 6f 72 2e 20 45 76 65 6e 74 75  an error. Eventu
30a0: 61 6c 6c 79 2c 20 6f 6e 63 65 20 61 6c 6c 20 0a  ally, once all .
30b0: 2a 2a 20 20 20 20 6f 75 74 73 74 61 6e 64 69 6e  **    outstandin
30c0: 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 68  g transactions h
30d0: 61 76 65 20 62 65 65 6e 20 61 62 61 6e 64 6f 6e  ave been abandon
30e0: 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 69 73  ed, the pager is
30f0: 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 74   able to.**    t
3100: 72 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b 20 74  ransition back t
3110: 6f 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 64 69  o OPEN state, di
3120: 73 63 61 72 64 69 6e 67 20 74 68 65 20 63 6f 6e  scarding the con
3130: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a  tents of the .**
3140: 20 20 20 20 70 61 67 65 2d 63 61 63 68 65 20 61      page-cache a
3150: 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 69 6e 2d  nd any other in-
3160: 6d 65 6d 6f 72 79 20 73 74 61 74 65 20 61 74 20  memory state at 
3170: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 45  the same time. E
3180: 76 65 72 79 74 68 69 6e 67 0a 2a 2a 20 20 20 20  verything.**    
3190: 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d  is reloaded from
31a0: 20 64 69 73 6b 20 28 61 6e 64 2c 20 69 66 20 6e   disk (and, if n
31b0: 65 63 65 73 73 61 72 79 2c 20 68 6f 74 2d 6a 6f  ecessary, hot-jo
31c0: 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 70  urnal rollback p
31d0: 65 66 6f 72 6d 65 64 29 0a 2a 2a 20 20 20 20 77  eformed).**    w
31e0: 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73  hen a read-trans
31f0: 61 63 74 69 6f 6e 20 69 73 20 6e 65 78 74 20 6f  action is next o
3200: 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 70 61 67  pened on the pag
3210: 65 72 20 28 74 72 61 6e 73 69 74 69 6f 6e 69 6e  er (transitionin
3220: 67 0a 2a 2a 20 20 20 20 74 68 65 20 70 61 67 65  g.**    the page
3230: 72 20 69 6e 74 6f 20 52 45 41 44 45 52 20 73 74  r into READER st
3240: 61 74 65 29 2e 20 41 74 20 74 68 61 74 20 70 6f  ate). At that po
3250: 69 6e 74 20 74 68 65 20 73 79 73 74 65 6d 20 68  int the system h
3260: 61 73 20 72 65 63 6f 76 65 72 65 64 20 0a 2a 2a  as recovered .**
3270: 20 20 20 20 66 72 6f 6d 20 74 68 65 20 65 72 72      from the err
3280: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 70 65  or..**.**    Spe
3290: 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65 20 70  cifically, the p
32a0: 61 67 65 72 20 6a 75 6d 70 73 20 69 6e 74 6f 20  ager jumps into 
32b0: 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20  the ERROR state 
32c0: 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 31  if:.**.**      1
32d0: 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  . An error occur
32e0: 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69  s while attempti
32f0: 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 54  ng a rollback. T
3300: 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a  his happens in.*
3310: 2a 20 20 20 20 20 20 20 20 20 66 75 6e 63 74 69  *         functi
3320: 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  on sqlite3PagerR
3330: 6f 6c 6c 62 61 63 6b 28 29 2e 0a 2a 2a 0a 2a 2a  ollback()..**.**
3340: 20 20 20 20 20 20 32 2e 20 41 6e 20 65 72 72 6f        2. An erro
3350: 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 61  r occurs while a
3360: 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 66 69 6e  ttempting to fin
3370: 61 6c 69 7a 65 20 61 20 6a 6f 75 72 6e 61 6c 20  alize a journal 
3380: 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  file.**         
3390: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 63 6f 6d 6d  following a comm
33a0: 69 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 73  it in function s
33b0: 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
33c0: 74 50 68 61 73 65 54 77 6f 28 29 2e 0a 2a 2a 0a  tPhaseTwo()..**.
33d0: 2a 2a 20 20 20 20 20 20 33 2e 20 41 6e 20 65 72  **      3. An er
33e0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
33f0: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 77   attempting to w
3400: 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
3410: 6e 61 6c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  nal or.**       
3420: 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20    database file 
3430: 69 6e 20 66 75 6e 63 74 69 6f 6e 20 70 61 67 65  in function page
3440: 72 53 74 72 65 73 73 28 29 20 69 6e 20 6f 72 64  rStress() in ord
3450: 65 72 20 74 6f 20 66 72 65 65 20 75 70 0a 2a 2a  er to free up.**
3460: 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 2e           memory.
3470: 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 6f 74 68  .**.**    In oth
3480: 65 72 20 63 61 73 65 73 2c 20 74 68 65 20 65 72  er cases, the er
3490: 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
34a0: 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61  to the b-tree la
34b0: 79 65 72 2e 20 54 68 65 20 62 2d 74 72 65 65 0a  yer. The b-tree.
34c0: 2a 2a 20 20 20 20 6c 61 79 65 72 20 74 68 65 6e  **    layer then
34d0: 20 61 74 74 65 6d 70 74 73 20 61 20 72 6f 6c 6c   attempts a roll
34e0: 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20  back operation. 
34f0: 49 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 6e  If the error con
3500: 64 69 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 70 65  dition .**    pe
3510: 72 73 69 73 74 73 2c 20 74 68 65 20 70 61 67 65  rsists, the page
3520: 72 20 65 6e 74 65 72 73 20 74 68 65 20 45 52 52  r enters the ERR
3530: 4f 52 20 73 74 61 74 65 20 76 69 61 20 63 6f 6e  OR state via con
3540: 64 69 74 69 6f 6e 20 28 31 29 20 61 62 6f 76 65  dition (1) above
3550: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 6f 6e 64 69  ..**.**    Condi
3560: 74 69 6f 6e 20 28 33 29 20 69 73 20 6e 65 63 65  tion (3) is nece
3570: 73 73 61 72 79 20 62 65 63 61 75 73 65 20 69 74  ssary because it
3580: 20 63 61 6e 20 62 65 20 74 72 69 67 67 65 72 65   can be triggere
3590: 64 20 62 79 20 61 20 72 65 61 64 2d 6f 6e 6c 79  d by a read-only
35a0: 0a 2a 2a 20 20 20 20 73 74 61 74 65 6d 65 6e 74  .**    statement
35b0: 20 65 78 65 63 75 74 65 64 20 77 69 74 68 69 6e   executed within
35c0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
35d0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69 66  In this case, if
35e0: 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 20 20   the error.**   
35f0: 20 63 6f 64 65 20 77 65 72 65 20 73 69 6d 70 6c   code were simpl
3600: 79 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  y returned to th
3610: 65 20 75 73 65 72 2c 20 74 68 65 20 62 2d 74 72  e user, the b-tr
3620: 65 65 20 6c 61 79 65 72 20 77 6f 75 6c 64 20 6e  ee layer would n
3630: 6f 74 0a 2a 2a 20 20 20 20 61 75 74 6f 6d 61 74  ot.**    automat
3640: 69 63 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 61  ically attempt a
3650: 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 69 74   rollback, as it
3660: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 61 6e   assumes that an
3670: 20 65 72 72 6f 72 20 69 6e 20 61 0a 2a 2a 20 20   error in a.**  
3680: 20 20 72 65 61 64 2d 6f 6e 6c 79 20 73 74 61 74    read-only stat
3690: 65 6d 65 6e 74 20 63 61 6e 6e 6f 74 20 6c 65 61  ement cannot lea
36a0: 76 65 20 74 68 65 20 70 61 67 65 72 20 69 6e 20  ve the pager in 
36b0: 61 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e  an internally in
36c0: 63 6f 6e 73 69 73 74 65 6e 74 20 0a 2a 2a 20 20  consistent .**  
36d0: 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20    state..**.**  
36e0: 20 20 2a 20 54 68 65 20 50 61 67 65 72 2e 65 72    * The Pager.er
36f0: 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69  rCode variable i
3700: 73 20 73 65 74 20 74 6f 20 73 6f 6d 65 74 68 69  s set to somethi
3710: 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  ng other than SQ
3720: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 20 20 20 2a  LITE_OK..**    *
3730: 20 54 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f   There are one o
3740: 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69  r more outstandi
3750: 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
3760: 20 70 61 67 65 73 20 28 61 66 74 65 72 20 74 68   pages (after th
3770: 65 0a 2a 2a 20 20 20 20 20 20 6c 61 73 74 20 72  e.**      last r
3780: 65 66 65 72 65 6e 63 65 20 69 73 20 64 72 6f 70  eference is drop
3790: 70 65 64 20 74 68 65 20 70 61 67 65 72 20 73 68  ped the pager sh
37a0: 6f 75 6c 64 20 6d 6f 76 65 20 62 61 63 6b 20 74  ould move back t
37b0: 6f 20 4f 50 45 4e 20 73 74 61 74 65 29 2e 0a 2a  o OPEN state)..*
37c0: 2a 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  *    .**.** Note
37d0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 20 70  s:.**.**   * A p
37e0: 61 67 65 72 20 69 73 20 6e 65 76 65 72 20 69 6e  ager is never in
37f0: 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 6f 72   WRITER_DBMOD or
3800: 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
3810: 20 73 74 61 74 65 20 69 66 20 74 68 65 0a 2a 2a   state if the.**
3820: 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20       connection 
3830: 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d  is open in WAL m
3840: 6f 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e 6e 65  ode. A WAL conne
3850: 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20  ction is always 
3860: 69 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 6f 66  in one.**     of
3870: 20 74 68 65 20 66 69 72 73 74 20 66 6f 75 72 20   the first four 
3880: 73 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  states..**.**   
3890: 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 63 6f  * Normally, a co
38a0: 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 69 6e  nnection open in
38b0: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20   exclusive mode 
38c0: 69 73 20 6e 65 76 65 72 20 69 6e 20 50 41 47 45  is never in PAGE
38d0: 52 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20 73 74  R_OPEN.**     st
38e0: 61 74 65 2e 20 54 68 65 72 65 20 61 72 65 20 74  ate. There are t
38f0: 77 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a 20 69  wo exceptions: i
3900: 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
3910: 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20   exclusive-mode 
3920: 68 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20  has.**     been 
3930: 74 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64 20 62  turned on (and b
3940: 65 66 6f 72 65 20 61 6e 79 20 72 65 61 64 20 6f  efore any read o
3950: 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
3960: 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20 20 20  ions are .**    
3970: 20 65 78 65 63 75 74 65 64 29 2c 20 61 6e 64 20   executed), and 
3980: 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69  when the pager i
3990: 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 22 65  s leaving the "e
39a0: 72 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a 2a 0a  rror state"..**.
39b0: 2a 2a 20 20 20 2a 20 53 65 65 20 61 6c 73 6f 3a  **   * See also:
39c0: 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
39d0: 61 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ate()..*/.#defin
39e0: 65 20 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20  e PAGER_OPEN    
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
3a00: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45  #define PAGER_RE
3a10: 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20  ADER            
3a20: 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41      1.#define PA
3a30: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
3a40: 44 20 20 20 20 20 20 20 20 20 32 0a 23 64 65 66  D         2.#def
3a50: 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52  ine PAGER_WRITER
3a60: 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20 20 20  _CACHEMOD       
3a70: 33 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  3.#define PAGER_
3a80: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
3a90: 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20        4.#define 
3aa0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
3ab0: 49 53 48 45 44 20 20 20 20 20 20 20 35 0a 23 64  ISHED       5.#d
3ac0: 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 4f  efine PAGER_ERRO
3ad0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
3ae0: 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 50    6../*.** The P
3af0: 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61  ager.eLock varia
3b00: 62 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c  ble is almost al
3b10: 77 61 79 73 20 73 65 74 20 74 6f 20 6f 6e 65 20  ways set to one 
3b20: 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f  of the .** follo
3b30: 77 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73 74 61  wing locking-sta
3b40: 74 65 73 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  tes, according t
3b50: 6f 20 74 68 65 20 6c 6f 63 6b 20 63 75 72 72 65  o the lock curre
3b60: 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a 2a 20  ntly held on.** 
3b70: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
3b80: 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52  e: NO_LOCK, SHAR
3b90: 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45  ED_LOCK, RESERVE
3ba0: 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53  D_LOCK or EXCLUS
3bb0: 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54 68 69  IVE_LOCK..** Thi
3bc0: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 6b 65  s variable is ke
3bd0: 70 74 20 75 70 20 74 6f 20 64 61 74 65 20 61 73  pt up to date as
3be0: 20 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b 65 6e   locks are taken
3bf0: 20 61 6e 64 20 72 65 6c 65 61 73 65 64 20 62 79   and released by
3c00: 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 4c 6f 63  .** the pagerLoc
3c10: 6b 44 62 28 29 20 61 6e 64 20 70 61 67 65 72 55  kDb() and pagerU
3c20: 6e 6c 6f 63 6b 44 62 28 29 20 77 72 61 70 70 65  nlockDb() wrappe
3c30: 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  rs..**.** If the
3c40: 20 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f 72 20   VFS xLock() or 
3c50: 78 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e  xUnlock() return
3c60: 73 20 61 6e 20 65 72 72 6f 72 20 6f 74 68 65 72  s an error other
3c70: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55 53   than SQLITE_BUS
3c80: 59 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65 20 6f  Y.** (i.e. one o
3c90: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45  f the SQLITE_IOE
3ca0: 52 52 20 73 75 62 74 79 70 65 73 29 2c 20 69 74  RR subtypes), it
3cb0: 20 69 73 20 6e 6f 74 20 63 6c 65 61 72 20 77 68   is not clear wh
3cc0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20  ether or not.** 
3cd0: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 61  the operation wa
3ce0: 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 49 6e  s successful. In
3cf0: 20 74 68 65 73 65 20 63 69 72 63 75 6d 73 74 61   these circumsta
3d00: 6e 63 65 73 20 70 61 67 65 72 4c 6f 63 6b 44 62  nces pagerLockDb
3d10: 28 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65 72 55  () and.** pagerU
3d20: 6e 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65 20 61  nlockDb() take a
3d30: 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 61 70   conservative ap
3d40: 70 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b 20 69  proach - eLock i
3d50: 73 20 61 6c 77 61 79 73 20 75 70 64 61 74 65 64  s always updated
3d60: 0a 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63 6b 69  .** when unlocki
3d70: 6e 67 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64  ng the file, and
3d80: 20 6f 6e 6c 79 20 75 70 64 61 74 65 64 20 77 68   only updated wh
3d90: 65 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66  en locking the f
3da0: 69 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20 56 46  ile if the.** VF
3db0: 53 20 63 61 6c 6c 20 69 73 20 73 75 63 63 65 73  S call is succes
3dc0: 73 66 75 6c 2e 20 54 68 69 73 20 77 61 79 2c 20  sful. This way, 
3dd0: 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  the Pager.eLock 
3de0: 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62 65 20  variable may be 
3df0: 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65 73 73  set.** to a less
3e00: 20 65 78 63 6c 75 73 69 76 65 20 28 6c 6f 77 65   exclusive (lowe
3e10: 72 29 20 76 61 6c 75 65 20 74 68 61 6e 20 74 68  r) value than th
3e20: 65 20 6c 6f 63 6b 20 74 68 61 74 20 69 73 20 61  e lock that is a
3e30: 63 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a 2a 20  ctually held.** 
3e40: 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65  at the system le
3e50: 76 65 6c 2c 20 62 75 74 20 69 74 20 69 73 20 6e  vel, but it is n
3e60: 65 76 65 72 20 73 65 74 20 74 6f 20 61 20 6d 6f  ever set to a mo
3e70: 72 65 20 65 78 63 6c 75 73 69 76 65 20 76 61 6c  re exclusive val
3e80: 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ue..**.** This i
3e90: 73 20 75 73 75 61 6c 6c 79 20 73 61 66 65 2e 20  s usually safe. 
3ea0: 49 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20 66 61  If an xUnlock fa
3eb0: 69 6c 73 20 6f 72 20 61 70 70 65 61 72 73 20 74  ils or appears t
3ec0: 6f 20 66 61 69 6c 2c 20 74 68 65 72 65 20 6d 61  o fail, there ma
3ed0: 79 20 0a 2a 2a 20 62 65 20 61 20 66 65 77 20 72  y .** be a few r
3ee0: 65 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b 28 29  edundant xLock()
3ef0: 20 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f 63 6b   calls or a lock
3f00: 20 6d 61 79 20 62 65 20 68 65 6c 64 20 66 6f 72   may be held for
3f10: 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a 20   longer than.** 
3f20: 72 65 71 75 69 72 65 64 2c 20 62 75 74 20 6e 6f  required, but no
3f30: 74 68 69 6e 67 20 72 65 61 6c 6c 79 20 67 6f 65  thing really goe
3f40: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  s wrong..**.** T
3f50: 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20  he exception is 
3f60: 77 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  when the databas
3f70: 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
3f80: 65 64 20 61 73 20 74 68 65 20 70 61 67 65 72 20  ed as the pager 
3f90: 6d 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20 45 52  moves.** from ER
3fa0: 52 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ROR to OPEN stat
3fb0: 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  e. At this point
3fc0: 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20   there may be a 
3fd0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
3fe0: 20 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69 6c 65   .** in the file
3ff0: 2d 73 79 73 74 65 6d 20 74 68 61 74 20 6e 65 65  -system that nee
4000: 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ds to be rolled 
4010: 62 61 63 6b 20 28 61 73 20 70 61 72 74 20 6f 66  back (as part of
4020: 20 61 20 4f 50 45 4e 2d 3e 53 48 41 52 45 44 0a   a OPEN->SHARED.
4030: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c 20 62  ** transition, b
4040: 79 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  y the same pager
4050: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29 2e 20   or any other). 
4060: 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78  If the call to x
4070: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61 69 6c  Unlock().** fail
4080: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
4090: 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
40a0: 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61 6e   left holding an
40b0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
40c0: 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63 6f 6e   this.** can con
40d0: 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  fuse the call to
40e0: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
40f0: 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64 65 20  ock() call made 
4100: 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a 2a 2a  later as part.**
4110: 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   of hot-journal 
4120: 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  detection..**.**
4130: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4140: 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e 65 64  ock() is defined
4150: 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20 74 72   as returning tr
4160: 75 65 20 22 69 66 20 74 68 65 72 65 20 69 73 20  ue "if there is 
4170: 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a 20 6c  a RESERVED .** l
4180: 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68 69 73  ock held by this
4190: 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e 79 20   process or any 
41a0: 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43 68 65  others". So xChe
41b0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
41c0: 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 72  ay .** return tr
41d0: 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63  ue because the c
41e0: 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69 73 20  aller itself is 
41f0: 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
4200: 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74 0a 2a  SIVE lock (but.*
4210: 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77 20 69  * doesn't know i
4220: 74 20 62 65 63 61 75 73 65 20 6f 66 20 61 20 70  t because of a p
4230: 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20 69 6e  revious error in
4240: 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20 74 68   xUnlock). If th
4250: 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 61 20  is happens.** a 
4260: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot-journal may 
4270: 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f 72 20  be mistaken for 
4280: 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e 67 20  a journal being 
4290: 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 61 63  created by an ac
42a0: 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
42b0: 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 70  ion in another p
42c0: 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e 67 20  rocess, causing 
42d0: 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64 20 66  SQLite to read f
42e0: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
42f0: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f 6c 6c  .** without roll
4300: 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  ing it back..**.
4310: 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
4320: 64 20 74 68 69 73 2c 20 69 66 20 61 20 63 61 6c  d this, if a cal
4330: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 20 66  l to xUnlock() f
4340: 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f 63 6b  ails when unlock
4350: 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ing the.** datab
4360: 61 73 65 20 69 6e 20 74 68 65 20 45 52 52 4f 52  ase in the ERROR
4370: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 4c   state, Pager.eL
4380: 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e  ock is set to UN
4390: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74 0a 2a  KNOWN_LOCK. It.*
43a0: 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65  * is only change
43b0: 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65 61 6c  d back to a real
43c0: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 61   locking state a
43d0: 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66 75  fter a successfu
43e0: 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78 4c 6f  l call.** to xLo
43f0: 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e 20 41  ck(EXCLUSIVE). A
4400: 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20 74 6f  lso, the code to
4410: 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e 53 48   do the OPEN->SH
4420: 41 52 45 44 20 73 74 61 74 65 20 74 72 61 6e 73  ARED state trans
4430: 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73 20 74  ition.** omits t
4440: 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  he check for a h
4450: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 50 61  ot-journal if Pa
4460: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4470: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
4480: 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73 74 65   .** lock. Inste
4490: 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73 20 61  ad, it assumes a
44a0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65 78 69   hot-journal exi
44b0: 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e 73 20  sts and obtains 
44c0: 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  an EXCLUSIVE.** 
44d0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
44e0: 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
44f0: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
4500: 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53 65 65  oll it back. See
4510: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50 61 67   function.** Pag
4520: 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 66  erSharedLock() f
4530: 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 2e 0a  or more detail..
4540: 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63  **.** Pager.eLoc
4550: 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 73 65  k may only be se
4560: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
4570: 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  K when the pager
4580: 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47 45 52   is in .** PAGER
4590: 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a 2f 0a  _OPEN state..*/.
45a0: 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57 4e 5f  #define UNKNOWN_
45b0: 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20 20 20  LOCK            
45c0: 20 20 20 20 28 45 58 43 4c 55 53 49 56 45 5f 4c      (EXCLUSIVE_L
45d0: 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 41 20  OCK+1)../*.** A 
45e0: 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69  macro used for i
45f0: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65  nvoking the code
4600: 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  c if there is on
4610: 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e.*/.#ifdef SQLI
4620: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64  TE_HAS_CODEC.# d
4630: 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44  efine CODEC1(P,D
4640: 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69 66  ,N,X,E) \.    if
4650: 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20 50  ( P->xCodec && P
4660: 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64  ->xCodec(P->pCod
4670: 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b 20  ec,D,N,X)==0 ){ 
4680: 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  E; }.# define CO
4690: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f  DEC2(P,D,N,X,E,O
46a0: 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e 78  ) \.    if( P->x
46b0: 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28 63  Codec==0 ){ O=(c
46c0: 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c 0a  har*)D; }else \.
46d0: 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61 72      if( (O=(char
46e0: 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  *)(P->xCodec(P->
46f0: 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29 3d  pCodec,D,N,X)))=
4700: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73 65  =0 ){ E; }.#else
4710: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
4720: 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f 2a  (P,D,N,X,E)   /*
4730: 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69   NO-OP */.# defi
4740: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4750: 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a 29  X,E,O) O=(char*)
4760: 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  D.#endif../*.** 
4770: 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  The maximum allo
4780: 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  wed sector size.
4790: 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20 78   64KiB. If the x
47a0: 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74  Sectorsize() met
47b0: 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20  hod .** returns 
47c0: 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74  a value larger t
47d0: 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d  han this, then M
47e0: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69  AX_SECTOR_SIZE i
47f0: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
4800: 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f  ** This could co
4810: 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65 20  nceivably cause 
4820: 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f  corruption follo
4830: 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69  wing a power fai
4840: 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20  lure on.** such 
4850: 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69  a system. This i
4860: 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75  s currently an u
4870: 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69  ndocumented limi
4880: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41  t..*/.#define MA
4890: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78  X_SECTOR_SIZE 0x
48a0: 31 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  10000../*.** An 
48b0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
48c0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
48d0: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
48e0: 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76 65   for each active
48f0: 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61 6e  .** savepoint an
4900: 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  d statement tran
4910: 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  saction in the s
4920: 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68 20  ystem. All such 
4930: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61 72  structures.** ar
4940: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
4950: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
4960: 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  [] array, which 
4970: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
4980: 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69 6e  .** resized usin
4990: 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  g sqlite3Realloc
49a0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ()..**.** When a
49b0: 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63 72   savepoint is cr
49c0: 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65 72  eated, the Pager
49d0: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
49e0: 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a 2a  fset field is.**
49f0: 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61 20   set to 0. If a 
4a00: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
4a10: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
4a20: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
4a30: 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61 76  while.** the sav
4a40: 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
4a50: 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73 65  , then iHdrOffse
4a60: 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
4a70: 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a 20  byte offset .** 
4a80: 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
4a90: 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 6a  owing the last j
4aa0: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 72  ournal record wr
4ab0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d  itten into the m
4ac0: 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 62  ain.** journal b
4ad0: 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e 61  efore the journa
4ae0: 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20 69  l-header. This i
4af0: 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69 6e  s required durin
4b00: 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 72  g savepoint.** r
4b10: 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61 67  ollback (see pag
4b20: 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
4b30: 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65 64  int())..*/.typed
4b40: 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72 53  ef struct PagerS
4b50: 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53 61  avepoint PagerSa
4b60: 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74 20  vepoint;.struct 
4b70: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 7b  PagerSavepoint {
4b80: 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b 20  .  i64 iOffset; 
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ba0: 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66 73  /* Starting offs
4bb0: 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e  et in main journ
4bc0: 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
4bd0: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
4be0: 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f 76       /* See abov
4bf0: 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
4c00: 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20  InSavepoint;    
4c10: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70 61      /* Set of pa
4c20: 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76 65  ges in this save
4c30: 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  point */.  Pgno 
4c40: 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20  nOrig;          
4c50: 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
4c60: 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  nal number of pa
4c70: 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a 20  ges in file */. 
4c80: 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20 20   Pgno iSubRec;  
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4ca0: 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
4cb0: 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a 6f  record in sub-jo
4cc0: 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66  urnal */.#ifndef
4cd0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
4ce0: 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61 5b  .  u32 aWalData[
4cf0: 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e 44  WAL_SAVEPOINT_ND
4d00: 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  ATA];        /* 
4d10: 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63 6f  WAL savepoint co
4d20: 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66 0a  ntext */.#endif.
4d30: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e  };../*.** A open
4d40: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61   page cache is a
4d50: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74  n instance of st
4d60: 72 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65  ruct Pager. A de
4d70: 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20  scription of.** 
4d80: 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65  some of the more
4d90: 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65   important membe
4da0: 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c  r variables foll
4db0: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74  ows:.**.** eStat
4dc0: 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75  e.**.**   The cu
4dd0: 72 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66  rrent 'state' of
4de0: 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
4df0: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
4e00: 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20  nt and state.** 
4e10: 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20    diagram above 
4e20: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
4e30: 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73  n of the pager s
4e40: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63  tate..**.** eLoc
4e50: 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20  k.**.**   For a 
4e60: 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74  real on-disk dat
4e70: 61 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65  abase, the curre
4e80: 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  nt lock held on 
4e90: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
4ea0: 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  e -.**   NO_LOCK
4eb0: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52  , SHARED_LOCK, R
4ec0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20  ESERVED_LOCK or 
4ed0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a  EXCLUSIVE_LOCK..
4ee0: 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65  **.**   For a te
4ef0: 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
4f00: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e  mory database (n
4f10: 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20  either of which 
4f20: 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20  require any.**  
4f30: 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61   locks), this va
4f40: 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73  riable is always
4f50: 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56   set to EXCLUSIV
4f60: 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75  E_LOCK. Since su
4f70: 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65  ch.**   database
4f80: 73 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61  s always have Pa
4f90: 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64  ger.exclusiveMod
4fa0: 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b  e==1, this trick
4fb0: 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20  s the pager.**  
4fc0: 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e   logic into thin
4fd0: 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72  king that it alr
4fe0: 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65  eady has all the
4ff0: 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65   locks it will e
5000: 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61  ver.**   need (a
5010: 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20  nd no reason to 
5020: 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a  release them)..*
5030: 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28  *.**   In some (
5040: 6f 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73  obscure) circums
5050: 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72  tances, this var
5060: 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62  iable may also b
5070: 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e  e set to.**   UN
5080: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20  KNOWN_LOCK. See 
5090: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
50a0: 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66  e the #define of
50b0: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
50c0: 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a  r.**   details..
50d0: 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e  **.** changeCoun
50e0: 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tDone.**.**   Th
50f0: 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  is boolean varia
5100: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ble is used to m
5110: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
5120: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5130: 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79   .**   (the 4-by
5140: 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  te header field 
5150: 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32  at byte offset 2
5160: 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  4 of the databas
5170: 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20  e file) is .**  
5180: 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72   not updated mor
5190: 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63  e often than nec
51a0: 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20  essary. .**.**  
51b0: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72   It is set to tr
51c0: 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e  ue when the chan
51d0: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
51e0: 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69   is updated, whi
51f0: 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c  ch .**   can onl
5200: 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65  y happen if an e
5210: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5220: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
5230: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
5240: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28   It is cleared (
5250: 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68  set to false) wh
5260: 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73  enever an exclus
5270: 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  ive lock is .** 
5280: 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f    relinquished o
5290: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
52a0: 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61  ile. Each time a
52b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
52c0: 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20  committed,.**   
52d0: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
52e0: 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70  one flag is insp
52f0: 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20  ected. If it is 
5300: 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f  true, the work o
5310: 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20  f.**   updating 
5320: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5330: 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  er is omitted fo
5340: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  r the current tr
5350: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
5360: 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73     This mechanis
5370: 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65  m means that whe
5380: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  n running in exc
5390: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63  lusive mode, a c
53a0: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  onnection .**   
53b0: 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65  need only update
53c0: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
53d0: 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68  ter once, for th
53e0: 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74  e first transact
53f0: 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74  ion.**   committ
5400: 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73  ed..**.** setMas
5410: 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e  ter.**.**   When
5420: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
5430: 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64  eOne() is called
5440: 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61   to commit a tra
5450: 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79  nsaction, it may
5460: 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f  .**   (or may no
5470: 74 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73  t) specify a mas
5480: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
5490: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
54a0: 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f  nto the .**   jo
54b0: 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
54c0: 65 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74  e it is synced t
54d0: 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  o disk..**.**   
54e0: 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
54f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
5500: 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d  ntains a master-
5510: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
5520: 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68  affects .**   th
5530: 65 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74  e way in which t
5540: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5550: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74  is finalized aft
5560: 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  er the transacti
5570: 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d  on is .**   comm
5580: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
5590: 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e  back when runnin
55a0: 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  g in "journal_mo
55b0: 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65  de=PERSIST" mode
55c0: 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72  ..**   If a jour
55d0: 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
55e0: 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74  t contain a mast
55f0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er-journal point
5600: 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66  er, it is.**   f
5610: 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72  inalized by over
5620: 77 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73  writing the firs
5630: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
5640: 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66   with zeroes. If
5650: 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f  .**   it does co
5660: 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a  ntain a master-j
5670: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74  ournal pointer t
5680: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5690: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a  is finalized .**
56a0: 20 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67     by truncating
56b0: 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65   it to zero byte
56c0: 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68  s, just as if th
56d0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72  e connection wer
56e0: 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20  e .**   running 
56f0: 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  in "journal_mode
5700: 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e  =truncate" mode.
5710: 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c  .**.**   Journal
5720: 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74   files that cont
5730: 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ain master journ
5740: 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e  al pointers cann
5750: 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a  ot be finalized.
5760: 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f  **   simply by o
5770: 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66  verwriting the f
5780: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
5790: 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c  der with zeroes,
57a0: 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73   as the.**   mas
57b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
57c0: 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66  ter could interf
57d0: 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75  ere with hot-jou
57e0: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  rnal rollback of
57f0: 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71   any.**   subseq
5800: 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74  uently interrupt
5810: 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ed transaction t
5820: 68 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a  hat reuses the j
5830: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
5840: 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73  **   The flag is
5850: 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e   cleared as soon
5860: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
5870: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5880: 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62  d (either.**   b
5890: 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  y PagerCommitPha
58a0: 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f  seTwo or PagerRo
58b0: 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49  llback). If an I
58c0: 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73  O error prevents
58d0: 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61   the.**   journa
58e0: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e  l file from bein
58f0: 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66  g successfully f
5900: 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65  inalized, the se
5910: 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20  tMaster flag.** 
5920: 20 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79    is cleared any
5930: 77 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67  way (and the pag
5940: 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20  er will move to 
5950: 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a  ERROR state)..**
5960: 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 2c 20  .** doNotSpill, 
5970: 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 0a 2a  doNotSyncSpill.*
5980: 2a 0a 2a 2a 20 20 20 54 68 65 73 65 20 74 77 6f  *.**   These two
5990: 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c   boolean variabl
59a0: 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20 62  es control the b
59b0: 65 68 61 76 69 6f 75 72 20 6f 66 20 63 61 63 68  ehaviour of cach
59c0: 65 2d 73 70 69 6c 6c 73 0a 2a 2a 20 20 20 28 63  e-spills.**   (c
59d0: 61 6c 6c 73 20 6d 61 64 65 20 62 79 20 74 68 65  alls made by the
59e0: 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 74   pcache module t
59f0: 6f 20 74 68 65 20 70 61 67 65 72 53 74 72 65 73  o the pagerStres
5a00: 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 0a 2a  s() routine to.*
5a10: 2a 20 20 20 77 72 69 74 65 20 63 61 63 68 65 64  *   write cached
5a20: 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c   data to the fil
5a30: 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72 64 65  e-system in orde
5a40: 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65 6d  r to free up mem
5a50: 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 57 68  ory)..**.**   Wh
5a60: 65 6e 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 69 73  en doNotSpill is
5a70: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74 69   non-zero, writi
5a80: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
5a90: 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72  se from pagerStr
5aa0: 65 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 64 69  ess().**   is di
5ab0: 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68 65  sabled altogethe
5ac0: 72 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  r. This is done 
5ad0: 69 6e 20 61 20 76 65 72 79 20 6f 62 73 63 75 72  in a very obscur
5ae0: 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20 20  e case that.**  
5af0: 20 63 6f 6d 65 73 20 75 70 20 64 75 72 69 6e 67   comes up during
5b00: 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
5b10: 61 63 6b 20 74 68 61 74 20 72 65 71 75 69 72 65  ack that require
5b20: 73 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  s the pcache mod
5b30: 75 6c 65 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c 6f  ule.**   to allo
5b40: 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
5b50: 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20 6a  to prevent the j
5b60: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5b70: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 0a 2a   being written.*
5b80: 2a 20 20 20 77 68 69 6c 65 20 69 74 20 69 73 20  *   while it is 
5b90: 62 65 69 6e 67 20 74 72 61 76 65 72 73 65 64 20  being traversed 
5ba0: 62 79 20 63 6f 64 65 20 69 6e 20 70 61 67 65 72  by code in pager
5bb0: 5f 70 6c 61 79 62 61 63 6b 28 29 2e 0a 2a 2a 20  _playback()..** 
5bc0: 0a 2a 2a 20 20 20 49 66 20 64 6f 4e 6f 74 53 79  .**   If doNotSy
5bd0: 6e 63 53 70 69 6c 6c 20 69 73 20 6e 6f 6e 2d 7a  ncSpill is non-z
5be0: 65 72 6f 2c 20 77 72 69 74 69 6e 67 20 74 6f 20  ero, writing to 
5bf0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 72 6f  the database fro
5c00: 6d 20 70 61 67 65 72 53 74 72 65 73 73 28 29 0a  m pagerStress().
5c10: 2a 2a 20 20 20 69 73 20 70 65 72 6d 69 74 74 65  **   is permitte
5c20: 64 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74  d, but syncing t
5c30: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5c40: 69 73 20 6e 6f 74 2e 20 54 68 69 73 20 66 6c 61  is not. This fla
5c50: 67 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 62 79  g is set.**   by
5c60: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
5c70: 74 65 28 29 20 77 68 65 6e 20 74 68 65 20 66 69  te() when the fi
5c80: 6c 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72  le-system sector
5c90: 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20  -size is larger 
5ca0: 74 68 61 6e 0a 2a 2a 20 20 20 74 68 65 20 64 61  than.**   the da
5cb0: 74 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65  tabase page-size
5cc0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65   in order to pre
5cd0: 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73  vent a journal s
5ce0: 79 6e 63 20 66 72 6f 6d 20 68 61 70 70 65 6e 69  ync from happeni
5cf0: 6e 67 20 0a 2a 2a 20 20 20 69 6e 20 62 65 74 77  ng .**   in betw
5d00: 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c  een the journall
5d10: 69 6e 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73  ing of two pages
5d20: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63   on the same sec
5d30: 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a  tor. .**.** subj
5d40: 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20  InMemory.**.**  
5d50: 20 54 68 69 73 20 69 73 20 61 20 62 6f 6f 6c 65   This is a boole
5d60: 61 6e 20 76 61 72 69 61 62 6c 65 2e 20 49 66 20  an variable. If 
5d70: 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 72  true, then any r
5d80: 65 71 75 69 72 65 64 20 73 75 62 2d 6a 6f 75 72  equired sub-jour
5d90: 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e  nal.**   is open
5da0: 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ed as an in-memo
5db0: 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ry journal file.
5dc0: 20 49 66 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   If false, then 
5dd0: 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73  in-memory.**   s
5de0: 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20  ub-journals are 
5df0: 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 69 6e  only used for in
5e00: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 66 69  -memory pager fi
5e10: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  les..**.**   Thi
5e20: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 70  s variable is up
5e30: 64 61 74 65 64 20 62 79 20 74 68 65 20 75 70 70  dated by the upp
5e40: 65 72 20 6c 61 79 65 72 20 65 61 63 68 20 74 69  er layer each ti
5e50: 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77  me a new .**   w
5e60: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
5e70: 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a   is opened..**.*
5e80: 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67  * dbSize, dbOrig
5e90: 53 69 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65  Size, dbFileSize
5ea0: 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c  .**.**   Variabl
5eb0: 65 20 64 62 53 69 7a 65 20 69 73 20 73 65 74 20  e dbSize is set 
5ec0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
5ed0: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
5ee0: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
5ef0: 20 20 49 74 20 69 73 20 76 61 6c 69 64 20 69 6e    It is valid in
5f00: 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 61 6e   PAGER_READER an
5f10: 64 20 68 69 67 68 65 72 20 73 74 61 74 65 73 20  d higher states 
5f20: 28 61 6c 6c 20 73 74 61 74 65 73 20 65 78 63 65  (all states exce
5f30: 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e  pt for.**   OPEN
5f40: 20 61 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a   and ERROR). .**
5f50: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
5f60: 73 65 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65  set based on the
5f70: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
5f80: 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63  abase file, whic
5f90: 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c  h may be .**   l
5fa0: 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 73  arger than the s
5fb0: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
5fc0: 61 73 65 20 28 74 68 65 20 76 61 6c 75 65 20 73  ase (the value s
5fd0: 74 6f 72 65 64 20 61 74 20 6f 66 66 73 65 74 0a  tored at offset.
5fe0: 2a 2a 20 20 20 32 38 20 6f 66 20 74 68 65 20 64  **   28 of the d
5ff0: 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20 62  atabase header b
6000: 79 20 74 68 65 20 62 74 72 65 65 29 2e 20 49 66  y the btree). If
6010: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
6020: 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f   file.**   is no
6030: 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c  t an integer mul
6040: 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67  tiple of the pag
6050: 65 2d 73 69 7a 65 2c 20 74 68 65 20 76 61 6c 75  e-size, the valu
6060: 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20  e stored in.**  
6070: 20 64 62 53 69 7a 65 20 69 73 20 72 6f 75 6e 64   dbSize is round
6080: 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20  ed down (i.e. a 
6090: 35 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b  5KB file with 2K
60a0: 20 70 61 67 65 2d 73 69 7a 65 20 68 61 73 20 64   page-size has d
60b0: 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20  bSize==2)..**   
60c0: 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65  Except, any file
60d0: 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65 72   that is greater
60e0: 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e   than 0 bytes in
60f0: 20 73 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65   size is conside
6100: 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65  red.**   to have
6110: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61   at least one pa
6120: 67 65 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42 20  ge. (i.e. a 1KB 
6130: 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70 61 67  file with 2K pag
6140: 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20  e-size leads.** 
6150: 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e    to dbSize==1).
6160: 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20  .**.**   During 
6170: 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
6180: 69 6f 6e 2c 20 69 66 20 70 61 67 65 73 20 77 69  ion, if pages wi
6190: 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20  th page-numbers 
61a0: 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20  greater than.** 
61b0: 20 20 64 62 53 69 7a 65 20 61 72 65 20 6d 6f 64    dbSize are mod
61c0: 69 66 69 65 64 20 69 6e 20 74 68 65 20 63 61 63  ified in the cac
61d0: 68 65 2c 20 64 62 53 69 7a 65 20 69 73 20 75 70  he, dbSize is up
61e0: 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  dated accordingl
61f0: 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c  y..**   Similarl
6200: 79 2c 20 69 66 20 74 68 65 20 64 61 74 61 62 61  y, if the databa
6210: 73 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  se is truncated 
6220: 75 73 69 6e 67 20 50 61 67 65 72 54 72 75 6e 63  using PagerTrunc
6230: 61 74 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20  ateImage(), .** 
6240: 20 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61    dbSize is upda
6250: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72  ted..**.**   Var
6260: 69 61 62 6c 65 73 20 64 62 4f 72 69 67 53 69 7a  iables dbOrigSiz
6270: 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65  e and dbFileSize
6280: 20 61 72 65 20 76 61 6c 69 64 20 69 6e 20 73 74   are valid in st
6290: 61 74 65 73 20 0a 2a 2a 20 20 20 50 41 47 45 52  ates .**   PAGER
62a0: 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61  _WRITER_LOCKED a
62b0: 6e 64 20 68 69 67 68 65 72 2e 20 64 62 4f 72 69  nd higher. dbOri
62c0: 67 53 69 7a 65 20 69 73 20 61 20 63 6f 70 79 20  gSize is a copy 
62d0: 6f 66 20 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a  of the dbSize.**
62e0: 20 20 20 76 61 72 69 61 62 6c 65 20 61 74 20 74     variable at t
62f0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
6300: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20  transaction. It 
6310: 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 72  is used during r
6320: 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e  ollback,.**   an
6330: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  d to determine w
6340: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61  hether or not pa
6350: 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 6a  ges need to be j
6360: 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65  ournalled before
6370: 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64 69  .**   being modi
6380: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68  fied..**.**   Th
6390: 72 6f 75 67 68 6f 75 74 20 61 20 77 72 69 74 65  roughout a write
63a0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62  -transaction, db
63b0: 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e  FileSize contain
63c0: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a  s the size of.**
63d0: 20 20 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64     the file on d
63e0: 69 73 6b 20 69 6e 20 70 61 67 65 73 2e 20 49 74  isk in pages. It
63f0: 20 69 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70   is set to a cop
6400: 79 20 6f 66 20 64 62 53 69 7a 65 20 77 68 65 6e  y of dbSize when
6410: 20 74 68 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d   the.**   write-
6420: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 66  transaction is f
6430: 69 72 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64  irst opened, and
6440: 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 56 46   updated when VF
6450: 53 20 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65  S calls are made
6460: 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74 65 20 6f  .**   to write o
6470: 72 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 64  r truncate the d
6480: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
6490: 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 65 72 72 43  disk..**.** errC
64a0: 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ode.**.**   The 
64b0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
64c0: 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79 20 65  riable is only e
64d0: 76 65 72 20 75 73 65 64 20 69 6e 20 50 41 47 45  ver used in PAGE
64e0: 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49  R_ERROR state. I
64f0: 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20 74 6f  t.**   is set to
6500: 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68   zero in all oth
6510: 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20 50 41  er states. In PA
6520: 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2c  GER_ERROR state,
6530: 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 0a   Pager.errCode .
6540: 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73 20 73  **   is always s
6550: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46 55 4c  et to SQLITE_FUL
6560: 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  L, SQLITE_IOERR 
6570: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 53 51  or one of the SQ
6580: 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 0a  LITE_IOERR_XXX .
6590: 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73 2e 0a  **   sub-codes..
65a0: 2a 2a 0a 2a 2a 20 20 20 49 66 20 50 61 67 65 72  **.**   If Pager
65b0: 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 20  .errCode is set 
65c0: 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  to SQLITE_IOERR 
65d0: 6f 72 20 6f 6e 65 20 6f 66 20 69 74 73 20 73 75  or one of its su
65e0: 62 63 6f 64 65 73 2c 20 74 68 65 6e 0a 2a 2a 20  bcodes, then.** 
65f0: 20 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20    this value is 
6600: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75  immediately retu
6610: 72 6e 65 64 20 77 68 65 6e 20 65 76 65 72 20 61  rned when ever a
6620: 6e 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 58  ny sqlite3PagerX
6630: 58 58 28 29 20 6d 65 74 68 6f 64 0a 2a 2a 20 20  XX() method.**  
6640: 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 61 6e   that returns an
6650: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 63   error code is c
6660: 61 6c 6c 65 64 2e 20 49 66 20 69 74 20 69 73 20  alled. If it is 
6670: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46 55  set to SQLITE_FU
6680: 4c 4c 2c 0a 2a 2a 20 20 20 74 68 65 6e 20 69 74  LL,.**   then it
6690: 20 69 73 20 72 65 74 75 72 6e 65 64 20 77 68 65   is returned whe
66a0: 6e 65 76 65 72 20 61 6e 79 20 73 75 63 68 20 73  never any such s
66b0: 71 6c 69 74 65 33 50 61 67 65 72 58 58 58 28 29  qlite3PagerXXX()
66c0: 20 6d 65 74 68 6f 64 20 65 78 63 65 70 74 0a 2a   method except.*
66d0: 2a 20 20 20 66 6f 72 20 50 61 67 65 72 41 63 71  *   for PagerAcq
66e0: 75 69 72 65 28 29 20 6f 72 20 50 61 67 65 72 4c  uire() or PagerL
66f0: 6f 6f 6b 75 70 28 29 20 69 73 20 63 61 6c 6c 65  ookup() is calle
6700: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a  d..**.**   TODO:
6710: 20 52 65 76 69 65 77 20 74 68 65 20 53 51 4c 49   Review the SQLI
6720: 54 45 5f 46 55 4c 4c 2f 50 61 67 65 72 41 63 71  TE_FULL/PagerAcq
6730: 75 69 72 65 28 29 20 65 78 63 65 70 74 69 6f 6e  uire() exception
6740: 2e 20 49 73 20 69 74 20 61 20 67 6f 6f 64 20 69  . Is it a good i
6750: 64 65 61 3f 0a 2a 2a 20 20 20 20 20 20 20 20 20  dea?.**         
6760: 49 66 20 73 6f 2c 20 61 72 65 20 74 68 65 72 65  If so, are there
6770: 20 62 75 67 73 20 77 68 65 72 65 62 79 20 73 68   bugs whereby sh
6780: 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e  ared-cache clien
6790: 74 73 20 63 61 6e 20 73 65 65 20 0a 2a 2a 20 20  ts can see .**  
67a0: 20 20 20 20 20 20 20 75 6e 63 6f 6d 6d 69 74 74         uncommitt
67b0: 65 64 20 64 61 74 61 20 77 68 65 6e 20 74 68 65  ed data when the
67c0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
67d0: 20 45 52 52 4f 52 20 73 74 61 74 65 3f 0a 2a 2a   ERROR state?.**
67e0: 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72  .*/.struct Pager
67f0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73   {.  sqlite3_vfs
6800: 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20   *pVfs;         
6810: 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73   /* OS functions
6820: 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a   to use for IO *
6830: 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76 65  /.  u8 exclusive
6840: 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Mode;           
6850: 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65  /* Boolean. True
6860: 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   if locking_mode
6870: 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20  ==EXCLUSIVE */. 
6880: 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b   u8 journalMode;
6890: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
68a0: 4f 6e 65 20 6f 66 20 74 68 65 20 50 41 47 45 52  One of the PAGER
68b0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76  _JOURNALMODE_* v
68c0: 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 75 73  alues */.  u8 us
68d0: 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  eJournal;       
68e0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20         /* Use a 
68f0: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
6900: 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   on this file */
6910: 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b  .  u8 noReadlock
6920: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
6930: 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  * Do not bother 
6940: 74 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f  to obtain readlo
6950: 63 6b 73 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79  cks */.  u8 noSy
6960: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
6970: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
6980: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
6990: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20  if true */.  u8 
69a0: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20  fullSync;       
69b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65           /* Do e
69c0: 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68  xtra syncs of th
69d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f  e journal for ro
69e0: 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38  bustness */.  u8
69f0: 20 73 79 6e 63 5f 66 6c 61 67 73 3b 20 20 20 20   sync_flags;    
6a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
6a10: 20 6f 66 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20   of SYNC_NORMAL 
6a20: 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f 0a  or SYNC_FULL */.
6a30: 20 20 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20    u8 tempFile;  
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6a50: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20   zFilename is a 
6a60: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a  temporary file *
6a70: 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b  /.  u8 readOnly;
6a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a90: 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65  /* True for a re
6aa0: 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
6ab0: 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20   */.  u8 memDb; 
6ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ad0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68    /* True to inh
6ae0: 69 62 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f  ibit all file I/
6af0: 4f 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66  O */..  /* The f
6b00: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63  ollowing block c
6b10: 6f 6e 74 61 69 6e 73 20 74 68 6f 73 65 20 63 6c  ontains those cl
6b20: 61 73 73 20 6d 65 6d 62 65 72 73 20 74 68 61 74  ass members that
6b30: 20 61 72 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79   are dynamically
6b40: 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 64  .  ** modified d
6b50: 75 72 69 6e 67 20 6e 6f 72 6d 61 6c 20 6f 70 65  uring normal ope
6b60: 72 61 74 69 6f 6e 73 2e 20 54 68 65 20 6f 74 68  rations. The oth
6b70: 65 72 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20  er variables in 
6b80: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 0a 20  this structure. 
6b90: 20 2a 2a 20 61 72 65 20 65 69 74 68 65 72 20 63   ** are either c
6ba0: 6f 6e 73 74 61 6e 74 20 74 68 72 6f 75 67 68 6f  onstant througho
6bb0: 75 74 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20  ut the lifetime 
6bc0: 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 6f 72  of the pager, or
6bd0: 20 65 6c 73 65 0a 20 20 2a 2a 20 75 73 65 64 20   else.  ** used 
6be0: 74 6f 20 73 74 6f 72 65 20 63 6f 6e 66 69 67 75  to store configu
6bf0: 72 61 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72  ration parameter
6c00: 73 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68  s that affect th
6c10: 65 20 77 61 79 20 74 68 65 20 70 61 67 65 72 20  e way the pager 
6c20: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 65 73 2e 0a  .  ** operates..
6c30: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 27 73    **.  ** The 's
6c40: 74 61 74 65 27 20 76 61 72 69 61 62 6c 65 20 69  tate' variable i
6c50: 73 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 6d  s described in m
6c60: 6f 72 65 20 64 65 74 61 69 6c 20 61 6c 6f 6e 67  ore detail along
6c70: 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 64   with the.  ** d
6c80: 65 73 63 72 69 70 74 69 6f 6e 73 20 6f 66 20 74  escriptions of t
6c90: 68 65 20 76 61 6c 75 65 73 20 69 74 20 6d 61 79  he values it may
6ca0: 20 74 61 6b 65 20 2d 20 50 41 47 45 52 5f 55 4e   take - PAGER_UN
6cb0: 4c 4f 43 4b 20 65 74 63 2e 20 4d 61 6e 79 20 6f  LOCK etc. Many o
6cc0: 66 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72  f the.  ** other
6cd0: 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68   variables in th
6ce0: 69 73 20 62 6c 6f 63 6b 20 61 72 65 20 64 65 73  is block are des
6cf0: 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 63 6f  cribed in the co
6d00: 6d 6d 65 6e 74 20 64 69 72 65 63 74 6c 79 20 0a  mment directly .
6d10: 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 69 73 20    ** above this 
6d20: 63 6c 61 73 73 20 64 65 66 69 6e 69 74 69 6f 6e  class definition
6d30: 2e 0a 20 20 2a 2f 0a 20 20 75 38 20 65 53 74 61  ..  */.  u8 eSta
6d40: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
6d50: 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74       /* Pager st
6d60: 61 74 65 20 28 4f 50 45 4e 2c 20 52 45 41 44 45  ate (OPEN, READE
6d70: 52 2c 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  R, WRITER_LOCKED
6d80: 2e 2e 29 20 2a 2f 0a 20 20 75 38 20 65 4c 6f 63  ..) */.  u8 eLoc
6d90: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
6da0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
6db0: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 64 61 74  lock held on dat
6dc0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
6dd0: 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  u8 changeCountDo
6de0: 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ne;         /* S
6df0: 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65  et after increme
6e00: 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  nting the change
6e10: 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38  -counter */.  u8
6e20: 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20   setMaster;     
6e30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
6e40: 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20  e if a m-j name 
6e50: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
6e60: 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38   to jrnl */.  u8
6e70: 20 64 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20 20   doNotSpill;    
6e80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
6e90: 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61  not spill the ca
6ea0: 63 68 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72  che when non-zer
6eb0: 6f 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53  o */.  u8 doNotS
6ec0: 79 6e 63 53 70 69 6c 6c 3b 20 20 20 20 20 20 20  yncSpill;       
6ed0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 6f 20     /* Do not do 
6ee0: 61 20 73 70 69 6c 6c 20 74 68 61 74 20 72 65 71  a spill that req
6ef0: 75 69 72 65 73 20 6a 72 6e 6c 20 73 79 6e 63 20  uires jrnl sync 
6f00: 2a 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65  */.  u8 subjInMe
6f10: 6d 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  mory;           
6f20: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
6f30: 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f  in-memory sub-jo
6f40: 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f  urnals */.  Pgno
6f50: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
6f60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6f70: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
6f80: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
6f90: 50 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b  Pgno dbOrigSize;
6fa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64              /* d
6fb0: 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65  bSize before the
6fc0: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
6fd0: 74 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  tion */.  Pgno d
6fe0: 62 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20  bFileSize;      
6ff0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7000: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
7010: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
7020: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
7030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7040: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
7050: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
7060: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
7070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7080: 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e    /* Pages journ
7090: 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74  alled since last
70a0: 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65   j-header writte
70b0: 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  n */.  u32 cksum
70c0: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
70d0: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
70e0: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
70f0: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
7100: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65   */.  u32 nSubRe
7110: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
7120: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
7130: 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74  ecords written t
7140: 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  o sub-journal */
7150: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f  .  Bitvec *pInJo
7160: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f  urnal;         /
7170: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
7180: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
7190: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
71a0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
71b0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
71c0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
71d0: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f   for database */
71e0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
71f0: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *jfd;          /
7200: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
7210: 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e  r for main journ
7220: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
7230: 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20  file *sjfd;     
7240: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7250: 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a  riptor for sub-j
7260: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
7270: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
7280: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
7290: 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20  nt write offset 
72a0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
72b0: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
72c0: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
72d0: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
72e0: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
72f0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
7300: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  /.  i64 journalS
7310: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  izeLimit;       
7320: 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f  /* Size limit fo
7330: 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  r persistent jou
7340: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
7350: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
7360: 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41  aSavepoint; /* A
7370: 72 72 61 79 20 6f 66 20 61 63 74 69 76 65 20 73  rray of active s
7380: 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69  avepoints */.  i
7390: 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  nt nSavepoint;  
73a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
73b0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
73c0: 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d   in aSavepoint[]
73d0: 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c   */.  char dbFil
73e0: 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20  eVers[16];      
73f0: 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65    /* Changes whe
7400: 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66  never database f
7410: 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20  ile changes */. 
7420: 20 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b   u32 sectorSize;
7430: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7440: 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  Assumed sector s
7450: 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ize during rollb
7460: 61 63 6b 20 2a 2f 0a 0a 20 20 75 31 36 20 6e 45  ack */..  u16 nE
7470: 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
7480: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
7490: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20  s many bytes to 
74a0: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
74b0: 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65  age */.  i16 nRe
74c0: 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20  serve;          
74d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
74e0: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61  f unused bytes a
74f0: 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61  t end of each pa
7500: 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46  ge */.  u32 vfsF
7510: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
7520: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72      /* Flags for
7530: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
7540: 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 70 61  en() */.  int pa
7550: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
7560: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7570: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61  of bytes in a pa
7580: 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  ge */.  Pgno mxP
7590: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
75a0: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
75b0: 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74  llowed size of t
75c0: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
75d0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
75e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
75f0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
7600: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63  base file */.  c
7610: 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20  har *zJournal;  
7620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
7630: 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
7640: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  l file */.  int 
7650: 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28  (*xBusyHandler)(
7660: 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74  void*); /* Funct
7670: 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e  ion to call when
7680: 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20   busy */.  void 
7690: 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  *pBusyHandlerArg
76a0: 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78  ;      /* Contex
76b0: 74 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78  t argument for x
76c0: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 23  BusyHandler */.#
76d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
76e0: 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d  T.  int nHit, nM
76f0: 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  iss;            
7700: 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20 61 6e  /* Cache hits an
7710: 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69  d missing */.  i
7720: 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65  nt nRead, nWrite
7730: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
7740: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
7750: 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e  d/written */.#en
7760: 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65  dif.  void (*xRe
7770: 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29  initer)(DbPage*)
7780: 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72  ; /* Call this r
7790: 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f  outine when relo
77a0: 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23  ading pages */.#
77b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
77c0: 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28  _CODEC.  void *(
77d0: 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
77e0: 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20  oid*,Pgno,int); 
77f0: 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65  /* Routine for e
7800: 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20  n/decoding data 
7810: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  */.  void (*xCod
7820: 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64  ecSizeChng)(void
7830: 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e  *,int,int); /* N
7840: 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20 73 69  otify of page si
7850: 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  ze changes */.  
7860: 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65  void (*xCodecFre
7870: 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20  e)(void*);      
7880: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75         /* Destru
7890: 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64  ctor for the cod
78a0: 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  ec */.  void *pC
78b0: 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  odec;           
78c0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
78d0: 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e  ument to xCodec.
78e0: 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65  .. methods */.#e
78f0: 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d  ndif.  char *pTm
7900: 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
7910: 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65     /* Pager.page
7920: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70  Size bytes of sp
7930: 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20  ace for tmp use 
7940: 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43  */.  PCache *pPC
7950: 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20  ache;           
7960: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
7970: 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74  age cache object
7980: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61   */.  sqlite3_ba
7990: 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20  ckup *pBackup;  
79a0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
79b0: 6c 69 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20  list of ongoing 
79c0: 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73  backup processes
79d0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
79e0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61  TE_OMIT_WAL.  Wa
79f0: 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20  l *pWal;        
7a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
7a10: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65  te-ahead log use
7a20: 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  d by "journal_mo
7a30: 64 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61  de=wal" */.  cha
7a40: 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20  r *zWal;        
7a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
7a60: 20 6e 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d   name for write-
7a70: 61 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e  ahead log */.#en
7a80: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  dif.};../*.** Th
7a90: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
7aa0: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c  al variables hol
7ab0: 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  d counters used 
7ac0: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70  for.** testing p
7ad0: 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54  urposes only.  T
7ae0: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 64  hese variables d
7af0: 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a  o not exist in.*
7b00: 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20  * a non-testing 
7b10: 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61  build.  These va
7b20: 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20  riables are not 
7b30: 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a  thread-safe..*/.
7b40: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
7b50: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  ST.int sqlite3_p
7b60: 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
7b70: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
7b80: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
7b90: 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a  s read from DB *
7ba0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
7bb0: 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
7bc0: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  t = 0;   /* Numb
7bd0: 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73  er of full pages
7be0: 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a   written to DB *
7bf0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
7c00: 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
7c10: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
7c20: 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74  er of pages writ
7c30: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
7c40: 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  /.# define PAGER
7c50: 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65  _INCR(v)  v++.#e
7c60: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47  lse.# define PAG
7c70: 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69  ER_INCR(v).#endi
7c80: 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e  f..../*.** Journ
7c90: 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77  al files begin w
7ca0: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
7cb0: 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20  g magic string. 
7cc0: 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73   The data.** was
7cd0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f   obtained from /
7ce0: 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20  dev/random.  It 
7cf0: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20  is used only as 
7d00: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a  a sanity check..
7d10: 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73  **.** Since vers
7d20: 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a  ion 2.8.0, the j
7d30: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
7d40: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61  ntains additiona
7d50: 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63  l sanity.** chec
7d60: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
7d70: 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20  .  If the power 
7d80: 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20  fails while the 
7d90: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
7da0: 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d  .** written, sem
7db0: 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65  i-random garbage
7dc0: 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65   data might appe
7dd0: 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ar in the journa
7de0: 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20  l.** file after 
7df0: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
7e00: 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70  d.  If an attemp
7e10: 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a  t is then made.*
7e20: 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f  * to roll the jo
7e30: 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20  urnal back, the 
7e40: 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
7e50: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68  e corrupted.  Th
7e60: 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  e additional.** 
7e70: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
7e80: 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d  data is an attem
7e90: 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  pt to discover t
7ea0: 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68  he garbage in th
7eb0: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  e.** journal and
7ec0: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a   ignore it..**.*
7ed0: 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65  * The sanity che
7ee0: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
7ef0: 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f  n for the new jo
7f00: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
7f10: 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32  sists.** of a 32
7f20: 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e  -bit checksum on
7f30: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61   each page of da
7f40: 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75  ta.  The checksu
7f50: 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a  m covers both.**
7f60: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
7f70: 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d   and the pPager-
7f80: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
7f90: 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  of data for the 
7fa0: 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b  page..** This ck
7fb0: 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  sum is initializ
7fc0: 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72  ed to a 32-bit r
7fd0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74  andom value that
7fe0: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a   appears in the.
7ff0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
8000: 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
8010: 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e  header.  The ran
8020: 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  dom initializer 
8030: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a  is important,.**
8040: 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65   because garbage
8050: 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61   data that appea
8060: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
8070: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69   a journal is li
8080: 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61  kely.** data tha
8090: 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74  t was once in ot
80a0: 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68  her files that h
80b0: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c  ave now been del
80c0: 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a  eted.  If the.**
80d0: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61   garbage data ca
80e0: 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c  me from an obsol
80f0: 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
8100: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  , the checksums 
8110: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72  might.** be corr
8120: 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69  ect.  But by ini
8130: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68  tializing the ch
8140: 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d  ecksum to random
8150: 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20   value which.** 
8160: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  is different for
8170: 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20   every journal, 
8180: 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74  we minimize that
8190: 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   risk..*/.static
81a0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
81b0: 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  char aJournalMag
81c0: 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c  ic[] = {.  0xd9,
81d0: 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66   0xd5, 0x05, 0xf
81e0: 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30  9, 0x20, 0xa1, 0
81f0: 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f  x63, 0xd7,.};../
8200: 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
8210: 20 74 68 65 20 6f 66 20 65 61 63 68 20 70 61 67   the of each pag
8220: 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  e record in the 
8230: 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e  journal is given
8240: 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f   by.** the follo
8250: 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23  wing macro..*/.#
8260: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50  define JOURNAL_P
8270: 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28  G_SZ(pPager)  ((
8280: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
8290: 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ) + 8)../*.** Th
82a0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
82b0: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
82c0: 61 67 65 72 2e 20 54 68 69 73 20 69 73 20 75 73  ager. This is us
82d0: 75 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a  ually the same .
82e0: 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e  ** size as a sin
82f0: 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  gle disk sector.
8300: 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63   See also setSec
8310: 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64  torSize()..*/.#d
8320: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44  efine JOURNAL_HD
8330: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50  R_SZ(pPager) (pP
8340: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
8350: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63  )../*.** The mac
8360: 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65  ro MEMDB is true
8370: 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69   if we are deali
8380: 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65  ng with an in-me
8390: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
83a0: 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20  * We do this as 
83b0: 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20  a macro so that 
83c0: 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d  if the SQLITE_OM
83d0: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72  IT_MEMORYDB macr
83e0: 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65  o is set,.** the
83f0: 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20   value of MEMDB 
8400: 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61  will be a consta
8410: 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  nt and the compi
8420: 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a  ler will optimiz
8430: 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68  e.** out code th
8440: 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65  at would never e
8450: 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65  xecute..*/.#ifde
8460: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
8470: 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20  MORYDB.# define 
8480: 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20  MEMDB 0.#else.# 
8490: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61  define MEMDB pPa
84a0: 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69  ger->memDb.#endi
84b0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  f../*.** The max
84c0: 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20  imum legal page 
84d0: 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20  number is (2^31 
84e0: 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  - 1)..*/.#define
84f0: 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20   PAGER_MAX_PGNO 
8500: 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a  2147483647../*.*
8510: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74  * The argument t
8520: 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20  o this macro is 
8530: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
8540: 72 20 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f  r (type sqlite3_
8550: 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72  file*)..** Retur
8560: 6e 20 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74  n 0 if it is not
8570: 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65   open, or non-ze
8580: 72 6f 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69  ro (but not 1) i
8590: 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54  f it is..**.** T
85a0: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 65  his is so that e
85b0: 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62  xpressions can b
85c0: 65 20 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a  e written as:.**
85d0: 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e  .**   if( isOpen
85e0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
85f0: 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65   ....**.** inste
8600: 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66  ad of.**.**   if
8610: 28 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70  ( pPager->jfd->p
8620: 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a  Methods ){ ....*
8630: 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e  /.#define isOpen
8640: 28 70 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d  (pFd) ((pFd)->pM
8650: 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 52  ethods)../*.** R
8660: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
8670: 69 73 20 70 61 67 65 72 20 75 73 65 73 20 61 20  is pager uses a 
8680: 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20  write-ahead log 
8690: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75  instead of the u
86a0: 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  sual.** rollback
86b0: 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77   journal. Otherw
86c0: 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69  ise false..*/.#i
86d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
86e0: 54 5f 57 41 4c 0a 73 74 61 74 69 63 20 69 6e 74  T_WAL.static int
86f0: 20 70 61 67 65 72 55 73 65 57 61 6c 28 50 61 67   pagerUseWal(Pag
8700: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
8710: 65 74 75 72 6e 20 28 70 50 61 67 65 72 2d 3e 70  eturn (pPager->p
8720: 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65  Wal!=0);.}.#else
8730: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 55  .# define pagerU
8740: 73 65 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66  seWal(x) 0.# def
8750: 69 6e 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  ine pagerRollbac
8760: 6b 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69  kWal(x) 0.# defi
8770: 6e 65 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65  ne pagerWalFrame
8780: 73 28 76 2c 77 2c 78 2c 79 2c 7a 29 20 30 0a 23  s(v,w,x,y,z) 0.#
8790: 20 64 65 66 69 6e 65 20 70 61 67 65 72 4f 70 65   define pagerOpe
87a0: 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 7a 29  nWalIfPresent(z)
87b0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66   SQLITE_OK.# def
87c0: 69 6e 65 20 70 61 67 65 72 42 65 67 69 6e 52 65  ine pagerBeginRe
87d0: 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 7a 29  adTransaction(z)
87e0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69   SQLITE_OK.#endi
87f0: 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  f..#ifndef NDEBU
8800: 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a  G ./*.** Usage:.
8810: 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20  **.**   assert( 
8820: 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
8830: 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2a  te(pPager) );.**
8840: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
8850: 6e 20 72 75 6e 73 20 6d 61 6e 79 20 61 73 73 65  n runs many asse
8860: 72 74 73 20 74 6f 20 74 72 79 20 74 6f 20 66 69  rts to try to fi
8870: 6e 64 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 69  nd inconsistenci
8880: 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20 69 6e 74  es in.** the int
8890: 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74  ernal state of t
88a0: 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e  he Pager object.
88b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
88c0: 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
88d0: 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 50  e(Pager *p){.  P
88e0: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
88f0: 3b 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20 6d 75  ;..  /* State mu
8900: 73 74 20 62 65 20 76 61 6c 69 64 2e 20 2a 2f 0a  st be valid. */.
8910: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74    assert( p->eSt
8920: 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 0a  ate==PAGER_OPEN.
8930: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
8940: 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
8950: 52 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  R.       || p->e
8960: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
8970: 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20  TER_LOCKED.     
8980: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
8990: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
89a0: 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  HEMOD.       || 
89b0: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
89c0: 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20  _WRITER_DBMOD.  
89d0: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
89e0: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
89f0: 46 49 4e 49 53 48 45 44 0a 20 20 20 20 20 20 20  FINISHED.       
8a00: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
8a10: 47 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 0a  GER_ERROR.  );..
8a20: 20 20 2f 2a 20 52 65 67 61 72 64 6c 65 73 73 20    /* Regardless 
8a30: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
8a40: 74 61 74 65 2c 20 61 20 74 65 6d 70 2d 66 69 6c  tate, a temp-fil
8a50: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 77  e connection alw
8a60: 61 79 73 20 62 65 68 61 76 65 73 0a 20 20 2a 2a  ays behaves.  **
8a70: 20 61 73 20 69 66 20 69 74 20 68 61 73 20 61 6e   as if it has an
8a80: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
8a90: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
8aa0: 66 69 6c 65 2e 20 49 74 20 6e 65 76 65 72 20 75  file. It never u
8ab0: 70 64 61 74 65 73 0a 20 20 2a 2a 20 74 68 65 20  pdates.  ** the 
8ac0: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66  change-counter f
8ad0: 69 65 6c 64 2c 20 73 6f 20 74 68 65 20 63 68 61  ield, so the cha
8ae0: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61  ngeCountDone fla
8af0: 67 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 2e  g is always set.
8b00: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
8b10: 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c  p->tempFile==0 |
8b20: 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  | p->eLock==EXCL
8b30: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
8b40: 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46  assert( p->tempF
8b50: 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  ile==0 || pPager
8b60: 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
8b70: 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  e );..  /* If th
8b80: 65 20 75 73 65 4a 6f 75 72 6e 61 6c 20 66 6c 61  e useJournal fla
8b90: 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65 20  g is clear, the 
8ba0: 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73  journal-mode mus
8bb0: 74 20 62 65 20 22 4f 46 46 22 2e 20 0a 20 20 2a  t be "OFF". .  *
8bc0: 2a 20 41 6e 64 20 69 66 20 74 68 65 20 6a 6f 75  * And if the jou
8bd0: 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 22 4f 46  rnal-mode is "OF
8be0: 46 22 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  F", the journal 
8bf0: 66 69 6c 65 20 6d 75 73 74 20 6e 6f 74 20 62 65  file must not be
8c00: 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73   open..  */.  as
8c10: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
8c20: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
8c30: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70  NALMODE_OFF || p
8c40: 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
8c50: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75    assert( p->jou
8c60: 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
8c70: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
8c80: 7c 7c 20 21 69 73 4f 70 65 6e 28 70 2d 3e 6a 66  || !isOpen(p->jf
8c90: 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  d) );..  /* Chec
8ca0: 6b 20 74 68 61 74 20 4d 45 4d 44 42 20 69 6d 70  k that MEMDB imp
8cb0: 6c 69 65 73 20 6e 6f 53 79 6e 63 2e 20 2a 2f 0a  lies noSync. */.
8cc0: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
8cd0: 20 7c 7c 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b   || p->noSync );
8ce0: 0a 0a 20 20 2f 2a 20 49 66 20 63 68 61 6e 67 65  ..  /* If change
8cf0: 43 6f 75 6e 74 44 6f 6e 65 20 69 73 20 73 65 74  CountDone is set
8d00: 2c 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  , a RESERVED loc
8d10: 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73  k or greater mus
8d20: 74 20 62 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f  t be held.  ** o
8d30: 6e 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  n the file..  */
8d40: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
8d50: 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
8d60: 6e 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  ne==0 || pPager-
8d70: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
8d80: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
8d90: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e  t( p->eLock!=PEN
8da0: 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  DING_LOCK );..  
8db0: 73 77 69 74 63 68 28 20 70 2d 3e 65 53 74 61 74  switch( p->eStat
8dc0: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 41  e ){.    case PA
8dd0: 47 45 52 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20  GER_OPEN:.      
8de0: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
8df0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8e00: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
8e10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
8e20: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
8e30: 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
8e40: 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
8e50: 65 29 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  e)==0 || pPager-
8e60: 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
8e70: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
8e80: 61 73 65 20 50 41 47 45 52 5f 52 45 41 44 45 52  ase PAGER_READER
8e90: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
8ea0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
8eb0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
8ec0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
8ed0: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
8ee0: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
8ef0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48  rt( p->eLock>=SH
8f00: 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 2d 3e  ARED_LOCK || p->
8f10: 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 3b 0a 20 20  noReadlock );.  
8f20: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
8f30: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
8f40: 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20 20  R_LOCKED:.      
8f50: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
8f60: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
8f70: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8f80: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
8f90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
8fa0: 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55 73      if( !pagerUs
8fb0: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
8fc0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8fd0: 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  p->eLock>=RESERV
8fe0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
8ff0: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
9000: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
9010: 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
9020: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
9030: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
9040: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
9050: 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20  >dbFileSize );. 
9060: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9070: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d  ger->setMaster==
9080: 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
9090: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
90a0: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
90b0: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
90c0: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f   p->eLock!=UNKNO
90d0: 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
90e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
90f0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9100: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
9110: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
9120: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
9130: 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62   /* It is possib
9140: 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75 72 6e  le that if journ
9150: 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72 65  al_mode=wal here
9160: 20 74 68 61 74 20 6e 65 69 74 68 65 72 20 74 68   that neither th
9170: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
9180: 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74 68  rnal file nor th
9190: 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65 20 6f  e WAL file are o
91a0: 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70 65 6e  pen. This happen
91b0: 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20 20 20  s during.       
91c0: 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 74   ** a rollback t
91d0: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
91e0: 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20 6a 6f  switches from jo
91f0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20  urnal_mode=off. 
9200: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f 75         ** to jou
9210: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20  rnal_mode=wal.. 
9220: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
9230: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
9240: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
9250: 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  K );.        ass
9260: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
9270: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
9280: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
9290: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
92a0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
92b0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
92c0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
92d0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
92e0: 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  L .        );.  
92f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
9300: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
9310: 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  igSize==pPager->
9320: 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20  dbFileSize );.  
9330: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
9340: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
9350: 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20 20 20 61  R_DBMOD:.      a
9360: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d  ssert( p->eLock=
9370: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
9380: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9390: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
93a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
93b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61       assert( !pa
93c0: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
93d0: 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
93e0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43  t( p->eLock>=EXC
93f0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
9400: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
9410: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20  pen(p->jfd) .   
9420: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
9430: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
9440: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
9450: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
9460: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
9470: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9480: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a  E_WAL .      );.
9490: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
94a0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
94b0: 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20 20  TER_FINISHED:.  
94c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
94d0: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
94e0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
94f0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
9500: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
9510: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9520: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
9530: 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
9540: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
9550: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
9560: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
9570: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
9580: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
9590: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
95a0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
95b0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
95c0: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
95d0: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
95e0: 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a 20  e PAGER_ERROR:. 
95f0: 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d 75       /* There mu
9600: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  st be at least o
9610: 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  ne outstanding r
9620: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
9630: 70 61 67 65 72 20 69 66 0a 20 20 20 20 20 20 2a  pager if.      *
9640: 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  * in ERROR state
9650: 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20  . Otherwise the 
9660: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68 61 76  pager should hav
9670: 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70 70 65  e already droppe
9680: 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20  d.      ** back 
9690: 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20  to OPEN state.. 
96a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
96b0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
96c0: 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
96d0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
96e0: 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
96f0: 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
9700: 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a 20 20  pPCache)>0 );.  
9710: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
9720: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
9730: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
9740: 69 6e 74 65 72 20 74 6f 20 61 20 68 75 6d 61 6e  inter to a human
9750: 20 72 65 61 64 61 62 6c 65 20 73 74 72 69 6e 67   readable string
9760: 20 69 6e 20 61 20 73 74 61 74 69 63 20 62 75 66   in a static buf
9770: 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e  fer.** containin
9780: 67 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  g the state of t
9790: 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
97a0: 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
97b0: 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a 20 69  ument. This.** i
97c0: 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65  s intended to be
97d0: 20 75 73 65 64 20 77 69 74 68 69 6e 20 64 65 62   used within deb
97e0: 75 67 67 65 72 73 2e 20 46 6f 72 20 65 78 61 6d  uggers. For exam
97f0: 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74 65 72  ple, as an alter
9800: 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22 70 72  native.** to "pr
9810: 69 6e 74 20 2a 70 50 61 67 65 72 22 20 69 6e 20  int *pPager" in 
9820: 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64 62 29  gdb:.**.** (gdb)
9830: 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20 70 72   printf "%s", pr
9840: 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  int_pager_state(
9850: 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61 74 69  pPager).*/.stati
9860: 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f 70 61  c char *print_pa
9870: 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20  ger_state(Pager 
9880: 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  *p){.  static ch
9890: 61 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b 0a 0a  ar zRet[1024];..
98a0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
98b0: 74 66 28 31 30 32 34 2c 20 7a 52 65 74 2c 0a 20  tf(1024, zRet,. 
98c0: 20 20 20 20 20 22 46 69 6c 65 6e 61 6d 65 3a 20       "Filename: 
98d0: 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20       %s\n".     
98e0: 20 22 53 74 61 74 65 3a 20 20 20 20 20 20 20 20   "State:        
98f0: 20 25 73 20 65 72 72 43 6f 64 65 3d 25 64 5c 6e   %s errCode=%d\n
9900: 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a 20 20  ".      "Lock:  
9910: 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20          %s\n".  
9920: 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d 6f 64      "Locking mod
9930: 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  e:  locking_mode
9940: 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f  =%s\n".      "Jo
9950: 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a 6f 75  urnal mode:  jou
9960: 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a  rnal_mode=%s\n".
9970: 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67 20 73        "Backing s
9980: 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65 3d 25  tore: tempFile=%
9990: 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65 4a 6f  d memDb=%d useJo
99a0: 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20 20 20  urnal=%d\n".    
99b0: 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20 20 20    "Journal:     
99c0: 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25 6c 6c    journalOff=%ll
99d0: 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25 6c 6c  d journalHdr=%ll
99e0: 64 5c 6e 22 0a 20 20 20 20 20 20 22 53 69 7a 65  d\n".      "Size
99f0: 3a 20 20 20 20 20 20 20 20 20 20 64 62 73 69 7a  :          dbsiz
9a00: 65 3d 25 64 20 64 62 4f 72 69 67 53 69 7a 65 3d  e=%d dbOrigSize=
9a10: 25 64 20 64 62 46 69 6c 65 53 69 7a 65 3d 25 64  %d dbFileSize=%d
9a20: 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 7a  \n".      , p->z
9a30: 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20 20 2c  Filename.      ,
9a40: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9a50: 52 5f 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20  R_OPEN          
9a60: 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20 20 20    ? "OPEN" :.   
9a70: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
9a80: 50 41 47 45 52 5f 52 45 41 44 45 52 20 20 20 20  PAGER_READER    
9a90: 20 20 20 20 20 20 3f 20 22 52 45 41 44 45 52 22        ? "READER"
9aa0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
9ab0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
9ac0: 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20 22 57  ER_LOCKED   ? "W
9ad0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20 3a 0a  RITER_LOCKED" :.
9ae0: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
9af0: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
9b00: 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52 49 54  CACHEMOD ? "WRIT
9b10: 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a 0a 20  ER_CACHEMOD" :. 
9b20: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
9b30: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
9b40: 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49 54 45  BMOD    ? "WRITE
9b50: 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20 20 20  R_DBMOD" :.     
9b60: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
9b70: 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
9b80: 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f 46 49  HED ? "WRITER_FI
9b90: 4e 49 53 48 45 44 22 20 3a 0a 20 20 20 20 20 20  NISHED" :.      
9ba0: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
9bb0: 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20  ER_ERROR        
9bc0: 20 20 20 3f 20 22 45 52 52 4f 52 22 20 3a 20 22     ? "ERROR" : "
9bd0: 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c  ?error?".      ,
9be0: 20 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f 64 65   (int)p->errCode
9bf0: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c 6f 63  .      , p->eLoc
9c00: 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20  k==NO_LOCK      
9c10: 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22 20 3a     ? "NO_LOCK" :
9c20: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63  .        p->eLoc
9c30: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
9c40: 20 20 20 3f 20 22 52 45 53 45 52 56 45 44 22 20     ? "RESERVED" 
9c50: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f  :.        p->eLo
9c60: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
9c70: 43 4b 20 20 3f 20 22 45 58 43 4c 55 53 49 56 45  CK  ? "EXCLUSIVE
9c80: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
9c90: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
9ca0: 4b 20 20 20 20 20 3f 20 22 53 48 41 52 45 44 22  K     ? "SHARED"
9cb0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
9cc0: 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
9cd0: 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57 4e 22  K    ? "UNKNOWN"
9ce0: 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20   : "?error?".   
9cf0: 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73 69 76     , p->exclusiv
9d00: 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75 73 69  eMode ? "exclusi
9d10: 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22 0a 20  ve" : "normal". 
9d20: 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61       , p->journa
9d30: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9d40: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
9d50: 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a 0a 20    ? "memory" :. 
9d60: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
9d70: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9d80: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20  RNALMODE_OFF    
9d90: 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20 20 20    ? "off" :.    
9da0: 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f      p->journalMo
9db0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9dc0: 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 3f  LMODE_DELETE   ?
9dd0: 20 22 64 65 6c 65 74 65 22 20 3a 0a 20 20 20 20   "delete" :.    
9de0: 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f      p->journalMo
9df0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9e00: 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20 3f  LMODE_PERSIST  ?
9e10: 20 22 70 65 72 73 69 73 74 22 20 3a 0a 20 20 20   "persist" :.   
9e20: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
9e30: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9e40: 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
9e50: 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a 0a 20  ? "truncate" :. 
9e60: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
9e70: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9e80: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20  RNALMODE_WAL    
9e90: 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f 65 72    ? "wal" : "?er
9ea0: 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69  ror?".      , (i
9eb0: 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65 2c 20  nt)p->tempFile, 
9ec0: 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c 20 28  (int)p->memDb, (
9ed0: 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72 6e 61  int)p->useJourna
9ee0: 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75  l.      , p->jou
9ef0: 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f 75 72  rnalOff, p->jour
9f00: 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 2c 20 28  nalHdr.      , (
9f10: 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c 20 28  int)p->dbSize, (
9f20: 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53 69 7a  int)p->dbOrigSiz
9f30: 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46 69 6c  e, (int)p->dbFil
9f40: 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20 72 65  eSize.  );..  re
9f50: 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e  turn zRet;.}.#en
9f60: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
9f70: 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73 20  n true if it is 
9f80: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
9f90: 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74  te page *pPg int
9fa0: 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
9fb0: 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65  l..** A page nee
9fc0: 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ds to be written
9fd0: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
9fe0: 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65  urnal if there e
9ff0: 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20  xists one.** or 
a000: 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f  more open savepo
a010: 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a  ints for which:.
a020: 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61  **.**   * The pa
a030: 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge-number is les
a040: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
a050: 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  to PagerSavepoin
a060: 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20  t.nOrig, and.** 
a070: 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72    * The bit corr
a080: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
a090: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
a0a0: 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20  not set in.**   
a0b0: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
a0c0: 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a  .pInSavepoint..*
a0d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  /.static int sub
a0e0: 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50 67  jRequiresPage(Pg
a0f0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 67 6e  Hdr *pPg){.  Pgn
a100: 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  o pgno = pPg->pg
a110: 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  no;.  Pager *pPa
a120: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
a130: 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  r;.  int i;.  fo
a140: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d  r(i=0; i<pPager-
a150: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b  >nSavepoint; i++
a160: 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65  ){.    PagerSave
a170: 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67  point *p = &pPag
a180: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
a190: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f  ];.    if( p->nO
a1a0: 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d  rig>=pgno && 0==
a1b0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
a1c0: 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  t(p->pInSavepoin
a1d0: 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  t, pgno) ){.    
a1e0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
a1f0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
a200: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
a210: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61  n true if the pa
a220: 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ge is already in
a230: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
a240: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
a250: 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50   pageInJournal(P
a260: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65  gHdr *pPg){.  re
a270: 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76  turn sqlite3Bitv
a280: 65 63 54 65 73 74 28 70 50 67 2d 3e 70 50 61 67  ecTest(pPg->pPag
a290: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
a2a0: 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f  pPg->pgno);.}../
a2b0: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62  *.** Read a 32-b
a2c0: 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20  it integer from 
a2d0: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
a2e0: 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72  escriptor.  Stor
a2f0: 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  e the integer.**
a300: 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e   that is read in
a310: 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20   *pRes.  Return 
a320: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
a330: 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20  rything worked, 
a340: 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63  or an.** error c
a350: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
a360: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a   goes wrong..**.
a370: 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72  ** All values ar
a380: 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b  e stored on disk
a390: 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a   as big-endian..
a3a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
a3b0: 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33  ad32bits(sqlite3
a3c0: 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f  _file *fd, i64 o
a3d0: 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73  ffset, u32 *pRes
a3e0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
a3f0: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20  ar ac[4];.  int 
a400: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
a410: 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f  ad(fd, ac, sizeo
a420: 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a  f(ac), offset);.
a430: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
a440: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  _OK ){.    *pRes
a450: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
a460: 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65  te(ac);.  }.  re
a470: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
a480: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
a490: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20   integer into a 
a4a0: 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e  string buffer in
a4b0: 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65   big-endian byte
a4c0: 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69   order..*/.#defi
a4d0: 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42  ne put32bits(A,B
a4e0: 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79  )  sqlite3Put4by
a4f0: 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f  te((u8*)A,B).../
a500: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
a510: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
a520: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
a530: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74  descriptor.  Ret
a540: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
a550: 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
a560: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
a570: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
a580: 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
a590: 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28  int write32bits(
a5a0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
a5b0: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33  , i64 offset, u3
a5c0: 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61  2 val){.  char a
a5d0: 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74  c[4];.  put32bit
a5e0: 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65  s(ac, val);.  re
a5f0: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72  turn sqlite3OsWr
a600: 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f  ite(fd, ac, 4, o
a610: 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ffset);.}../*.**
a620: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
a630: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76  base file to lev
a640: 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20  el eLock, which 
a650: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
a660: 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53 48 41  O_LOCK.** or SHA
a670: 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61 72 64  RED_LOCK. Regard
a680: 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
a690: 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c 6c 20  or not the call 
a6a0: 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  to xUnlock().** 
a6b0: 73 75 63 63 65 65 64 73 2c 20 73 65 74 20 74 68  succeeds, set th
a6c0: 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61  e Pager.eLock va
a6d0: 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63 68 20  riable to match 
a6e0: 74 68 65 20 28 61 74 74 65 6d 70 74 65 64 29 20  the (attempted) 
a6f0: 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  new lock..**.** 
a700: 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65 72  Except, if Pager
a710: 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f  .eLock is set to
a720: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68   UNKNOWN_LOCK wh
a730: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
a740: 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64   is.** called, d
a750: 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 2e  o not modify it.
a760: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
a770: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
a780: 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e 4f 57  ne of .** UNKNOW
a790: 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78  N_LOCK for an ex
a7a0: 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 69  planation of thi
a7b0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
a7c0: 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 50   pagerUnlockDb(P
a7d0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
a7e0: 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  t eLock){.  int 
a7f0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
a800: 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
a810: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
a820: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  e );.  assert( e
a830: 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock==NO_LOCK ||
a840: 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c   eLock==SHARED_L
a850: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
a860: 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20   eLock!=NO_LOCK 
a870: 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  || pagerUseWal(p
a880: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69  Pager)==0 );.  i
a890: 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
a8a0: 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  ->fd) ){.    ass
a8b0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
a8c0: 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  ck>=eLock );.   
a8d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 55   rc = sqlite3OsU
a8e0: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
a8f0: 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66  , eLock);.    if
a900: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21  ( pPager->eLock!
a910: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b  =UNKNOWN_LOCK ){
a920: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
a930: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
a940: 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28    }.    IOTRACE(
a950: 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e  ("UNLOCK %p %d\n
a960: 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b  ", pPager, eLock
a970: 29 29 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  )).  }.  return 
a980: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
a990: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
a9a0: 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f  ile to level eLo
a9b0: 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62  ck, which must b
a9c0: 65 20 65 69 74 68 65 72 20 53 48 41 52 45 44 5f  e either SHARED_
a9d0: 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45  LOCK,.** RESERVE
a9e0: 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53  D_LOCK or EXCLUS
a9f0: 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65  IVE_LOCK. If the
aa00: 20 63 61 6c 6c 65 72 20 69 73 20 73 75 63 63 65   caller is succe
aa10: 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a  ssful, set the.*
aa20: 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61  * Pager.eLock va
aa30: 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6e 65  riable to the ne
aa40: 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e  w locking state.
aa50: 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20   .**.** Except, 
aa60: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
aa70: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
aa80: 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20  _LOCK when this 
aa90: 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  function is .** 
aaa0: 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d  called, do not m
aab0: 6f 64 69 66 79 20 69 74 20 75 6e 6c 65 73 73 20  odify it unless 
aac0: 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20  the new locking 
aad0: 73 74 61 74 65 20 69 73 20 45 58 43 4c 55 53 49  state is EXCLUSI
aae0: 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65  VE_LOCK. .** See
aaf0: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
ab00: 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f  ve the #define o
ab10: 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  f UNKNOWN_LOCK f
ab20: 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
ab30: 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a  n .** of this..*
ab40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
ab50: 65 72 4c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a  erLockDb(Pager *
ab60: 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63  pPager, int eLoc
ab70: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
ab80: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
ab90: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52  ert( eLock==SHAR
aba0: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  ED_LOCK || eLock
abb0: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
abc0: 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  || eLock==EXCLUS
abd0: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  IVE_LOCK );.  if
abe0: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  ( pPager->eLock<
abf0: 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d  eLock || pPager-
ac00: 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock==UNKNOWN_
ac10: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  LOCK ){.    rc =
ac20: 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
ac30: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
ac40: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
ac50: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 61  QLITE_OK && (pPa
ac60: 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ger->eLock!=UNKN
ac70: 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d  OWN_LOCK||eLock=
ac80: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
ac90: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
aca0: 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b  ->eLock = eLock;
acb0: 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
acc0: 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  "LOCK %p %d\n", 
acd0: 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a  pPager, eLock)).
ace0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
acf0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
ad00: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  This function de
ad10: 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72  termines whether
ad20: 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d   or not the atom
ad30: 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
ad40: 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  ation.** can be 
ad50: 75 73 65 64 20 77 69 74 68 20 74 68 69 73 20 70  used with this p
ad60: 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69  ager. The optimi
ad70: 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73  zation can be us
ad80: 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61  ed if:.**.**  (a
ad90: 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  ) the value retu
ada0: 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63 65  rned by OsDevice
adb0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
adc0: 29 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  ) indicates that
add0: 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61 62  .**      a datab
ade0: 61 73 65 20 70 61 67 65 20 6d 61 79 20 62 65 20  ase page may be 
adf0: 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c  written atomical
ae00: 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20  ly, and.**  (b) 
ae10: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
ae20: 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69  ed by OsSectorSi
ae30: 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74 68 61  ze() is less tha
ae40: 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20  n or equal.**   
ae50: 20 20 20 74 6f 20 74 68 65 20 70 61 67 65 20 73     to the page s
ae60: 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  ize..**.** The o
ae70: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61  ptimization is a
ae80: 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e 61 62 6c  lso always enabl
ae90: 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  ed for temporary
aea0: 20 66 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a   files. It is.**
aeb0: 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 63 61 6c   an error to cal
aec0: 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  l this function 
aed0: 69 66 20 70 50 61 67 65 72 20 69 73 20 6f 70 65  if pPager is ope
aee0: 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d  ned on an in-mem
aef0: 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  ory.** database.
af00: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70  .**.** If the op
af10: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f  timization canno
af20: 74 20 62 65 20 75 73 65 64 2c 20 30 20 69 73 20  t be used, 0 is 
af30: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
af40: 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20  can be used,.** 
af50: 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72  then the value r
af60: 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 73  eturned is the s
af70: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
af80: 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a  al file when it.
af90: 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c  ** contains roll
afa0: 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78  back data for ex
afb0: 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a  actly one page..
afc0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
afd0: 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
afe0: 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20  RITE.static int 
aff0: 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50  jrnlBufferSize(P
b000: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
b010: 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
b020: 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
b030: 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
b040: 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20    int dc;       
b050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b060: 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68      /* Device ch
b070: 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f  aracteristics */
b080: 0a 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72  .    int nSector
b090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b0a0: 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72         /* Sector
b0b0: 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74   size */.    int
b0c0: 20 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20   szPage;        
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b0e0: 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a  * Page size */..
b0f0: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
b100: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
b110: 3b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74  ;.    dc = sqlit
b120: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
b130: 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
b140: 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74  ->fd);.    nSect
b150: 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65 63  or = pPager->sec
b160: 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50  torSize;.    szP
b170: 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  age = pPager->pa
b180: 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73  geSize;..    ass
b190: 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
b1a0: 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32  _ATOMIC512==(512
b1b0: 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72  >>8));.    asser
b1c0: 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
b1d0: 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36  TOMIC64K==(65536
b1e0: 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30  >>8));.    if( 0
b1f0: 3d 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f  ==(dc&(SQLITE_IO
b200: 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61  CAP_ATOMIC|(szPa
b210: 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74  ge>>8)) || nSect
b220: 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20  or>szPage) ){.  
b230: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
b240: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
b250: 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  n JOURNAL_HDR_SZ
b260: 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e  (pPager) + JOURN
b270: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
b280: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
b290: 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43  * If SQLITE_CHEC
b2a0: 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66 69 6e  K_PAGES is defin
b2b0: 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f  ed then we do so
b2c0: 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  me sanity checki
b2d0: 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63  ng.** on the cac
b2e0: 68 65 20 75 73 69 6e 67 20 61 20 68 61 73 68 20  he using a hash 
b2f0: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  function.  This 
b300: 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
b310: 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67  ing.** and debug
b320: 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69  ging only..*/.#i
b330: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
b340: 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65  K_PAGES./*.** Re
b350: 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61  turn a 32-bit ha
b360: 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  sh of the page d
b370: 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a  ata for pPage..*
b380: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
b390: 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20  er_datahash(int 
b3a0: 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20  nByte, unsigned 
b3b0: 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20  char *pData){.  
b3c0: 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20  u32 hash = 0;.  
b3d0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
b3e0: 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b  ; i<nByte; i++){
b3f0: 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73  .    hash = (has
b400: 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b  h*1039) + pData[
b410: 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  i];.  }.  return
b420: 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20   hash;.}.static 
b430: 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61  u32 pager_pageha
b440: 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29  sh(PgHdr *pPage)
b450: 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  {.  return pager
b460: 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 2d  _datahash(pPage-
b470: 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  >pPager->pageSiz
b480: 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e, (unsigned cha
b490: 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61  r *)pPage->pData
b4a0: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
b4b0: 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
b4c0: 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65  ash(PgHdr *pPage
b4d0: 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65  ){.  pPage->page
b4e0: 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
b4f0: 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a  ehash(pPage);.}.
b500: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b  ./*.** The CHECK
b510: 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65  _PAGE macro take
b520: 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e  s a PgHdr* as an
b530: 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51   argument. If SQ
b540: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
b550: 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20  .** is defined, 
b560: 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f  and NDEBUG is no
b570: 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  t defined, an as
b580: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
b590: 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20   checks.** that 
b5a0: 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68  the page is eith
b5b0: 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c  er dirty or stil
b5c0: 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61  l matches the ca
b5d0: 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61  lculated page-ha
b5e0: 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43  sh..*/.#define C
b5f0: 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65  HECK_PAGE(x) che
b600: 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63  ckPage(x).static
b610: 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28   void checkPage(
b620: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
b630: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
b640: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73  Pg->pPager;.  as
b650: 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65  sert( !pPg->page
b660: 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Hash || pPager->
b670: 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 7c 7c  errCode.      ||
b680: 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
b690: 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67  DR_DIRTY) || pPg
b6a0: 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65  ->pageHash==page
b6b0: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20  r_pagehash(pPg) 
b6c0: 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66  );.}..#else.#def
b6d0: 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61  ine pager_dataha
b6e0: 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69  sh(X,Y)  0.#defi
b6f0: 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ne pager_pagehas
b700: 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20  h(X)  0.#define 
b710: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
b720: 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ndif  /* SQLITE_
b730: 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a  CHECK_PAGES */..
b740: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
b750: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
b760: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
b770: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
b780: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69   be open..** Thi
b790: 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
b7a0: 70 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61  pts to read a ma
b7b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
b7c0: 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  e name from the 
b7d0: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66  .** end of the f
b7e0: 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63  ile and, if succ
b7f0: 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69  essful, copies i
b800: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75  t into memory su
b810: 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68  pplied .** by th
b820: 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f  e caller. See co
b830: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69  mments above wri
b840: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
b850: 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74  ) for the format
b860: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
b870: 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  e a master journ
b880: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20  al file name at 
b890: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
b8a0: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
b8b0: 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f   zMaster must po
b8c0: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
b8d0: 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73  of at least nMas
b8e0: 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  ter bytes alloca
b8f0: 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61  ted by.** the ca
b900: 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c  ller. This shoul
b910: 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73  d be sqlite3_vfs
b920: 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74  .mxPathname+1 (t
b930: 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69  o ensure there i
b940: 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63  s.** enough spac
b950: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d  e to write the m
b960: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
b970: 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74  me). If the mast
b980: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61  er journal.** na
b990: 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  me in the journa
b9a0: 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e  l is longer than
b9b0: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28   nMaster bytes (
b9c0: 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e  including a.** n
b9d0: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20  ul-terminator), 
b9e0: 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e  then this is han
b9f0: 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61  dled as if no ma
ba00: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
ba10: 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  e.** were presen
ba20: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
ba30: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73  ..**.** If a mas
ba40: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
ba50: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
ba60: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
ba70: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
ba80: 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63  le, then it is c
ba90: 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
baa0: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
bab0: 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a   by zMaster. A.*
bac0: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
bad0: 20 62 79 74 65 20 69 73 20 61 70 70 65 6e 64 65   byte is appende
bae0: 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
baf0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61  following the ma
bb00: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
bb10: 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  file name..**.**
bb20: 20 49 66 20 69 74 20 69 73 20 64 65 74 65 72 6d   If it is determ
bb30: 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73  ined that no mas
bb40: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
bb50: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
bb60: 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20   .** zMaster[0] 
bb70: 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
bb80: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
bb90: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
bba0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
bbb0: 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  le reading from 
bbc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
bbd0: 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65  , an SQLite.** e
bbe0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
bbf0: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
bc00: 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a   int readMasterJ
bc10: 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66  ournal(sqlite3_f
bc20: 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72  ile *pJrnl, char
bc30: 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e   *zMaster, u32 n
bc40: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
bc50: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
bc60: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
bc70: 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65  code */.  u32 le
bc80: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
bc90: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69       /* Length i
bca0: 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65  n bytes of maste
bcb0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
bcc0: 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  /.  i64 szJ;    
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bce0: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20  * Total size in 
bcf0: 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c  bytes of journal
bd00: 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20   file pJrnl */. 
bd10: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
bd20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
bd30: 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  J checksum value
bd40: 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e   read from journ
bd50: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd70: 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
bd80: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
bd90: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
bda0: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41  Magic[8];   /* A
bdb0: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
bdc0: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
bdd0: 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d   */.  zMaster[0]
bde0: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20   = '\0';..  if( 
bdf0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
be00: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
be10: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29  ze(pJrnl, &szJ))
be20: 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20  .   || szJ<16.  
be30: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
be40: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
be50: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26  pJrnl, szJ-16, &
be60: 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e  len)).   || len>
be70: 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  =nMaster .   || 
be80: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
be90: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
bea0: 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75  l, szJ-12, &cksu
beb0: 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  m)).   || SQLITE
bec0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
bed0: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
bee0: 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38  aMagic, 8, szJ-8
bef0: 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28  )).   || memcmp(
bf00: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
bf10: 4d 61 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20  Magic, 8).   || 
bf20: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
bf30: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
bf40: 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c  Jrnl, zMaster, l
bf50: 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29  en, szJ-16-len))
bf60: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
bf70: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   rc;.  }..  /* S
bf80: 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73  ee if the checks
bf90: 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d  um matches the m
bfa0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
bfb0: 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b  me */.  for(u=0;
bfc0: 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20   u<len; u++){.  
bfd0: 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74    cksum -= zMast
bfe0: 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  er[u];.  }.  if(
bff0: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
c000: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
c010: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
c020: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
c030: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
c040: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
c050: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
c060: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
c070: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
c080: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
c090: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
c0a0: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
c0b0: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
c0c0: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
c0d0: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
c0e0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
c0f0: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
c100: 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   len = 0;.  }.  
c110: 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27  zMaster[len] = '
c120: 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72  \0';.   .  retur
c130: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
c140: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
c150: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
c160: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61  ector boundary a
c170: 74 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  t or immediately
c180: 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   .** following t
c190: 68 65 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67  he value in pPag
c1a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
c1b0: 61 73 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f  assuming a secto
c1c0: 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50  r .** size of pP
c1d0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
c1e0: 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e   bytes..**.** i.
c1f0: 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73  e for a sector s
c200: 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a  ize of 512:.**.*
c210: 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  *   Pager.journa
c220: 6c 4f 66 66 20 20 20 20 20 20 20 20 20 20 52 65  lOff          Re
c230: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20  turn value.**   
c240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c260: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20  -------.**   0  
c270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c280: 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31         0.**   51
c290: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
c2a0: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20          512.**  
c2b0: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
c2c0: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
c2d0: 2a 20 20 20 32 30 30 30 20 20 20 20 20 20 20 20  *   2000        
c2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30                20
c2f0: 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63  48.** .*/.static
c300: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f   i64 journalHdrO
c310: 66 66 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  ffset(Pager *pPa
c320: 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73  ger){.  i64 offs
c330: 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20  et = 0;.  i64 c 
c340: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
c350: 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b  lOff;.  if( c ){
c360: 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28  .    offset = ((
c370: 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52  c-1)/JOURNAL_HDR
c380: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29  _SZ(pPager) + 1)
c390: 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   * JOURNAL_HDR_S
c3a0: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  Z(pPager);.  }. 
c3b0: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25   assert( offset%
c3c0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
c3d0: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61  Pager)==0 );.  a
c3e0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63  ssert( offset>=c
c3f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f   );.  assert( (o
c400: 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c  ffset-c)<JOURNAL
c410: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
c420: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73  );.  return offs
c430: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
c440: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
c450: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
c460: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
c470: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   called..**.** T
c480: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
c490: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a  a no-op if the j
c4a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
c4b0: 6e 6f 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e  not been written
c4c0: 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68   to.** within th
c4d0: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
c4e0: 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50  ction (i.e. if P
c4f0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ager.journalOff=
c500: 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f  =0)..**.** If do
c510: 54 72 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d  Truncate is non-
c520: 7a 65 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65  zero or the Page
c530: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
c540: 69 74 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a  it variable is.*
c550: 2a 20 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e  * set to 0, then
c560: 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f   truncate the jo
c570: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65  urnal file to ze
c580: 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
c590: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20  . Otherwise,.** 
c5a0: 7a 65 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65  zero the 28-byte
c5b0: 20 68 65 61 64 65 72 20 61 74 20 74 68 65 20 73   header at the s
c5c0: 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
c5d0: 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74  nal file. In eit
c5e0: 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66  her case, .** if
c5f0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
c600: 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  t in no-sync mod
c610: 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
c620: 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61  nal file immedia
c630: 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77  tely .** after w
c640: 72 69 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  riting or trunca
c650: 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49  ting it..**.** I
c660: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  f Pager.journalS
c670: 69 7a 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20  izeLimit is set 
c680: 74 6f 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e  to a positive, n
c690: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61  on-zero value, a
c6a0: 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  nd.** following 
c6b0: 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f  the truncation o
c6c0: 72 20 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69  r zeroing descri
c6d0: 62 65 64 20 61 62 6f 76 65 20 74 68 65 20 73 69  bed above the si
c6e0: 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f  ze of the .** jo
c6f0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
c700: 74 65 73 20 69 73 20 6c 61 72 67 65 72 20 74 68  tes is larger th
c710: 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74  an this value, t
c720: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
c730: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
c740: 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   to Pager.journa
c750: 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73  lSizeLimit bytes
c760: 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
c770: 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e  le does.** not n
c780: 65 65 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64  eed to be synced
c790: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
c7a0: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  operation..**.**
c7b0: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
c7c0: 6f 63 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20  occurs, abandon 
c7d0: 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
c7e0: 65 74 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72  eturn the IO err
c7f0: 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65  or code..** Othe
c800: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51  rwise, return SQ
c810: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
c820: 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e  ic int zeroJourn
c830: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
c840: 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63  ger, int doTrunc
c850: 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ate){.  int rc =
c860: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
c870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
c890: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73  urn code */.  as
c8a0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
c8b0: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69  ger->jfd) );.  i
c8c0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
c8d0: 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e  alOff ){.    con
c8e0: 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20  st i64 iLimit = 
c8f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
c900: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20  izeLimit;    /* 
c910: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a  Local cache of j
c920: 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41  sl */..    IOTRA
c930: 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70  CE(("JZEROHDR %p
c940: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
c950: 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65    if( doTruncate
c960: 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b   || iLimit==0 ){
c970: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
c980: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
c990: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
c9a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c9b0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
c9c0: 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20  r zeroHdr[28] = 
c9d0: 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  {0};.      rc = 
c9e0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
c9f0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f  Pager->jfd, zero
ca00: 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f  Hdr, sizeof(zero
ca10: 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Hdr), 0);.    }.
ca20: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
ca30: 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72  TE_OK && !pPager
ca40: 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
ca50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
ca60: 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
ca70: 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  , SQLITE_SYNC_DA
ca80: 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73  TAONLY|pPager->s
ca90: 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20  ync_flags);.    
caa0: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
cab0: 73 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e  s point the tran
cac0: 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
cad0: 74 74 65 64 20 62 75 74 20 74 68 65 20 77 72 69  tted but the wri
cae0: 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20  te lock .    ** 
caf0: 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e  is still held on
cb00: 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
cb10: 65 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69  ere is a size li
cb20: 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66  mit configured f
cb30: 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  or .    ** the p
cb40: 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61  ersistent journa
cb50: 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  l and the journa
cb60: 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  l file currently
cb70: 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20   consumes more. 
cb80: 20 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e     ** space than
cb90: 20 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f   that limit allo
cba0: 77 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65  ws for, truncate
cbb0: 20 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69   it now. There i
cbc0: 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a  s no need.    **
cbd0: 20 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c   to sync the fil
cbe0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  e following this
cbf0: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20   operation..    
cc00: 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
cc10: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d  QLITE_OK && iLim
cc20: 69 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36  it>0 ){.      i6
cc30: 34 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d  4 sz;.      rc =
cc40: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
cc50: 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
cc60: 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &sz);.      if( 
cc70: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
cc80: 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   sz>iLimit ){.  
cc90: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
cca0: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
ccb0: 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74  ger->jfd, iLimit
ccc0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ccd0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
cce0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
ccf0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
cd00: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
cd10: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
cd20: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a  lled. A journal.
cd30: 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e  ** header (JOURN
cd40: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
cd50: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
cd60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
cd70: 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72  e at the.** curr
cd80: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  ent location..**
cd90: 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66  .** The format f
cda0: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  or the journal h
cdb0: 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c  eader is as foll
cdc0: 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65  ows:.** - 8 byte
cdd0: 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66  s: Magic identif
cde0: 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ying journal for
cdf0: 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  mat..** - 4 byte
ce00: 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  s: Number of rec
ce10: 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c  ords in journal,
ce20: 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d   or -1 no-sync m
ce30: 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20  ode is on..** - 
ce40: 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20  4 bytes: Random 
ce50: 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20  number used for 
ce60: 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20  page hash..** - 
ce70: 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c  4 bytes: Initial
ce80: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
ce90: 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  ount..** - 4 byt
cea0: 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20  es: Sector size 
ceb0: 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63  used by the proc
cec0: 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74  ess that wrote t
ced0: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  his journal..** 
cee0: 2d 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62  - 4 bytes: Datab
cef0: 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  ase page size..*
cf00: 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62  * .** Followed b
cf10: 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  y (JOURNAL_HDR_S
cf20: 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66  Z - 28) bytes of
cf30: 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a   unused space..*
cf40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
cf50: 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  teJournalHdr(Pag
cf60: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
cf70: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
cf80: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
cf90: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
cfa0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65  e */.  char *zHe
cfb0: 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ader = pPager->p
cfc0: 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54 65  TmpSpace;  /* Te
cfd0: 6d 70 6f 72 61 72 79 20 73 70 61 63 65 20 75 73  mporary space us
cfe0: 65 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61 64  ed to build head
cff0: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61  er */.  u32 nHea
d000: 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  der = pPager->pa
d010: 67 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 53  geSize;     /* S
d020: 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 6f  ize of buffer po
d030: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65 61  inted to by zHea
d040: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72  der */.  u32 nWr
d050: 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ite;            
d060: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d070: 42 79 74 65 73 20 6f 66 20 68 65 61 64 65 72 20  Bytes of header 
d080: 73 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20 2a  sector written *
d090: 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  /.  int ii;     
d0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0b0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
d0c0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  counter */..  as
d0d0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
d0e0: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20  ger->jfd) );    
d0f0: 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c    /* Journal fil
d100: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20  e must be open. 
d110: 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65  */..  if( nHeade
d120: 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r>JOURNAL_HDR_SZ
d130: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
d140: 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41  nHeader = JOURNA
d150: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
d160: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
d170: 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20  here are active 
d180: 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 61  savepoints and a
d190: 6e 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65 20  ny of them were 
d1a0: 63 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73 69  created .  ** si
d1b0: 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63  nce the most rec
d1c0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ent journal head
d1d0: 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20  er was written, 
d1e0: 75 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a 2a  update the .  **
d1f0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
d200: 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64  iHdrOffset field
d210: 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f  s now..  */.  fo
d220: 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
d230: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
d240: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50  i++){.    if( pP
d250: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
d260: 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d  [ii].iHdrOffset=
d270: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  =0 ){.      pPag
d280: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
d290: 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d 20  i].iHdrOffset = 
d2a0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d2b0: 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ff;.    }.  }.. 
d2c0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d2d0: 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
d2e0: 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e  urnalOff = journ
d2f0: 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67  alHdrOffset(pPag
d300: 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  er);..  /* .  **
d310: 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20   Write the nRec 
d320: 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62  Field - the numb
d330: 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72  er of page recor
d340: 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74  ds that follow t
d350: 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  his.  ** journal
d360: 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c   header. Normall
d370: 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74  y, zero is writt
d380: 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65  en to this value
d390: 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20   at this time.. 
d3a0: 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65   ** After the re
d3b0: 63 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20  cords are added 
d3c0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28  to the journal (
d3d0: 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
d3e0: 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66  synced, .  ** if
d3f0: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
d400: 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73  de), the zero is
d410: 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74   overwritten wit
d420: 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65  h the true numbe
d430: 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64  r.  ** of record
d440: 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e  s (see syncJourn
d450: 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  al())..  **.  **
d460: 20 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e   A faster altern
d470: 61 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74  ative is to writ
d480: 65 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20  e 0xFFFFFFFF to 
d490: 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20  the nRec field. 
d4a0: 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e  When.  ** readin
d4b0: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  g the journal th
d4c0: 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53  is value tells S
d4d0: 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20  QLite to assume 
d4e0: 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65  that the.  ** re
d4f0: 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  st of the journa
d500: 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  l file contains 
d510: 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
d520: 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74  ds. This assumpt
d530: 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67  ion.  ** is dang
d540: 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66  erous, as if a f
d550: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20  ailure occurred 
d560: 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74  whilst writing t
d570: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
d580: 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63  ** file it may c
d590: 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62  ontain some garb
d5a0: 61 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20  age data. There 
d5b0: 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f  are two scenario
d5c0: 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69  s.  ** where thi
d5d0: 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67  s risk can be ig
d5e0: 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nored:.  **.  **
d5f0: 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61     * When the pa
d600: 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e  ger is in no-syn
d610: 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69  c mode. Corrupti
d620: 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a  on can follow a.
d630: 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66    **     power f
d640: 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63  ailure in this c
d650: 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a  ase anyway..  **
d660: 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74  .  **   * When t
d670: 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  he SQLITE_IOCAP_
d680: 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67  SAFE_APPEND flag
d690: 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75   is set. This gu
d6a0: 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20  arantees.  **   
d6b0: 20 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64    that garbage d
d6c0: 61 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70  ata is never app
d6d0: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75  ended to the jou
d6e0: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  rnal file..  */.
d6f0: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
d700: 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
d710: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
d720: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
d730: 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67 65  noSync || (pPage
d740: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
d750: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
d760: 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20  E_MEMORY).   || 
d770: 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
d780: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
d790: 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49  pPager->fd)&SQLI
d7a0: 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
d7b0: 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20  PEND) .  ){.    
d7c0: 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
d7d0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
d7e0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
d7f0: 67 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33 32  gic));.    put32
d800: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
d810: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
d820: 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66  ic)], 0xffffffff
d830: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
d840: 6d 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c 20  memset(zHeader, 
d850: 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  0, sizeof(aJourn
d860: 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d  alMagic)+4);.  }
d870: 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f  ..  /* The rando
d880: 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69  m check-hash ini
d890: 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73  tialiser */ .  s
d8a0: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
d8b0: 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s(sizeof(pPager-
d8c0: 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50  >cksumInit), &pP
d8d0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
d8e0: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  ;.  put32bits(&z
d8f0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
d900: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c  ournalMagic)+4],
d910: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
d920: 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e  it);.  /* The in
d930: 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73  itial database s
d940: 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ize */.  put32bi
d950: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
d960: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
d970: 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62  )+8], pPager->db
d980: 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20  OrigSize);.  /* 
d990: 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  The assumed sect
d9a0: 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73  or size for this
d9b0: 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75   process */.  pu
d9c0: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
d9d0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
d9e0: 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67  Magic)+12], pPag
d9f0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b  er->sectorSize);
da00: 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ..  /* The page 
da10: 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62  size */.  put32b
da20: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
da30: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
da40: 63 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e  c)+16], pPager->
da50: 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a  pageSize);..  /*
da60: 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   Initializing th
da70: 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75  e tail of the bu
da80: 66 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65  ffer is not nece
da90: 73 73 61 72 79 2e 20 20 45 76 65 72 79 74 68 69  ssary.  Everythi
daa0: 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69  ng.  ** works fi
dab0: 6e 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  nd if the follow
dac0: 69 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20  ing memset() is 
dad0: 6f 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e  omitted.  But in
dae0: 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20  itializing.  ** 
daf0: 74 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65  the memory preve
db00: 6e 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f  nts valgrind fro
db10: 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73  m complaining, s
db20: 6f 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67  o we are willing
db30: 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68   to.  ** take th
db40: 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69  e performance hi
db50: 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  t..  */.  memset
db60: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
db70: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
db80: 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  20], 0,.        
db90: 20 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66   nHeader-(sizeof
dba0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
dbb0: 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74  20));..  /* In t
dbc0: 68 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c  heory, it is onl
dbd0: 79 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77  y necessary to w
dbe0: 72 69 74 65 20 74 68 65 20 32 38 20 62 79 74 65  rite the 28 byte
dbf0: 73 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a  s that the .  **
dc00: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
dc10: 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20  consumes to the 
dc20: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72  journal file her
dc30: 65 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e  e. Then incremen
dc40: 74 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65  t the .  ** Page
dc50: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72  r.journalOff var
dc60: 69 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c  iable by JOURNAL
dc70: 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20  _HDR_SZ so that 
dc80: 74 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72  the next .  ** r
dc90: 65 63 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e  ecord is written
dca0: 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
dcb0: 67 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e  g sector (leavin
dcc0: 67 20 61 20 67 61 70 20 69 6e 20 74 68 65 20 66  g a gap in the f
dcd0: 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69  ile.  ** that wi
dce0: 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79  ll be implicitly
dcf0: 20 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68   filled in by th
dd00: 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  e OS)..  **.  **
dd10: 20 48 6f 77 65 76 65 72 20 69 74 20 68 61 73 20   However it has 
dd20: 62 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20  been discovered 
dd30: 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73  that on some sys
dd40: 74 65 6d 73 20 74 68 69 73 20 70 61 74 74 65 72  tems this patter
dd50: 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73  n can .  ** be s
dd60: 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f  ignificantly slo
dd70: 77 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75  wer than contigu
dd80: 6f 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61  ously writing da
dd90: 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a  ta to the file,.
dda0: 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61    ** even if tha
ddb0: 74 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74  t means explicit
ddc0: 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20  ly writing data 
ddd0: 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20  to the block of 
dde0: 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48  .  ** (JOURNAL_H
ddf0: 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65  DR_SZ - 28) byte
de00: 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20  s that will not 
de10: 62 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74  be used. So that
de20: 20 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73   is what.  ** is
de30: 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a   done. .  **.  *
de40: 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65  * The loop is re
de50: 71 75 69 72 65 64 20 68 65 72 65 20 69 6e 20 63  quired here in c
de60: 61 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73  ase the sector-s
de70: 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  ize is larger th
de80: 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74  an the .  ** dat
de90: 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e  abase page size.
dea0: 20 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64   Since the zHead
deb0: 65 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c  er buffer is onl
dec0: 79 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  y Pager.pageSize
ded0: 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  .  ** bytes in s
dee0: 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ize, more than o
def0: 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ne call to sqlit
df00: 65 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20  e3OsWrite() may 
df10: 62 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a  be required.  **
df20: 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65   to populate the
df30: 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20   entire journal 
df40: 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20  header sector.. 
df50: 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74   */ .  for(nWrit
df60: 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e=0; rc==SQLITE_
df70: 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e  OK&&nWrite<JOURN
df80: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
df90: 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64  ); nWrite+=nHead
dfa0: 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  er){.    IOTRACE
dfb0: 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20  (("JHDR %p %lld 
dfc0: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
dfd0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
dfe0: 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20  r, nHeader)).   
dff0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
e000: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
e010: 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64  , zHeader, nHead
e020: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er, pPager->jour
e030: 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73 73  nalOff);.    ass
e040: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
e050: 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65  rnalHdr <= pPage
e060: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b  r->journalOff );
e070: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
e080: 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64  rnalOff += nHead
e090: 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  er;.  }..  retur
e0a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
e0b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
e0c0: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
e0d0: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
e0e0: 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  . A journal head
e0f0: 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52  er file.** (JOUR
e100: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
e110: 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  ) is read from t
e120: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
e130: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
e140: 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20  al.** file. The 
e150: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
e160: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
e170: 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79  file is given by
e180: 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  .** pPager->jour
e190: 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d  nalOff. See comm
e1a0: 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74  ents above funct
e1b0: 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  ion writeJournal
e1c0: 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64  Hdr() for.** a d
e1d0: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
e1e0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
e1f0: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49   format..**.** I
e200: 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20  f the header is 
e210: 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
e220: 79 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74  y, *pNRec is set
e230: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
e240: 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64  f.** page record
e250: 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  s following this
e260: 20 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62   header and *pDb
e270: 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  Size is set to t
e280: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  he size of the.*
e290: 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  * database befor
e2a0: 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
e2b0: 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65  n began, in page
e2c0: 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d  s. Also, pPager-
e2d0: 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73  >cksumInit.** is
e2e0: 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
e2f0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
e300: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
e310: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
e320: 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73  urned.** in this
e330: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   case..**.** If 
e340: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
e350: 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20  er file appears 
e360: 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c  to be corrupted,
e370: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a   SQLITE_DONE is.
e380: 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  ** returned and 
e390: 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53  *pNRec and *PDbS
e3a0: 69 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65  ize are undefine
e3b0: 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48  d.  If JOURNAL_H
e3c0: 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63  DR_SZ bytes.** c
e3d0: 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72  annot be read fr
e3e0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
e3f0: 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ile an error cod
e400: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
e410: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
e420: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50  dJournalHdr(.  P
e430: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
e440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
e450: 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
e460: 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69 36   int isHot,.  i6
e470: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20  4 journalSize,  
e480: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
e490: 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a  ze of the open j
e4a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
e4b0: 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70  ytes */.  u32 *p
e4c0: 4e 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 20  NRec,           
e4d0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
e4e0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
e4f0: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f  he nRec field */
e500: 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20  .  u32 *pDbSize 
e510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e520: 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66  /* OUT: Value of
e530: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
e540: 73 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f  se size field */
e550: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
e560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e570: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
e580: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
e590: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
e5a0: 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20      /* A buffer 
e5b0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69  to hold the magi
e5c0: 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36  c header */.  i6
e5d0: 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
e5e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
e5f0: 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  fset of journal 
e600: 68 65 61 64 65 72 20 62 65 69 6e 67 20 72 65 61  header being rea
e610: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
e620: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
e630: 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a  fd) );      /* J
e640: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
e650: 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20   be open. */..  
e660: 2f 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65 72  /* Advance Pager
e670: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74  .journalOff to t
e680: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
e690: 6e 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20  next sector. If 
e6a0: 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  the.  ** journal
e6b0: 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61   file is too sma
e6c0: 6c 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20  ll for there to 
e6d0: 62 65 20 61 20 68 65 61 64 65 72 20 73 74 6f 72  be a header stor
e6e0: 65 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20  ed at this.  ** 
e6f0: 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51  point, return SQ
e700: 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a  LITE_DONE..  */.
e710: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
e720: 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
e730: 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
e740: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
e750: 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41  ournalOff+JOURNA
e760: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
e770: 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29   > journalSize )
e780: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
e790: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
e7a0: 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  iHdrOff = pPager
e7b0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
e7c0: 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20   /* Read in the 
e7d0: 66 69 72 73 74 20 38 20 62 79 74 65 73 20 6f 66  first 8 bytes of
e7e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
e7f0: 64 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20  der. If they do 
e800: 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74  not match.  ** t
e810: 68 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67  he  magic string
e820: 20 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74   found at the st
e830: 61 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72  art of each jour
e840: 6e 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75  nal header, retu
e850: 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44  rn.  ** SQLITE_D
e860: 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ONE. If an IO er
e870: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
e880: 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
e890: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a  . Otherwise,.  *
e8a0: 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a  * proceed..  */.
e8b0: 20 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20 69    if( isHot || i
e8c0: 48 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e  HdrOff!=pPager->
e8d0: 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20  journalHdr ){.  
e8e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
e8f0: 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
e900: 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  , aMagic, sizeof
e910: 28 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66  (aMagic), iHdrOf
e920: 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  f);.    if( rc )
e930: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
e940: 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
e950: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
e960: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
e970: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d  izeof(aMagic))!=
e980: 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
e990: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
e9a0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
e9b0: 65 61 64 20 74 68 65 20 66 69 72 73 74 20 74 68  ead the first th
e9c0: 72 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64  ree 32-bit field
e9d0: 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
e9e0: 20 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65   header: The nRe
e9f0: 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68  c.  ** field, th
ea00: 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69  e checksum-initi
ea10: 61 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64  alizer and the d
ea20: 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 74 20  atabase size at 
ea30: 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f  the start.  ** o
ea40: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
ea50: 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  n. Return an err
ea60: 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
ea70: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
ea80: 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54    */.  if( SQLIT
ea90: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
eaa0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
eab0: 66 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70  fd, iHdrOff+8, p
eac0: 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c  NRec)).   || SQL
ead0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
eae0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
eaf0: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32  >jfd, iHdrOff+12
eb00: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
eb10: 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c  Init)).   || SQL
eb20: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
eb30: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
eb40: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36  >jfd, iHdrOff+16
eb50: 2c 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b  , pDbSize)).  ){
eb60: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
eb70: 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
eb80: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
eb90: 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67   ){.    u32 iPag
eba0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
ebb0: 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a       /* Page-siz
ebc0: 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e  e field of journ
ebd0: 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20  al header */.   
ebe0: 20 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65   u32 iSectorSize
ebf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
ec00: 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65   Sector-size fie
ec10: 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  ld of journal he
ec20: 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 31 36 20  ader */.    u16 
ec30: 69 50 61 67 65 53 69 7a 65 31 36 3b 20 20 20 20  iPageSize16;    
ec40: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79           /* Copy
ec50: 20 6f 66 20 69 50 61 67 65 53 69 7a 65 20 69 6e   of iPageSize in
ec60: 20 31 36 2d 62 69 74 20 76 61 72 69 61 62 6c 65   16-bit variable
ec70: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64   */..    /* Read
ec80: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
ec90: 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a  nd sector-size j
eca0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
ecb0: 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  elds. */.    if(
ecc0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
ecd0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
ece0: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
ecf0: 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69  f+20, &iSectorSi
ed00: 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c  ze)).     || SQL
ed10: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
ed20: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
ed30: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34  >jfd, iHdrOff+24
ed40: 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20  , &iPageSize)). 
ed50: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
ed60: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
ed70: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
ed80: 74 68 65 20 76 61 6c 75 65 73 20 72 65 61 64 20  the values read 
ed90: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d 73 69  from the page-si
eda0: 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69  ze and sector-si
edb0: 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a  ze fields.    **
edc0: 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67   are within rang
edd0: 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72 61 6e  e. To be 'in ran
ede0: 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75 65 73  ge', both values
edf0: 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20 70 6f   need to be a po
ee00: 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77  wer.    ** of tw
ee10: 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  o greater than o
ee20: 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32 20 6f  r equal to 512 o
ee30: 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72  r 32, and not gr
ee40: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 69 72  eater than their
ee50: 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65 63 74   .    ** respect
ee60: 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  ive compile time
ee70: 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e   maximum limits.
ee80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
ee90: 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20 20 20  iPageSize<512   
eea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
eeb0: 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c 33 32  | iSectorSize<32
eec0: 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65 53 69  .     || iPageSi
eed0: 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
eee0: 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63 74  GE_SIZE || iSect
eef0: 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f  orSize>MAX_SECTO
ef00: 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20 28  R_SIZE.     || (
ef10: 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26 69 50  (iPageSize-1)&iP
ef20: 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20 7c 7c  ageSize)!=0   ||
ef30: 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65 2d 31   ((iSectorSize-1
ef40: 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29 21 3d  )&iSectorSize)!=
ef50: 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0 .    ){.      
ef60: 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68 65 72  /* If the either
ef70: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f   the page-size o
ef80: 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e  r sector-size in
ef90: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61   the journal-hea
efa0: 64 65 72 20 69 73 20 0a 20 20 20 20 20 20 2a 2a  der is .      **
efb0: 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20 74   invalid, then t
efc0: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
efd0: 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  wrote the journa
efe0: 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20 68 61  l-header must ha
eff0: 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 72 61  ve .      ** cra
f000: 73 68 65 64 20 62 65 66 6f 72 65 20 74 68 65 20  shed before the 
f010: 68 65 61 64 65 72 20 77 61 73 20 73 79 6e 63 65  header was synce
f020: 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
f030: 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a 20 20  stop reading .  
f040: 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
f050: 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20  al file here..  
f060: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
f070: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
f080: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
f090: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 2d 73  pdate the page-s
f0a0: 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ize to match the
f0b0: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
f0c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20   the journal. . 
f0d0: 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65 73 74     ** Use a test
f0e0: 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74 6f 20  case() macro to 
f0f0: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 6d  make sure that m
f100: 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 77 69  alloc failure wi
f110: 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61 67  thin .    ** Pag
f120: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20  erSetPagesize() 
f130: 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20 20 2a  is tested..    *
f140: 2f 0a 20 20 20 20 69 50 61 67 65 53 69 7a 65 31  /.    iPageSize1
f150: 36 20 3d 20 28 75 31 36 29 69 50 61 67 65 53 69  6 = (u16)iPageSi
f160: 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ze;.    rc = sql
f170: 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
f180: 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69 50  size(pPager, &iP
f190: 61 67 65 53 69 7a 65 31 36 2c 20 2d 31 29 3b 0a  ageSize16, -1);.
f1a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
f1b0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
f1c0: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
f1d0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 50 61 67  QLITE_OK || iPag
f1e0: 65 53 69 7a 65 31 36 3d 3d 28 75 31 36 29 69 50  eSize16==(u16)iP
f1f0: 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20  ageSize );..    
f200: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 73  /* Update the as
f210: 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a  sumed sector-siz
f220: 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76  e to match the v
f230: 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20 20  alue used by .  
f240: 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73    ** the process
f250: 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68   that created th
f260: 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74  is journal. If t
f270: 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a  his journal was.
f280: 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62      ** created b
f290: 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65  y a process othe
f2a0: 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c  r than this one,
f2b0: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
f2c0: 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 65 69  ne.    ** is bei
f2d0: 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  ng called from w
f2e0: 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79  ithin pager_play
f2f0: 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61  back(). The loca
f300: 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f  l value.    ** o
f310: 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  f Pager.sectorSi
f320: 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61  ze is restored a
f330: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61  t the end of tha
f340: 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a  t routine..    *
f350: 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
f360: 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65 63 74  ctorSize = iSect
f370: 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70  orSize;.  }..  p
f380: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f390: 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  f += JOURNAL_HDR
f3a0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72  _SZ(pPager);.  r
f3b0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
f3c0: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75  .** Write the su
f3d0: 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f  pplied master jo
f3e0: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20  urnal name into 
f3f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
f400: 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50   for pager.** pP
f410: 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72  ager at the curr
f420: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68  ent location. Th
f430: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
f440: 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68   name must be th
f450: 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20  e last.** thing 
f460: 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75  written to a jou
f470: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
f480: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75  e pager is in fu
f490: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68  ll-sync mode, th
f4a0: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
f4b0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
f4c0: 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20  advanced to the 
f4d0: 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e  next sector boun
f4e0: 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61  dary before.** a
f4f0: 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74  nything is writt
f500: 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69  en. The format i
f510: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62  s:.**.**   + 4 b
f520: 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50  ytes: PAGER_MJ_P
f530: 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79  GNO..**   + N by
f540: 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72  tes: Master jour
f550: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20  nal filename in 
f560: 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20  utf-8..**   + 4 
f570: 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68  bytes: N (length
f580: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
f590: 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73  al name in bytes
f5a0: 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  , no nul-termina
f5b0: 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62  tor)..**   + 4 b
f5c0: 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75  ytes: Master jou
f5d0: 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73  rnal name checks
f5e0: 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74  um..**   + 8 byt
f5f0: 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  es: aJournalMagi
f600: 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  c[]..**.** The m
f610: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61  aster journal pa
f620: 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74  ge checksum is t
f630: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79  he sum of the by
f640: 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65  tes in the maste
f650: 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  r.** journal nam
f660: 65 2c 20 77 68 65 72 65 20 65 61 63 68 20 62 79  e, where each by
f670: 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  te is interprete
f680: 64 20 61 73 20 61 20 73 69 67 6e 65 64 20 38 2d  d as a signed 8-
f690: 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a  bit integer..**.
f6a0: 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73  ** If zMaster is
f6b0: 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
f6c0: 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73 69  (occurs for a si
f6d0: 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
f6e0: 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20  ansaction), .** 
f6f0: 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  this call is a n
f700: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
f710: 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a  int writeMasterJ
f720: 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
f730: 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
f740: 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
f750: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
f760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f770: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
f780: 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20  .  int nMaster; 
f790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7a0: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
f7b0: 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20   string zMaster 
f7c0: 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66  */.  i64 iHdrOff
f7d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f7e0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
f7f0: 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a 6f 75  of header in jou
f800: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
f810: 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20  64 jrnlSize;    
f820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f830: 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e  /* Size of journ
f840: 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  al file on disk 
f850: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  */.  u32 cksum =
f860: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
f870: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
f880: 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73  m of string zMas
f890: 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
f8a0: 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  ( pPager->setMas
f8b0: 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ter==0 );.  asse
f8c0: 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
f8d0: 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69  (pPager) );..  i
f8e0: 66 28 20 21 7a 4d 61 73 74 65 72 20 0a 20 20 20  f( !zMaster .   
f8f0: 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
f900: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
f910: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
f920: 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e   .   || pPager->
f930: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
f940: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
f950: 46 46 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  FF .  ){.    ret
f960: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
f970: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74   }.  pPager->set
f980: 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73  Master = 1;.  as
f990: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
f9a0: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61  ger->jfd) );.  a
f9b0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
f9c0: 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61  ournalHdr <= pPa
f9d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
f9e0: 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61  );..  /* Calcula
f9f0: 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e  te the length in
fa00: 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63   bytes and the c
fa10: 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74  hecksum of zMast
fa20: 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73  er */.  for(nMas
fa30: 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e  ter=0; zMaster[n
fa40: 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72  Master]; nMaster
fa50: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
fa60: 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  = zMaster[nMaste
fa70: 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r];.  }..  /* If
fa80: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
fa90: 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
faa0: 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
fab0: 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
fac0: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
fad0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
fae0: 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
faf0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
fb00: 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
fb10: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
fb20: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
fb30: 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
fb40: 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
fb50: 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
fb60: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
fb70: 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
fb80: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
fb90: 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  iHdrOff = pPager
fba0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
fbb0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61   /* Write the ma
fbc0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74  ster journal dat
fbd0: 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  a to the end of 
fbe0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
fbf0: 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72  . If.  ** an err
fc00: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
fc10: 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
fc20: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
fc30: 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d    */.  if( (0 !=
fc40: 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
fc50: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
fc60: 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d  iHdrOff, PAGER_M
fc70: 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29  J_PGNO(pPager)))
fc80: 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
fc90: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
fca0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
fcb0: 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  zMaster, nMaster
fcc0: 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20  , iHdrOff+4))). 
fcd0: 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
fce0: 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
fcf0: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
fd00: 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61  f+4+nMaster, nMa
fd10: 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30  ster))).   || (0
fd20: 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33   != (rc = write3
fd30: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fd40: 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  d, iHdrOff+4+nMa
fd50: 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29  ster+4, cksum)))
fd60: 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
fd70: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
fd80: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  e(pPager->jfd, a
fd90: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c  JournalMagic, 8,
fda0: 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
fdb0: 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20  er+8))).  ){.   
fdc0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
fdd0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
fde0: 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72  lOff += (nMaster
fdf0: 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  +20);..  /* If t
fe00: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 70  he pager is in p
fe10: 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c  eristent-journal
fe20: 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
fe30: 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a  physical .  ** j
fe40: 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20  ournal-file may 
fe50: 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65 20  extend past the 
fe60: 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65  end of the maste
fe70: 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20  r-journal name. 
fe80: 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20   ** and 8 bytes 
fe90: 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75  of magic data ju
fea0: 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  st written to th
feb0: 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  e file. This is 
fec0: 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20  .  ** dangerous 
fed0: 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64 65  because the code
fee0: 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68   to rollback a h
fef0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  ot-journal file.
ff00: 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65    ** will not be
ff10: 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68   able to find th
ff20: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
ff30: 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
ff40: 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72  ne .  ** whether
ff50: 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
ff60: 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a  nal is hot. .  *
ff70: 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74  *.  ** Easiest t
ff80: 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68  hing to do in th
ff90: 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74  is scenario is t
ffa0: 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a  o truncate the j
ffb0: 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c  ournal .  ** fil
ffc0: 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72 65  e to the require
ffd0: 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20  d size..  */ .  
ffe0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28  if( SQLITE_OK==(
fff0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
10000 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
10010 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a  fd, &jrnlSize)).
10020 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70     && jrnlSize>p
10030 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10040 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  f.  ){.    rc = 
10050 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
10060 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  e(pPager->jfd, p
10070 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10080 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
10090 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69   rc;.}../*.** Fi
100a0 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
100b0 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65   hash table give
100c0 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65  n its page numbe
100d0 72 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  r. Return.** a p
100e0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
100f0 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68  ge or NULL if th
10100 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
10110 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65   is not .** alre
10120 61 64 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a  ady in memory..*
10130 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
10140 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67  pager_lookup(Pag
10150 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
10160 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
10170 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
10180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10190 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
101a0 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70    /* It is not p
101b0 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 63 61  ossible for a ca
101c0 6c 6c 20 74 6f 20 50 63 61 63 68 65 46 65 74 63  ll to PcacheFetc
101d0 68 28 29 20 77 69 74 68 20 63 72 65 61 74 65 46  h() with createF
101e0 6c 61 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20 66  lag==0 to.  ** f
101f0 61 69 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61 74  ail, since no at
10200 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74  tempt to allocat
10210 65 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79  e dynamic memory
10220 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a 20   will be made.. 
10230 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69   */.  (void)sqli
10240 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
10250 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
10260 70 67 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20  pgno, 0, &p);.  
10270 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
10280 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 65  ** Discard the e
10290 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
102a0 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  f the in-memory 
102b0 70 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73  page-cache..*/.s
102c0 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
102d0 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50  _reset(Pager *pP
102e0 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ager){.  sqlite3
102f0 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50  BackupRestart(pP
10300 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a  ager->pBackup);.
10310 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
10320 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43  lear(pPager->pPC
10330 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ache);.}../*.** 
10340 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75  Free all structu
10350 72 65 73 20 69 6e 20 74 68 65 20 50 61 67 65 72  res in the Pager
10360 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72  .aSavepoint[] ar
10370 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68  ray and set both
10380 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70  .** Pager.aSavep
10390 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e  oint and Pager.n
103a0 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72  Savepoint to zer
103b0 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62  o. Close the sub
103c0 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69  -journal.** if i
103d0 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  t is open and th
103e0 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
103f0 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
10400 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10410 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
10420 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61  oints(Pager *pPa
10430 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20  ger){.  int ii; 
10440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10450 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f   Iterator for lo
10460 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61  oping through Pa
10470 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a  ger.aSavepoint *
10480 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
10490 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
104a0 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
104b0 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
104c0 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61  troy(pPager->aSa
104d0 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53  vepoint[ii].pInS
104e0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20  avepoint);.  }. 
104f0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
10500 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73  clusiveMode || s
10510 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e  qlite3IsMemJourn
10520 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  al(pPager->sjfd)
10530 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
10540 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73  sClose(pPager->s
10550 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  jfd);.  }.  sqli
10560 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
10570 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  >aSavepoint);.  
10580 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
10590 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nt = 0;.  pPager
105a0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->nSavepoint = 0
105b0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62  ;.  pPager->nSub
105c0 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Rec = 0;.}../*.*
105d0 2a 20 53 65 74 20 74 68 65 20 62 69 74 20 6e 75  * Set the bit nu
105e0 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65  mber pgno in the
105f0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
10600 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a  pInSavepoint .**
10610 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20   bitvecs of all 
10620 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
10630 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
10640 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a  K if successful.
10650 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d  ** or SQLITE_NOM
10660 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  EM if a malloc f
10670 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a  ailure occurs..*
10680 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64  /.static int add
10690 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
106a0 63 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  cs(Pager *pPager
106b0 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
106c0 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
106d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
106e0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
106f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
10700 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75  K;       /* Resu
10710 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f  lt code */..  fo
10720 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
10730 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
10740 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53  i++){.    PagerS
10750 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70  avepoint *p = &p
10760 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
10770 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  t[ii];.    if( p
10780 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b  gno<=p->nOrig ){
10790 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c  .      rc |= sql
107a0 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 2d  ite3BitvecSet(p-
107b0 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70  >pInSavepoint, p
107c0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74  gno);.      test
107d0 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
107e0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
107f0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
10800 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
10810 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
10820 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
10830 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  rc;.}../*.** Unl
10840 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
10850 20 66 69 6c 65 2e 20 54 68 69 73 20 66 75 6e 63   file. This func
10860 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
10870 69 66 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  if the pager.** 
10880 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  is in exclusive 
10890 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  mode..**.** If t
108a0 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72 72  he pager is curr
108b0 65 6e 74 6c 79 20 69 6e 20 65 72 72 6f 72 20 73  ently in error s
108c0 74 61 74 65 2c 20 64 69 73 63 61 72 64 20 74 68  tate, discard th
108d0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 0a 2a  e contents of .*
108e0 2a 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20  * the cache and 
108f0 72 65 73 65 74 20 74 68 65 20 50 61 67 65 72 20  reset the Pager 
10900 73 74 72 75 63 74 75 72 65 20 69 6e 74 65 72 6e  structure intern
10910 61 6c 20 73 74 61 74 65 2e 20 49 66 20 74 68 65  al state. If the
10920 72 65 20 69 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e  re is.** an open
10930 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c 20 74   journal-file, t
10940 68 65 6e 20 74 68 65 20 6e 65 78 74 20 74 69 6d  hen the next tim
10950 65 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  e a shared-lock 
10960 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 6f  is obtained.** o
10970 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
10980 20 28 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79   (by this or any
10990 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 29 2c   other process),
109a0 20 69 74 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 74   it will be.** t
109b0 72 65 61 74 65 64 20 61 73 20 61 20 68 6f 74 2d  reated as a hot-
109c0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c  journal and roll
109d0 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  ed back..*/.stat
109e0 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e  ic void pager_un
109f0 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
10a00 65 72 29 7b 0a 0a 20 20 73 71 6c 69 74 65 33 42  er){..  sqlite3B
10a10 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
10a20 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
10a30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ;.  pPager->pInJ
10a40 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65  ournal = 0;.  re
10a50 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
10a60 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69  ts(pPager);..  i
10a70 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
10a80 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
10a90 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
10aa0 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
10ab0 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52    sqlite3WalEndR
10ac0 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
10ad0 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20  Pager->pWal);.  
10ae0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
10af0 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
10b00 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
10b10 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
10b20 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  e ){.    int rc;
10b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b40 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
10b50 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62 79  code returned by
10b60 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29   pagerUnlockDb()
10b70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20   */.    int iDc 
10b80 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  = isOpen(pPager-
10b90 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65  >fd)?sqlite3OsDe
10ba0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
10bb0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a  ics(pPager->fd):
10bc0 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  0;..    /* If th
10bd0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
10be0 65 6d 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74  em support delet
10bf0 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65  ion of open file
10c00 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63  s, then.    ** c
10c10 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
10c20 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70   file when dropp
10c30 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
10c40 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73   lock.  Otherwis
10c50 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72  e.    ** another
10c60 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
10c70 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65   journal_mode=de
10c80 6c 65 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74  lete might delet
10c90 65 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  e the file.    *
10ca0 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  * out from under
10cb0 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   us..    */.    
10cc0 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
10cd0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
10ce0 59 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20  Y   & 5)!=1 );. 
10cf0 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
10d00 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
10d10 46 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29  F      & 5)!=1 )
10d20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
10d30 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
10d40 5f 57 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d  _WAL      & 5)!=
10d50 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
10d60 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
10d70 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35  ODE_DELETE   & 5
10d80 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
10d90 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
10da0 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
10db0 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)==1 );.    a
10dc0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
10dd0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
10de0 54 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  T  & 5)==1 );.  
10df0 20 20 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20    if( 0==(iDc & 
10e00 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
10e10 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
10e20 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28  EN).     || 1!=(
10e30 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
10e40 6f 64 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a  ode & 5).    ){.
10e50 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
10e60 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
10e70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
10e80 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
10e90 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
10ea0 61 74 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ate and the call
10eb0 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64   to unlock the d
10ec0 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
10ed0 69 6c 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74  ile fails, set t
10ee0 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20  he current lock 
10ef0 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
10f00 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
10f10 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68  .    ** above th
10f20 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e  e #define for UN
10f30 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
10f40 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
10f50 20 77 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a   why this.    **
10f60 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   is necessary.. 
10f70 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
10f80 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
10f90 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  ger, NO_LOCK);. 
10fa0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10fb0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
10fc0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
10fd0 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ROR ){.      pPa
10fe0 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b  ger->eLock = UNK
10ff0 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  NOWN_LOCK;.    }
11000 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ..    /* The pag
11010 65 72 20 73 74 61 74 65 20 6d 61 79 20 62 65 20  er state may be 
11020 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47  changed from PAG
11030 45 52 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45  ER_ERROR to PAGE
11040 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20  R_OPEN here.    
11050 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72  ** without clear
11060 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f  ing the error co
11070 64 65 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65  de. This is inte
11080 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72  ntional - the er
11090 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20  ror.    ** code 
110a0 69 73 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74  is cleared and t
110b0 68 65 20 63 61 63 68 65 20 72 65 73 65 74 20 69  he cache reset i
110c0 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f  n the block belo
110d0 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  w..    */.    as
110e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
110f0 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  rCode || pPager-
11100 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
11110 52 52 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67  RROR );.    pPag
11120 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
11130 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  one = 0;.    pPa
11140 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
11150 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20  GER_OPEN;.  }.. 
11160 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72   /* If Pager.err
11170 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65  Code is set, the
11180 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
11190 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e   pager cache can
111a0 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73  not be.  ** trus
111b0 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68  ted. Now that th
111c0 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
111d0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
111e0 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a  s to the pager,.
111f0 20 20 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65    ** it can safe
11200 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20  ly move back to 
11210 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
11220 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  . This happens i
11230 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d  n both.  ** norm
11240 61 6c 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  al and exclusive
11250 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20  -locking mode.. 
11260 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
11270 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 21 4d 45  ->errCode && !ME
11280 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72  MDB ){.    pager
11290 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
112a0 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
112b0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
112c0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
112d0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
112e0 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
112f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
11300 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  Code = SQLITE_OK
11310 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  ;.  }..  pPager-
11320 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
11330 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
11340 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61  alHdr = 0;.  pPa
11350 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
11360 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
11370 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
11380 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e  d be called when
11390 20 61 6e 20 49 4f 45 52 52 2c 20 43 4f 52 52 55   an IOERR, CORRU
113a0 50 54 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72  PT or FULL error
113b0 0a 2a 2a 20 6d 61 79 20 68 61 76 65 20 6f 63 63  .** may have occ
113c0 75 72 72 65 64 2e 20 54 68 65 20 66 69 72 73 74  urred. The first
113d0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
113e0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
113f0 67 65 72 20 0a 2a 2a 20 73 74 72 75 63 74 75 72  ger .** structur
11400 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 74 68  e, the second th
11410 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f  e error-code abo
11420 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ut to be returne
11430 64 20 62 79 20 61 20 70 61 67 65 72 20 0a 2a 2a  d by a pager .**
11440 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54   API function. T
11450 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
11460 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  d is a copy of t
11470 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
11480 6e 74 20 0a 2a 2a 20 74 6f 20 74 68 69 73 20 66  nt .** to this f
11490 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  unction. .**.** 
114a0 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
114b0 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45  gument is SQLITE
114c0 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43  _IOERR, SQLITE_C
114d0 4f 52 52 55 50 54 2c 20 6f 72 20 53 51 4c 49 54  ORRUPT, or SQLIT
114e0 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72  E_FULL.** the er
114f0 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73  ror becomes pers
11500 69 73 74 65 6e 74 2e 20 55 6e 74 69 6c 20 74 68  istent. Until th
11510 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72  e persistent err
11520 6f 72 20 69 73 20 63 6c 65 61 72 65 64 2c 0a 2a  or is cleared,.*
11530 2a 20 73 75 62 73 65 71 75 65 6e 74 20 41 50 49  * subsequent API
11540 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50   calls on this P
11550 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69  ager will immedi
11560 61 74 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65  ately return the
11570 20 73 61 6d 65 20 0a 2a 2a 20 65 72 72 6f 72 20   same .** error 
11580 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 65  code..**.** A pe
11590 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 69  rsistent error i
115a0 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
115b0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
115c0 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a  e pager-cache .*
115d0 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73  * cannot be trus
115e0 74 65 64 2e 20 54 68 69 73 20 73 74 61 74 65 20  ted. This state 
115f0 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62  can be cleared b
11600 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73  y completely dis
11610 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20  carding .** the 
11620 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
11630 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20  pager-cache. If 
11640 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
11650 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a  s active when.**
11660 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
11670 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20  error occurred, 
11680 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  then the rollbac
11690 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65  k journal may ne
116a0 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c  ed.** to be repl
116b0 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20  ayed to restore 
116c0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
116d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
116e0 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77  e (as if.** it w
116f0 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ere a hot-journa
11700 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  l)..*/.static in
11710 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61  t pager_error(Pa
11720 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
11730 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20   rc){.  int rc2 
11740 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61  = rc & 0xff;.  a
11750 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
11760 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29  E_OK || !MEMDB )
11770 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20  ;.  assert(.    
11780 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
11790 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de==SQLITE_FULL 
117a0 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  ||.       pPager
117b0 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
117c0 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28  E_OK ||.       (
117d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
117e0 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  & 0xff)==SQLITE_
117f0 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28  IOERR.  );.  if(
11800 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   rc2==SQLITE_FUL
11810 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45  L || rc2==SQLITE
11820 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50  _IOERR ){.    pP
11830 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
11840 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rc;.    pPager->
11850 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  eState = PAGER_E
11860 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
11870 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11880 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64  This routine end
11890 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  s a transaction.
118a0 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   A transaction i
118b0 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64 20  s usually ended 
118c0 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20  by .** either a 
118d0 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c  COMMIT or a ROLL
118e0 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20  BACK operation. 
118f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79  This routine may
11900 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61   be called .** a
11910 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  fter rollback of
11920 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20   a hot-journal, 
11930 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  or if an error o
11940 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e  ccurs while open
11950 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ing.** the journ
11960 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74 69  al file or writi
11970 6e 67 20 74 68 65 20 76 65 72 79 20 66 69 72 73  ng the very firs
11980 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  t journal-header
11990 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61 73   of a.** databas
119a0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
119b0 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
119c0 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
119d0 65 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f  ed in PAGER_ERRO
119e0 52 20 73 74 61 74 65 2e 20 49 66 20 69 74 20 69  R state. If it i
119f0 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50  s called.** in P
11a00 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47  AGER_NONE or PAG
11a10 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 20  ER_SHARED state 
11a20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c  and the lock hel
11a30 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63  d is less.** exc
11a40 6c 75 73 69 76 65 20 74 68 61 6e 20 61 20 52 45  lusive than a RE
11a50 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20  SERVED lock, it 
11a60 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
11a70 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79  * Otherwise, any
11a80 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
11a90 74 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e  ts are released.
11aa0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
11ab0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
11ac0 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22  en, then it is "
11ad0 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65  finalized". Once
11ae0 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66   a journal .** f
11af0 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e  ile has been fin
11b00 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74  alized it is not
11b10 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
11b20 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b   it to roll back
11b30 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69   a .** transacti
11b40 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20  on. Nor will it 
11b50 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  be considered to
11b60 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   be a hot-journa
11b70 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20  l by this.** or 
11b80 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62 61  any other databa
11b90 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45  se connection. E
11ba0 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75  xactly how a jou
11bb0 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65  rnal is finalize
11bc0 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20  d.** depends on 
11bd0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
11be0 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
11bf0 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
11c00 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65   mode and.** the
11c10 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c   current journal
11c20 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75  -mode (Pager.jou
11c30 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c  rnalMode value),
11c40 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
11c50 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
11c60 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20  ==MEMORY.**     
11c70 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  Journal file des
11c80 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c  criptor is simpl
11c90 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64  y closed. This d
11ca0 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20  estroys an .**  
11cb0 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75     in-memory jou
11cc0 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  rnal..**.**   jo
11cd0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43  urnalMode==TRUNC
11ce0 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ATE.**     Journ
11cf0 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  al file is trunc
11d00 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74  ated to zero byt
11d10 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
11d20 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
11d30 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20  =PERSIST.**     
11d40 54 68 65 20 66 69 72 73 74 20 32 38 20 62 79 74  The first 28 byt
11d50 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  es of the journa
11d60 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65  l file are zeroe
11d70 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61  d. This invalida
11d80 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  tes.**     the f
11d90 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
11da0 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c  der in the file,
11db0 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65   and hence the e
11dc0 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ntire journal.**
11dd0 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e       file. An in
11de0 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69  valid journal fi
11df0 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c  le cannot be rol
11e00 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
11e10 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44    journalMode==D
11e20 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65  ELETE.**     The
11e30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
11e40 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65   closed and dele
11e50 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ted using sqlite
11e60 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a  3OsDelete()..**.
11e70 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70 61  **     If the pa
11e80 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
11e90 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
11ea0 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66  , this method of
11eb0 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20   finalizing.**  
11ec0 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66     the journal f
11ed0 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73 65  ile is never use
11ee0 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74  d. Instead, if t
11ef0 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69  he journalMode i
11f00 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20  s.**     DELETE 
11f10 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
11f20 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
11f30 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64  de, the method d
11f40 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a  escribed under.*
11f50 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  *     journalMod
11f60 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75 73  e==PERSIST is us
11f70 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
11f80 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72  * After the jour
11f90 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  nal is finalized
11fa0 2c 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76 65  , the pager move
11fb0 73 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45  s to PAGER_READE
11fc0 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72  R state..** If r
11fd0 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78  unning in non-ex
11fe0 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b  clusive rollback
11ff0 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20   mode, the lock 
12000 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 0a  on the file is .
12010 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f  ** downgraded to
12020 20 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a   a SHARED_LOCK..
12030 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
12040 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
12050 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  o error occurs. 
12060 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
12070 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79  rs during.** any
12080 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61   of the IO opera
12090 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a  tions to finaliz
120a0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
120b0 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65  le or unlock the
120c0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68 65  .** database the
120d0 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
120e0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
120f0 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66 20  to the user. If 
12100 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  the .** operatio
12110 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  n to finalize th
12120 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
12130 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ails, then the c
12140 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69  ode still.** tri
12150 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65  es to unlock the
12160 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
12170 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  f not in exclusi
12180 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a  ve mode. If the.
12190 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74  ** unlock operat
121a0 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c  ion fails as wel
121b0 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  l, then the firs
121c0 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c  t error code rel
121d0 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66  ated.** to the f
121e0 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75  irst error encou
121f0 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72  ntered (the jour
12200 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e  nal finalization
12210 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75   one) is.** retu
12220 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
12230 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  int pager_end_tr
12240 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
12250 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73  *pPager, int has
12260 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
12270 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
12280 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
12290 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66  e from journal f
122a0 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72  inalization oper
122b0 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ation */.  int r
122c0 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  c2 = SQLITE_OK; 
122d0 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
122e0 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75  e from db file u
122f0 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
12300 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68  */..  /* Do noth
12310 69 6e 67 20 69 66 20 74 68 65 20 70 61 67 65 72  ing if the pager
12320 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
12330 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
12340 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72  nsaction.  ** or
12350 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
12360 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73 20  RVED lock. This 
12370 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
12380 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  called when ther
12390 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72 69  e.  ** is no wri
123a0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  te-transaction a
123b0 63 74 69 76 65 20 62 75 74 20 61 20 52 45 53 45  ctive but a RESE
123c0 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  RVED or greater 
123d0 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65 6c  lock is.  ** hel
123e0 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72 63  d under two circ
123f0 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a  umstances:.  **.
12400 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72 20    **   1. After 
12410 61 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f 74  a successful hot
12420 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
12430 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64 20  k, it is called 
12440 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20 65  with.  **      e
12450 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e  State==PAGER_NON
12460 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43  E and eLock==EXC
12470 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a  LUSIVE_LOCK..  *
12480 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20 61  *.  **   2. If a
12490 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
124a0 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
124b0 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67 20  clusive holding 
124c0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20  an EXCLUSIVE .  
124d0 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77 69  **      lock swi
124e0 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f  tches back to lo
124f0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
12500 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63 75  l and then execu
12510 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20 20  tes a.  **      
12520 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
12530 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
12540 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65  is called with e
12550 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
12560 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20 61  DER .  **      a
12570 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  nd eLock==EXCLUS
12580 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68  IVE_LOCK when th
12590 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
125a0 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20  on is closed..  
125b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  */.  assert( ass
125c0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
125d0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
125e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
125f0 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
12600 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
12610 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 57  ->eState<PAGER_W
12620 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26 20  RITER_LOCKED && 
12630 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45  pPager->eLock<RE
12640 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SERVED_LOCK ){. 
12650 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12660 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65  _OK;.  }..  rele
12670 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
12680 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65  (pPager);.  asse
12690 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
126a0 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  r->jfd) || pPage
126b0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
126c0 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e   );.  if( isOpen
126d0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
126e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61  .    assert( !pa
126f0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
12700 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  ) );..    /* Fin
12710 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
12720 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  l file. */.    i
12730 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a  f( sqlite3IsMemJ
12740 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
12750 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fd) ){.      ass
12760 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
12770 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
12780 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
12790 52 59 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  RY );.      sqli
127a0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
127b0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c  r->jfd);.    }el
127c0 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
127d0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
127e0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
127f0 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20  UNCATE ){.      
12800 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
12810 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
12820 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
12830 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _OK;.      }else
12840 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
12850 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
12860 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
12870 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12880 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
12890 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ff = 0;.    }els
128a0 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
128b0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
128c0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
128d0 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28 70  SIST.      || (p
128e0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
128f0 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Mode && pPager->
12900 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
12910 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
12920 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  AL).    ){.     
12930 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61   rc = zeroJourna
12940 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73  lHdr(pPager, has
12950 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70  Master);.      p
12960 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
12970 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  f = 0;.    }else
12980 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
12990 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78  branch may be ex
129a0 65 63 75 74 65 64 20 77 69 74 68 20 50 61 67 65  ecuted with Page
129b0 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d  r.journalMode==M
129c0 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a  EMORY if.      *
129d0 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  * a hot-journal 
129e0 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20  was just rolled 
129f0 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
12a00 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  se the journal. 
12a10 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f       ** file sho
12a20 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e  uld be closed an
12a30 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68  d deleted. If th
12a40 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72  is connection wr
12a50 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ites to.      **
12a60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12a70 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73  le, it will do s
12a80 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65  o using an in-me
12a90 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20  mory journal. . 
12aa0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
12ab0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
12ac0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
12ad0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
12ae0 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20  ETE .           
12af0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
12b00 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
12b10 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
12b20 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
12b30 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
12b40 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
12b50 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
12b60 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
12b70 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
12b80 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ->jfd);.      if
12b90 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
12ba0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ile ){.        r
12bb0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
12bc0 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
12bd0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
12be0 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 0);.      }.
12bf0 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
12c00 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
12c10 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
12c20 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70  heIterateDirty(p
12c30 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
12c40 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
12c50 73 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  sh);.#endif.  }.
12c60 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
12c70 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
12c80 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
12c90 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
12ca0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
12cb0 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69  nRec = 0;.  sqli
12cc0 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
12cd0 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  l(pPager->pPCach
12ce0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  e);.  sqlite3Pca
12cf0 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61 67  cheTruncate(pPag
12d00 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61  er->pPCache, pPa
12d10 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a 20  ger->dbSize);.. 
12d20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
12d30 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
12d40 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c 20  /* Drop the WAL 
12d50 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20 61  write-lock, if a
12d60 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65  ny. Also, if the
12d70 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20   connection was 
12d80 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 69  in .    ** locki
12d90 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
12da0 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e 6f  e mode but is no
12db0 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74 68   longer, drop th
12dc0 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20  e EXCLUSIVE .   
12dd0 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e   ** lock held on
12de0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12df0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  le..    */.    r
12e00 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 45  c2 = sqlite3WalE
12e10 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  ndWriteTransacti
12e20 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
12e30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
12e40 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  2==SQLITE_OK );.
12e50 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
12e60 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
12e70 20 0a 20 20 20 26 26 20 28 21 70 61 67 65 72 55   .   && (!pagerU
12e80 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c  seWal(pPager) ||
12e90 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75   sqlite3WalExclu
12ea0 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d  siveMode(pPager-
12eb0 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a  >pWal, 0)).  ){.
12ec0 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 55      rc2 = pagerU
12ed0 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
12ee0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
12ef0 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
12f00 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20  CountDone = 0;. 
12f10 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74   }.  pPager->eSt
12f20 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44  ate = PAGER_READ
12f30 45 52 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65  ER;.  pPager->se
12f40 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20  tMaster = 0;..  
12f50 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
12f60 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d  TE_OK?rc2:rc);.}
12f70 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
12f80 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20  a rollback if a 
12f90 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
12fa0 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b  ctive and unlock
12fb0 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
12fc0 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  e file. .**.** I
12fd0 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  f the pager has 
12fe0 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20  already entered 
12ff0 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
13000 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   do not attempt 
13010 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
13020 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49   at this time. I
13030 6e 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e  nstead, pager_un
13040 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  lock() is called
13050 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f  . The.** call to
13060 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
13070 77 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c  will discard all
13080 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
13090 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20  , unlock.** the 
130a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
130b0 64 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72  d move the pager
130c0 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74   back to OPEN st
130d0 61 74 65 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a  ate. If this .**
130e0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 72   means that ther
130f0 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  e is a hot-journ
13100 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  al left in the f
13110 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20  ile-system, the 
13120 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74  next .** connect
13130 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  ion to obtain a 
13140 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
13150 68 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20  he pager (which 
13160 6d 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29  may be this one)
13170 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69   .** will roll i
13180 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  t back..**.** If
13190 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 6e   the pager has n
131a0 6f 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  ot already enter
131b0 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
131c0 74 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72  te, but an IO or
131d0 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  .** malloc error
131e0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61   occurs during a
131f0 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
13200 74 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66  this will itself
13210 20 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70   cause .** the p
13220 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68  ager to enter th
13230 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 57  e ERROR state. W
13240 68 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65  hich will be cle
13250 61 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63  ared by the.** c
13260 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c  all to pager_unl
13270 6f 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69  ock(), as descri
13280 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74  bed above..*/.st
13290 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
132a0 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
132b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
132c0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
132d0 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
132e0 4f 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  OR && pPager->eS
132f0 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e  tate!=PAGER_OPEN
13300 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
13310 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
13320 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
13330 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
13340 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
13350 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  ER_LOCKED ){.   
13360 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
13370 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
13380 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
13390 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
133a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
133b0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
133c0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
133d0 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
133e0 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  iveMode ){.     
133f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
13400 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
13410 45 41 44 45 52 20 29 3b 0a 20 20 20 20 20 20 70  EADER );.      p
13420 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
13430 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b  tion(pPager, 0);
13440 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67  .    }.  }.  pag
13450 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
13460 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  );.}../*.** Para
13470 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73 74  meter aData must
13480 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
13490 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61  er of pPager->pa
134a0 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20  geSize bytes.** 
134b0 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65  of data. Compute
134c0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
134d0 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74  ecksum based ont
134e0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
134f0 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66   the .** page of
13500 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63 75   data and the cu
13510 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70  rrent value of p
13520 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
13530 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
13540 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b  not a real check
13550 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c  sum. It is reall
13560 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f  y just the sum o
13570 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d  f the .** random
13580 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28   initial value (
13590 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
135a0 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30 30  t) and every 200
135b0 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68  th byte.** of th
135c0 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74 61  e page data, sta
135d0 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65 20  rting with byte 
135e0 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e  offset (pPager->
135f0 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a  pageSize%200)..*
13600 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20 69  * Each byte is i
13610 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e  nterpreted as an
13620 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20   8-bit unsigned 
13630 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43  integer..**.** C
13640 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d  hanging the form
13650 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  ula used to comp
13660 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73 75  ute this checksu
13670 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a  m results in an.
13680 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  ** incompatible 
13690 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
136a0 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f  mat..**.** If jo
136b0 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e  urnal corruption
136c0 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61   occurs due to a
136d0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
136e0 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20  the most likely 
136f0 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20  .** scenario is 
13700 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20  that one end or 
13710 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
13720 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20   record will be 
13730 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20  changed. .** It 
13740 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b  is much less lik
13750 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f  ely that the two
13760 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75   ends of the jou
13770 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c  rnal record will
13780 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61   be.** correct a
13790 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65  nd the middle be
137a0 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c   corrupt.  Thus,
137b0 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22   this "checksum"
137c0 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75   scheme,.** thou
137d0 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70  gh fast and simp
137e0 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20  le, catches the 
137f0 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69  mostly likely ki
13800 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e  nd of corruption
13810 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
13820 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65  pager_cksum(Page
13830 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
13840 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75   u8 *aData){.  u
13850 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65  32 cksum = pPage
13860 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  r->cksumInit;   
13870 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
13880 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72  m value to retur
13890 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70  n */.  int i = p
138a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
138b0 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  200;          /*
138c0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
138d0 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b  .  while( i>0 ){
138e0 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44  .    cksum += aD
138f0 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d  ata[i];.    i -=
13900 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   200;.  }.  retu
13910 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a  rn cksum;.}../*.
13920 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75  ** Report the cu
13930 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20  rrent page size 
13940 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  and number of re
13950 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63  served bytes bac
13960 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65  k.** to the code
13970 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  c..*/.#ifdef SQL
13980 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74  ITE_HAS_CODEC.st
13990 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52  atic void pagerR
139a0 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20  eportSize(Pager 
139b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
139c0 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
139d0 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50  zeChng ){.    pP
139e0 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
139f0 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f  Chng(pPager->pCo
13a00 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  dec, pPager->pag
13a10 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
13a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a30 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e    (int)pPager->n
13a40 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a  Reserve);.  }.}.
13a50 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
13a60 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58  agerReportSize(X
13a70 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69  )     /* No-op i
13a80 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  f we do not supp
13a90 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23  ort a codec */.#
13aa0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
13ab0 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  d a single page 
13ac0 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20  from either the 
13ad0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66  journal file (if
13ae0 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20   isMainJrnl==1) 
13af0 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73  or.** from the s
13b00 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69  ub-journal (if i
13b10 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e  sMainJrnl==0) an
13b20 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20  d playback that 
13b30 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67  page..** The pag
13b40 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73  e begins at offs
13b50 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f  et *pOffset into
13b60 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a   the file. The *
13b70 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65  pOffset.** value
13b80 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f   is increased to
13b90 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
13ba0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
13bb0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
13bc0 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  * The main rollb
13bd0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73  ack journal uses
13be0 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65   checksums - the
13bf0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
13c00 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e  al does .** not.
13c10 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
13c20 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
13c30 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61   page record rea
13c40 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
13c50 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
13c60 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
13c70 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
13c80 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69  ue of Pager.dbSi
13c90 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  ze, then playbac
13ca0 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20  k is.** skipped 
13cb0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
13cc0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
13cd0 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74   If pDone is not
13ce0 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69   NULL, then it i
13cf0 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61  s a record of pa
13d00 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c  ges that have al
13d10 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c  ready.** been pl
13d20 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74  ayed back.  If t
13d30 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66  he page at *pOff
13d40 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  set has already 
13d50 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
13d60 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72  .** (if the corr
13d70 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20  esponding pDone 
13d80 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e  bit is set) then
13d90 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61   skip the playba
13da0 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ck..** Make sure
13db0 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63   the pDone bit c
13dc0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
13dd0 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67  the *pOffset pag
13de0 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f  e is set.** prio
13df0 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a  r to returning..
13e00 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
13e10 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63  e record is succ
13e20 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
13e30 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
13e40 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  rnal file.** and
13e50 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68   played back, th
13e60 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  en SQLITE_OK is 
13e70 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
13e80 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
13e90 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  ** while reading
13ea0 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d   the record from
13eb0 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
13ec0 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65  al file or while
13ed0 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74   writing.** to t
13ee0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13ef0 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
13f00 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
13f10 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a  rned. If data.**
13f20 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
13f30 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
13f40 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
13f50 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f  e but appears to
13f60 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64   be.** corrupted
13f70 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
13f80 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20   returned. Data 
13f90 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  is considered co
13fa0 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77  rrupted in.** tw
13fb0 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a  o circumstances:
13fc0 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74  .** .**   * If t
13fd0 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e  he record page-n
13fe0 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c  umber is illegal
13ff0 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f   (0 or PAGER_MJ_
14000 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a  PGNO), or.**   *
14010 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   If the record i
14020 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
14030 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
14040 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  n journal file.*
14050 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68  *     and the ch
14060 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65  ecksum field doe
14070 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
14080 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a  record content..
14090 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66  **.** Neither of
140a0 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61   these two scena
140b0 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c  rios are possibl
140c0 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70  e during a savep
140d0 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  oint rollback..*
140e0 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20  *.** If this is 
140f0 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
14100 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72  back, then memor
14110 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65  y may have to be
14120 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20   dynamically.** 
14130 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
14140 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74  s function. If t
14150 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20  his is the case 
14160 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f  and an allocatio
14170 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49  n fails,.** SQLI
14180 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
14190 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
141a0 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
141b0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50  ck_one_page(.  P
141c0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
141d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
141e0 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20  The pager being 
141f0 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
14200 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20   i64 *pOffset,  
14210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14220 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f  * Offset of reco
14230 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a  rd to playback *
14240 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
14250 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
14260 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70    /* Bitvec of p
14270 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61  ages already pla
14280 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e  yed back */.  in
14290 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20  t isMainJrnl,   
142a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
142b0 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c   -> main journal
142c0 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e  . 0 -> sub-journ
142d0 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  al. */.  int isS
142e0 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 20 20  avepnt          
142f0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
14300 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  or a savepoint r
14310 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20  ollback */.){.  
14320 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
14330 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
14340 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
14350 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
14360 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
14370 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
14380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
14390 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
143a0 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
143b0 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
143c0 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
143d0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
143e0 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
143f0 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
14400 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20   char *aData;   
14410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14420 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  * Temporary stor
14430 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  age for the page
14440 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
14450 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20  le *jfd;        
14460 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
14470 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
14480 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
14490 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65  */.  int isSynce
144a0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
144b0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
144c0 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79  urnal page is sy
144d0 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nced */..  asser
144e0 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e  t( (isMainJrnl&~
144f0 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  1)==0 );      /*
14500 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30   isMainJrnl is 0
14510 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
14520 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31  t( (isSavepnt&~1
14530 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  )==0 );       /*
14540 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20   isSavepnt is 0 
14550 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
14560 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20  ( isMainJrnl || 
14570 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20  pDone );     /* 
14580 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65  pDone always use
14590 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d on sub-journal
145a0 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  s */.  assert( i
145b0 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e  sSavepnt || pDon
145c0 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f  e==0 );   /* pDo
145d0 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e  ne never used on
145e0 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a   non-savepoint *
145f0 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61  /..  aData = pPa
14600 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
14610 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20    assert( aData 
14620 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  );         /* Te
14630 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20  mp storage must 
14640 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
14650 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  n allocated */. 
14660 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
14670 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
14680 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20  || (!isMainJrnl 
14690 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b  && isSavepnt) );
146a0 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68  ..  /* Either th
146b0 65 20 73 74 61 74 65 20 69 73 20 67 72 65 61 74  e state is great
146c0 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52  er than PAGER_WR
146d0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61  ITER_CACHEMOD (a
146e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
146f0 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20  ** or savepoint 
14700 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74  rollback done at
14710 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 66 20   the request of 
14720 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74  the caller) or t
14730 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f  his is.  ** a ho
14740 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
14750 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20 68  ck. If it is a h
14760 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
14770 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20  ack, the pager. 
14780 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20   ** is in state 
14790 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61  OPEN and holds a
147a0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
147b0 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  . Hot-journal ro
147c0 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79  llback.  ** only
147d0 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20   reads from the 
147e0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f  main journal, no
147f0 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  t the sub-journa
14800 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  l..  */.  assert
14810 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
14820 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
14830 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
14840 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  | (pPager->eStat
14850 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  e==PAGER_OPEN &&
14860 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
14870 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
14880 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70    );.  assert( p
14890 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
148a0 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
148b0 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72  EMOD || isMainJr
148c0 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  nl );..  /* Read
148d0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
148e0 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66   and page data f
148f0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
14900 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20  or sub-journal. 
14910 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e   ** file. Return
14920 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
14930 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20  o the caller if 
14940 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
14950 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d  rs..  */.  jfd =
14960 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50   isMainJrnl ? pP
14970 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67  ager->jfd : pPag
14980 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d  er->sjfd;.  rc =
14990 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
149a0 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f   *pOffset, &pgno
149b0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
149c0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
149d0 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
149e0 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75  e3OsRead(jfd, (u
149f0 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72  8*)aData, pPager
14a00 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f  ->pageSize, (*pO
14a10 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28  ffset)+4);.  if(
14a20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14a30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
14a40 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72  Offset += pPager
14a50 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b  ->pageSize + 4 +
14a60 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a   isMainJrnl*4;..
14a70 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
14a80 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
14a90 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
14aa0 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49  important that I
14ab0 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
14ac0 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20   thought.  If a 
14ad0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
14ae0 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a  curs while the j
14af0 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
14b00 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74  written,.  ** it
14b10 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76   could cause inv
14b20 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20  alid data to be 
14b30 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
14b40 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65   journal.  We ne
14b50 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63  ed to.  ** detec
14b60 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64  t this invalid d
14b70 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70  ata (with high p
14b80 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20  robability) and 
14b90 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a  ignore it..  */.
14ba0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c    if( pgno==0 ||
14bb0 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
14bc0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
14bd0 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53      assert( !isS
14be0 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65  avepnt );.    re
14bf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
14c00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
14c10 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64  >(Pgno)pPager->d
14c20 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33  bSize || sqlite3
14c30 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65  BitvecTest(pDone
14c40 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72  , pgno) ){.    r
14c50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14c60 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69  .  }.  if( isMai
14c70 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20  nJrnl ){.    rc 
14c80 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
14c90 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20  , (*pOffset)-4, 
14ca0 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
14cb0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
14cc0 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65  .    if( !isSave
14cd0 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73  pnt && pager_cks
14ce0 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
14cf0 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
14d00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
14d10 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
14d20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
14d30 69 73 20 70 61 67 65 20 68 61 73 20 61 6c 72 65  is page has alre
14d40 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
14d50 62 79 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67  by before during
14d60 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a   the current.  *
14d70 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  * rollback, then
14d80 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f   don't bother to
14d90 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67   play it back ag
14da0 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ain..  */.  if( 
14db0 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73  pDone && (rc = s
14dc0 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
14dd0 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53  pDone, pgno))!=S
14de0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14df0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
14e00 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e    /* When playin
14e10 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72  g back page 1, r
14e20 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65  estore the nRese
14e30 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f  rve setting.  */
14e40 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26  .  if( pgno==1 &
14e50 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72  & pPager->nReser
14e60 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29  ve!=((u8*)aData)
14e70 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67  [20] ){.    pPag
14e80 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28  er->nReserve = (
14e90 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b  (u8*)aData)[20];
14ea0 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74  .    pagerReport
14eb0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
14ec0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
14ed0 61 67 65 72 20 69 73 20 69 6e 20 52 45 53 45 52  ager is in RESER
14ee0 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20  VED state, then 
14ef0 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20  there must be a 
14f00 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a  copy of this.  *
14f10 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61  * page in the pa
14f20 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68  ger cache. In th
14f30 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64  is case just upd
14f40 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
14f50 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68  che,.  ** not th
14f60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
14f70 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66   The page is lef
14f80 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69  t marked dirty i
14f90 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a  n this case..  *
14fa0 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74  *.  ** An except
14fb0 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65  ion to the above
14fc0 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61   rule: If the da
14fd0 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d  tabase is in no-
14fe0 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61  sync mode.  ** a
14ff0 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76  nd a page is mov
15000 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63  ed during an inc
15010 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
15020 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
15030 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e  y.  ** not be in
15040 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
15050 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61  . Later: if a ma
15060 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72  lloc() or IO err
15070 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64  or occurs.  ** d
15080 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65  uring a Movepage
15090 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68  () call, then th
150a0 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62  e page may not b
150b0 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20  e in the cache. 
150c0 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74   ** either. So t
150d0 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73  he condition des
150e0 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62  cribed in the ab
150f0 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73  ove paragraph is
15100 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74   not.  ** assert
15110 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a  ()able..  **.  *
15120 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56  * If in EXCLUSIV
15130 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65  E state, then we
15140 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
15150 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78  r cache if it ex
15160 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ists.  ** and th
15170 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65  e main file. The
15180 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61   page is then ma
15190 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a  rked not dirty..
151a0 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74    **.  ** Ticket
151b0 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74 61   #1171:  The sta
151c0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d  tement journal m
151d0 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67  ight contain pag
151e0 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69  e content that i
151f0 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74  s.  ** different
15200 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63   from the page c
15210 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73 74  ontent at the st
15220 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
15230 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69  action..  ** Thi
15240 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20  s occurs when a 
15250 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64 20  page is changed 
15260 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61  prior to the sta
15270 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e  rt of a statemen
15280 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e  t.  ** then chan
15290 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e  ged again within
152a0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20   the statement. 
152b0 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   When rolling ba
152c0 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73  ck such a.  ** s
152d0 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74  tatement we must
152e0 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
152f0 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
15300 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e  ase unless we kn
15310 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74  ow.  ** for cert
15320 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61  ain that origina
15330 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  l page contents 
15340 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20  are synced into 
15350 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
15360 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20  k.  ** journal. 
15370 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f   Otherwise, a po
15380 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c  wer loss might l
15390 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61  eave modified da
153a0 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64  ta in the.  ** d
153b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 74  atabase file wit
153c0 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e  hout an entry in
153d0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
153e0 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20  urnal that can. 
153f0 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20   ** restore the 
15400 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20  database to its 
15410 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20  original form.  
15420 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d  Two conditions m
15430 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20  ust be.  ** met 
15440 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74  before writing t
15450 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
15460 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64 61  iles. (1) the da
15470 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20  tabase must be. 
15480 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29   ** locked.  (2)
15490 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
154a0 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  e original page 
154b0 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79  content is fully
154c0 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20   synced.  ** in 
154d0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
154e0 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
154f0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
15500 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65  in cache or else
15510 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69  .  ** the page i
15520 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64  s marked as need
15530 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20  Sync==0..  **.  
15540 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20 20  ** 2008-04-14:  
15550 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20  When attempting 
15560 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72 72  to vacuum a corr
15570 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
15580 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f  e, it.  ** is po
15590 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20 61  ssible to fail a
155a0 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20   statement on a 
155b0 64 61 74 61 62 61 73 65 20 74 68 61 74 20 64 6f  database that do
155c0 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74  es not yet exist
155d0 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74  ..  ** Do not at
155e0 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 69  tempt to write i
155f0 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
15600 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20 6f  has never been o
15610 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  pened..  */.  if
15620 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
15630 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70 50 67  ager) ){.    pPg
15640 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
15650 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c     pPg = pager_l
15660 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
15670 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  no);.  }.  asser
15680 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42  t( pPg || !MEMDB
15690 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45   );.  PAGERTRACE
156a0 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70  (("PLAYBACK %d p
156b0 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
156c0 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ) %s\n",.       
156d0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
156e0 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
156f0 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72  _datahash(pPager
15700 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a  ->pageSize, (u8*
15710 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20  )aData),.       
15720 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f      (isMainJrnl?
15730 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22  "main-journal":"
15740 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20  sub-journal").  
15750 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e  ));.  if( isMain
15760 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79  Jrnl ){.    isSy
15770 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e  nced = pPager->n
15780 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73  oSync || (*pOffs
15790 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  et <= pPager->jo
157a0 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c  urnalHdr);.  }el
157b0 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64  se{.    isSynced
157c0 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d   = (pPg==0 || 0=
157d0 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50  =(pPg->flags & P
157e0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29  GHDR_NEED_SYNC))
157f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 50 61  ;.  }.  if( (pPa
15800 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
15810 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
15820 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
15830 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20  e==PAGER_OPEN). 
15840 20 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67    && isOpen(pPag
15850 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 69 73  er->fd).   && is
15860 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20  Synced.  ){.    
15870 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f  i64 ofst = (pgno
15880 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
15890 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74  >pageSize;.    t
158a0 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76 65  estcase( !isSave
158b0 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26 26  pnt && pPg!=0 &&
158c0 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
158d0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30  DR_NEED_SYNC)!=0
158e0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
158f0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
15900 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  ger) );.    rc =
15910 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
15920 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 2a  pPager->fd, (u8*
15930 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
15940 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b  pageSize, ofst);
15950 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50  .    if( pgno>pP
15960 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
15970 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
15980 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
15990 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gno;.    }.    i
159a0 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  f( pPager->pBack
159b0 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45  up ){.      CODE
159c0 43 31 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C1(pPager, aData
159d0 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51  , pgno, 3, rc=SQ
159e0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20  LITE_NOMEM);.   
159f0 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
15a00 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
15a10 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
15a20 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20  8*)aData);.     
15a30 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
15a40 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20  aData, pgno, 7, 
15a50 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rc=SQLITE_NOMEM,
15a60 20 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20   aData);.    }. 
15a70 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61   }else if( !isMa
15a80 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30  inJrnl && pPg==0
15a90 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
15aa0 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b  is is a rollback
15ab0 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
15ac0 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74  and data was not
15ad0 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20   written to.    
15ae0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
15af0 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
15b00 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74  not in-memory, t
15b10 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74  here is a potent
15b20 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c  ial.    ** probl
15b30 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67  em. When the pag
15b40 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68 65  e is next fetche
15b50 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20  d by the b-tree 
15b60 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a  layer, it .    *
15b70 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66  * will be read f
15b80 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
15b90 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79   file, which may
15ba0 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a   or may not be .
15bb0 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20      ** current. 
15bc0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
15bd0 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c  here are a coupl
15be0 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77  e of different w
15bf0 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61 70  ays this can hap
15c00 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69  pen. All are qui
15c10 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72  te.    ** obscur
15c20 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20  e. When running 
15c30 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  in synchronous m
15c40 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e  ode, this can on
15c50 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a  ly happen .    *
15c60 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
15c70 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
15c80 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
15c90 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
15ca0 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70  n, then.    ** p
15cb0 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d  opulated, then m
15cc0 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  oved using sqlit
15cd0 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
15ce0 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
15cf0 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
15d00 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65   to add an in-me
15d10 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68 65  mory page to the
15d20 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e   cache containin
15d30 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  g.    ** the dat
15d40 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  a just read from
15d50 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
15d60 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  . Mark the page 
15d70 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a  as dirty .    **
15d80 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67 65   and if the page
15d90 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75  r requires a jou
15da0 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20  rnal-sync, then 
15db0 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
15dc0 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69   .    ** requiri
15dd0 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  ng a journal-syn
15de0 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77  c before it is w
15df0 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
15e00 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76     assert( isSav
15e10 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65  epnt );.    asse
15e20 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
15e30 74 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  tSpill==0 );.   
15e40 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
15e50 69 6c 6c 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20  ill++;.    rc = 
15e60 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
15e70 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ire(pPager, pgno
15e80 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20  , &pPg, 1);.    
15e90 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
15ea0 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 31 20 29 3b  doNotSpill==1 );
15eb0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
15ec0 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20 20 20 20 69  otSpill--;.    i
15ed0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15ee0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
15ef0 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
15f00 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44  ~PGHDR_NEED_READ
15f10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
15f20 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
15f30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
15f40 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
15f50 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
15f60 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
15f70 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
15f80 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
15f90 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
15fa0 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
15fb0 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
15fc0 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
15fd0 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
15fe0 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
15ff0 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
16000 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
16010 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
16020 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
16030 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
16040 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
16050 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
16060 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
16070 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
16080 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
16090 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74  *pData;.    pDat
160a0 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
160b0 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
160c0 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50  , (u8*)aData, pP
160d0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
160e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65  .    pPager->xRe
160f0 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
16100 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
16110 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20 7c  && (!isSavepnt |
16120 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61 67  | *pOffset<=pPag
16130 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20  er->journalHdr) 
16140 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
16150 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
16160 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a 75  his page were ju
16170 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d  st restored from
16180 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20 20   the main .     
16190 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
161a0 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74 65  , then its conte
161b0 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74 68  nt must be as th
161c0 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68 65  ey were when the
161d0 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73   .      ** trans
161e0 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73 74  action was first
161f0 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73   opened. In this
16200 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61 72   case we can mar
16210 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  k the page.     
16220 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73 69   ** as clean, si
16230 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20 62  nce there will b
16240 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72 69  e no need to wri
16250 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65  te it out to the
16260 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
16270 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  se..      **.   
16280 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f     ** There is o
16290 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  ne exception to 
162a0 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68  this rule. If th
162b0 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
162c0 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20  rolled.      ** 
162d0 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20  back as part of 
162e0 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20  a savepoint (or 
162f0 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62  statement) rollb
16300 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20  ack from an .   
16310 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70     ** unsynced p
16320 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61  ortion of the ma
16330 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  in journal file,
16340 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20   then it is not 
16350 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  safe.      ** to
16360 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
16370 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73  s clean. This is
16380 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67   because marking
16390 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20 20   the page as.   
163a0 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c     ** clean will
163b0 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52   clear the PGHDR
163c0 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e  _NEED_SYNC flag.
163d0 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 20   Since the page 
163e0 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  is.      ** alre
163f0 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
16400 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65  al file (recorde
16410 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f  d in Pager.pInJo
16420 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20  urnal) and.     
16430 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
16440 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20  ED_SYNC flag is 
16450 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65 20  cleared, if the 
16460 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
16470 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  to.      ** agai
16480 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  n within this tr
16490 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69  ansaction, it wi
164a0 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ll be marked as 
164b0 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20 20  dirty but.      
164c0 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ** the PGHDR_NEE
164d0 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c  D_SYNC flag will
164e0 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20   not be set. It 
164f0 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e  could then poten
16500 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  tially.      ** 
16510 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69  be written out i
16520 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
16530 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73   file before its
16540 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
16550 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69      ** segment i
16560 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63  s synced. If a c
16570 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72 69  rash occurs duri
16580 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  ng or following 
16590 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64  this,.      ** d
165a0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
165b0 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20  on may ensue..  
165c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
165d0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
165e0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
165f0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
16600 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
16610 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
16620 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
16630 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
16640 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
16650 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
16660 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77      /* If this w
16670 61 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20  as page 1, then 
16680 72 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75  restore the valu
16690 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c  e of Pager.dbFil
166a0 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f  eVers..    ** Do
166b0 20 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79   this before any
166c0 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20   decoding. */.  
166d0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
166e0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70  .      memcpy(&p
166f0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
16700 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61 29  s, &((u8*)pData)
16710 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67  [24],sizeof(pPag
16720 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
16730 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
16740 44 65 63 6f 64 65 20 74 68 65 20 70 61 67 65 20  Decode the page 
16750 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64  just read from d
16760 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43  isk */.    CODEC
16770 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  1(pPager, pData,
16780 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72   pPg->pgno, 3, r
16790 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  c=SQLITE_NOMEM);
167a0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
167b0 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
167c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
167d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
167e0 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74  ter zMaster is t
167f0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
16800 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
16810 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e  . A single journ
16820 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20  al.** file that 
16830 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20  referred to the 
16840 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
16850 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  ile has just bee
16860 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
16870 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
16880 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70  hecks if it is p
16890 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
168a0 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
168b0 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e  rnal file,.** an
168c0 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20  d does so if it 
168d0 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  is..**.** Argume
168e0 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70  nt zMaster may p
168f0 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54  oint to Pager.pT
16900 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74  mpSpace. So that
16910 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a   buffer is not .
16920 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ** available for
16930 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69 73   use within this
16940 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
16950 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a   When a master j
16960 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63  ournal file is c
16970 72 65 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f  reated, it is po
16980 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65  pulated with the
16990 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c   names .** of al
169a0 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a  l of its child j
169b0 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74  ournals, one aft
169c0 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d  er another, form
169d0 61 74 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a  atted as utf-8 .
169e0 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e  ** encoded text.
169f0 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   The end of each
16a00 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66   child journal f
16a10 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69  ile is marked wi
16a20 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72  th a .** nul-ter
16a30 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78  minator byte (0x
16a40 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e  00). i.e. the en
16a50 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
16a60 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
16a70 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20  l.** file for a 
16a80 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f  transaction invo
16a90 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61  lving two databa
16aa0 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a  ses might be:.**
16ab0 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c  .**   "/home/bil
16ac0 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/a.db-journal\x
16ad0 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64  00/home/bill/b.d
16ae0 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a  b-journal\x00".*
16af0 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f  *.** A master jo
16b00 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
16b10 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f  nly be deleted o
16b20 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63  nce all of its c
16b30 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  hild .** journal
16b40 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c  s have been roll
16b50 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
16b60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61  his function rea
16b70 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ds the contents 
16b80 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
16b90 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
16ba0 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c  .** memory and l
16bb0 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61 63  oops through eac
16bc0 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a  h of the child j
16bd0 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f  ournal names. Fo
16be0 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20  r.** each child 
16bf0 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63  journal, it chec
16c00 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ks if:.**.**   *
16c10 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f   if the child jo
16c20 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e  urnal exists, an
16c30 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69  d if so.**   * i
16c40 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
16c50 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72  nal contains a r
16c60 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74  eference to mast
16c70 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20  er journal .**  
16c80 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a     file zMaster.
16c90 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64  **.** If a child
16ca0 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
16cb0 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68  found that match
16cc0 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63  es both of the c
16cd0 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65  riteria.** above
16ce0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
16cf0 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20  returns without 
16d00 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
16d10 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a  Otherwise, if.**
16d20 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a   no such child j
16d30 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
16d40 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65  und, file zMaste
16d50 72 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  r is deleted fro
16d60 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  m.** the file-sy
16d70 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74  stem using sqlit
16d80 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a  e3OsDelete()..**
16d90 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
16da0 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  or within this f
16db0 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f  unction, an erro
16dc0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
16dd0 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ed. This.** func
16de0 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d  tion allocates m
16df0 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67  emory by calling
16e00 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29   sqlite3Malloc()
16e10 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69  . If an allocati
16e20 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  on.** fails, SQL
16e30 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
16e40 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
16e50 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61  , if no IO or ma
16e60 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20  lloc errors .** 
16e70 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b  occur, SQLITE_OK
16e80 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
16e90 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66  .** TODO: This f
16ea0 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
16eb0 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b  s a single block
16ec0 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f   of memory to lo
16ed0 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65  ad.** the entire
16ee0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
16ef0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
16f00 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64  file. This could
16f10 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20   be.** a couple 
16f20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20  of kilobytes or 
16f30 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79  so - potentially
16f40 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
16f50 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a   page .** size..
16f60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
16f70 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61  ger_delmaster(Pa
16f80 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
16f90 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
16fa0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
16fb0 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
16fc0 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  >pVfs;.  int rc;
16fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fe0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
16ff0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
17000 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20  ile *pMaster;   
17010 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73   /* Malloc'd mas
17020 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
17030 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
17040 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
17050 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61  Journal;   /* Ma
17060 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75  lloc'd child-jou
17070 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
17080 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ptor */.  char *
17090 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
170a0 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
170b0 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
170c0 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
170d0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
170e0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
170f0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
17100 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
17110 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
17120 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
17130 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69  o one journal wi
17140 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a  thin MJ file */.
17150 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50    char *zMasterP
17160 74 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  tr;         /* S
17170 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20  pace to hold MJ 
17180 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20  filename from a 
17190 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
171a0 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72    int nMasterPtr
171b0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
171c0 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61  mount of space a
171d0 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73  llocated to zMas
171e0 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f  terPtr[] */..  /
171f0 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
17200 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a   for both the pJ
17210 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74  ournal and pMast
17220 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
17230 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63  ors..  ** If suc
17240 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68  cessful, open th
17250 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
17260 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e   file for readin
17270 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65  g..  */.  pMaste
17280 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  r = (sqlite3_fil
17290 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e *)sqlite3Mallo
172a0 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73  cZero(pVfs->szOs
172b0 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f  File * 2);.  pJo
172c0 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33  urnal = (sqlite3
172d0 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29  _file *)(((u8 *)
172e0 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d  pMaster) + pVfs-
172f0 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66  >szOsFile);.  if
17300 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  ( !pMaster ){.  
17310 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
17320 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
17330 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
17340 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
17350 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
17360 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
17370 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20  RNAL);.    rc = 
17380 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
17390 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61  fs, zMaster, pMa
173a0 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b  ster, flags, 0);
173b0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
173c0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
173d0 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
173e0 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
173f0 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
17400 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
17410 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
17420 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  m.  ** sqlite3_m
17430 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e  alloc() and poin
17440 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
17450 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f  rJournal.   Also
17460 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66   obtain.  ** suf
17470 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 28 69  ficient space (i
17480 6e 20 7a 4d 61 73 74 65 72 50 74 72 29 20 74 6f  n zMasterPtr) to
17490 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20   hold the names 
174a0 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a  of master.  ** j
174b0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 65 78 74  ournal files ext
174c0 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65 67 75  racted from regu
174d0 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75  lar rollback-jou
174e0 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  rnals..  */.  rc
174f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
17500 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e  Size(pMaster, &n
17510 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
17520 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17530 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
17540 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73  ster_out;.  nMas
17550 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d  terPtr = pVfs->m
17560 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a  xPathname+1;.  z
17570 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
17580 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69  sqlite3Malloc((i
17590 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  nt)nMasterJourna
175a0 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 20 2b  l + nMasterPtr +
175b0 20 31 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73   1);.  if( !zMas
175c0 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
175d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
175e0 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65  MEM;.    goto de
175f0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7d  lmaster_out;.  }
17600 0a 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20  .  zMasterPtr = 
17610 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b  &zMasterJournal[
17620 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31  nMasterJournal+1
17630 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ];.  rc = sqlite
17640 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c  3OsRead(pMaster,
17650 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c   zMasterJournal,
17660 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75   (int)nMasterJou
17670 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20  rnal, 0);.  if( 
17680 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
17690 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
176a0 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75  ut;.  zMasterJou
176b0 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72  rnal[nMasterJour
176c0 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f  nal] = 0;..  zJo
176d0 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a  urnal = zMasterJ
176e0 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69 6c 65 28  ournal;.  while(
176f0 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74   (zJournal-zMast
17700 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74  erJournal)<nMast
17710 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
17720 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20   int exists;.   
17730 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
17740 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75  ccess(pVfs, zJou
17750 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
17760 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69  ESS_EXISTS, &exi
17770 73 74 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sts);.    if( rc
17780 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17790 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
177a0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ter_out;.    }. 
177b0 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29 7b     if( exists ){
177c0 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  .      /* One of
177d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
177e0 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
177f0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
17800 78 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20  xists..      ** 
17810 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63  Open it and chec
17820 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61  k if it points a
17830 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  t the master jou
17840 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 2a  rnal. If.      *
17850 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74  * so, return wit
17860 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68  hout deleting th
17870 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
17880 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   file..      */.
17890 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20        int c;.   
178a0 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
178b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
178c0 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
178d0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _MAIN_JOURNAL);.
178e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
178f0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
17900 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61  Journal, pJourna
17910 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  l, flags, 0);.  
17920 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17930 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
17940 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
17950 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
17960 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
17970 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72  terJournal(pJour
17980 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c  nal, zMasterPtr,
17990 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20   nMasterPtr);.  
179a0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
179b0 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  se(pJournal);.  
179c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
179d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
179e0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
179f0 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
17a00 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50      c = zMasterP
17a10 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63  tr[0]!=0 && strc
17a20 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a  mp(zMasterPtr, z
17a30 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20  Master)==0;.    
17a40 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20    if( c ){.     
17a50 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
17a60 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
17a70 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
17a80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
17a90 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
17aa0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
17ab0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
17ac0 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69  Journal += (sqli
17ad0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75  te3Strlen30(zJou
17ae0 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a  rnal)+1);.  }. .
17af0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
17b00 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 63 20  (pMaster);.  rc 
17b10 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
17b20 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
17b30 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f   0);..delmaster_
17b40 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  out:.  sqlite3_f
17b50 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ree(zMasterJourn
17b60 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61 73 74  al);.  if( pMast
17b70 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
17b80 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72  3OsClose(pMaster
17b90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
17ba0 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29  isOpen(pJournal)
17bb0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
17bc0 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  free(pMaster);. 
17bd0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
17be0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
17bf0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
17c00 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 61 63  to change the ac
17c10 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  tual size of the
17c20 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
17c30 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  le in the file-s
17c40 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79  ystem. This only
17c50 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f   happens when co
17c60 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
17c70 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f  action,.** or ro
17c80 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61  lling back a tra
17c90 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64  nsaction (includ
17ca0 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  ing rolling back
17cb0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e   a hot-journal).
17cc0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61  .**.** If the ma
17cd0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
17ce0 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72   is not open, or
17cf0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
17d00 63 6b 20 69 73 20 6e 6f 74 0a 2a 2a 20 68 65 6c  ck is not.** hel
17d10 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
17d20 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68   is a no-op. Oth
17d30 65 72 77 69 73 65 2c 20 74 68 65 20 73 69 7a 65  erwise, the size
17d40 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 0a   of the file is.
17d50 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f 20 6e 50  ** changed to nP
17d60 61 67 65 20 70 61 67 65 73 20 28 6e 50 61 67 65  age pages (nPage
17d70 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  *pPager->pageSiz
17d80 65 20 62 79 74 65 73 29 2e 20 49 66 20 74 68 65  e bytes). If the
17d90 20 66 69 6c 65 0a 2a 2a 20 6f 6e 20 64 69 73 6b   file.** on disk
17da0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61   is currently la
17db0 72 67 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20  rger than nPage 
17dc0 70 61 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20  pages, then use 
17dd0 74 68 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e  the VFS.** xTrun
17de0 63 61 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f  cate() method to
17df0 20 74 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a   truncate it..**
17e00 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74  .** Or, it might
17e10 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
17e20 73 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  se that the file
17e30 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c   on disk is smal
17e40 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61  ler than .** nPa
17e50 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f  ge pages. Some o
17e60 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
17e70 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
17e80 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64  can get confused
17e90 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20   if .** you try 
17ea0 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66 69  to truncate a fi
17eb0 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20  le to some size 
17ec0 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74  that is larger t
17ed0 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65  han it .** curre
17ee0 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65  ntly is, so dete
17ef0 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64  ct this case and
17f00 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20   write a single 
17f10 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a  zero byte to .**
17f20 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
17f30 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64  new file instead
17f40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
17f50 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51  ssful, return SQ
17f60 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49  LITE_OK. If an I
17f70 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
17f80 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a  hile modifying.*
17f90 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
17fa0 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  ile, return the 
17fb0 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
17fc0 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61  e caller..*/.sta
17fd0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72  tic int pager_tr
17fe0 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
17ff0 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
18000 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
18010 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
18020 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
18030 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
18040 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
18050 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
18060 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 0a 20  R_READER );.  . 
18070 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
18080 65 72 2d 3e 66 64 29 20 0a 20 20 20 26 26 20 28  er->fd) .   && (
18090 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
180a0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
180b0 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OD || pPager->eS
180c0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
180d0 29 20 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  ) .  ){.    i64 
180e0 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77  currentSize, new
180f0 53 69 7a 65 3b 0a 20 20 20 20 2f 2a 20 54 4f 44  Size;.    /* TOD
18100 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20 74 6f  O: Is it safe to
18110 20 75 73 65 20 50 61 67 65 72 2e 64 62 46 69 6c   use Pager.dbFil
18120 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20  eSize here? */. 
18130 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
18140 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
18150 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69  ->fd, &currentSi
18160 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65  ze);.    newSize
18170 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
18180 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a  ize*(i64)nPage;.
18190 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
181a0 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74  TE_OK && current
181b0 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b  Size!=newSize ){
181c0 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 72 65  .      if( curre
181d0 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29  ntSize>newSize )
181e0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
181f0 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
18200 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77  (pPager->fd, new
18210 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Size);.      }el
18220 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
18230 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
18240 70 50 61 67 65 72 2d 3e 66 64 2c 20 22 22 2c 20  pPager->fd, "", 
18250 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29 3b 0a 20  1, newSize-1);. 
18260 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18270 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18280 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
18290 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e  ->dbFileSize = n
182a0 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Page;.      }.  
182b0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
182c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
182d0 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
182e0 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  he Pager.sectorS
182f0 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f 72  ize variable for
18300 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61   the given.** pa
18310 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ger based on the
18320 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
18330 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69  by the xSectorSi
18340 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20  ze method.** of 
18350 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
18360 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63 74  e file. The sect
18370 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
18380 75 73 65 64 20 75 73 65 64 20 0a 2a 2a 20 74 6f  used used .** to
18390 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73   determine the s
183a0 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e  ize and alignmen
183b0 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  t of journal hea
183c0 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74  der and .** mast
183d0 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
183e0 65 72 73 20 77 69 74 68 69 6e 20 63 72 65 61 74  ers within creat
183f0 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ed journal files
18400 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70  ..**.** For temp
18410 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68 65 20  orary files the 
18420 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
18430 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20   size is always 
18440 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  512 bytes..**.**
18450 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20   Otherwise, for 
18460 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66 69  non-temporary fi
18470 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63 74 69  les, the effecti
18480 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  ve sector size i
18490 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72  s.** the value r
184a0 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78  eturned by the x
184b0 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d 65 74  SectorSize() met
184c0 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70 20 74  hod rounded up t
184d0 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20 69 73  o 32 if.** it is
184e0 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c 20 6f   less than 32, o
184f0 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74  r rounded down t
18500 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  o MAX_SECTOR_SIZ
18510 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72  E if it.** is gr
18520 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53  eater than MAX_S
18530 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 73  ECTOR_SIZE..*/.s
18540 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65  tatic void setSe
18550 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a  ctorSize(Pager *
18560 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
18570 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
18580 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
18590 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20  >tempFile );..  
185a0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
185b0 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20  pFile ){.    /* 
185c0 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73  Sector size does
185d0 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74  n't matter for t
185e0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
185f0 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20  Also, the file. 
18600 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61     ** may not ha
18610 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79  ve been opened y
18620 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73  et, in which cas
18630 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69  e the OsSectorSi
18640 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ze().    ** call
18650 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a   will segfault..
18660 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
18670 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
18680 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
18690 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ize(pPager->fd);
186a0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
186b0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c 33 32  r->sectorSize<32
186c0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
186d0 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32  sectorSize = 512
186e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
186f0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 4d  er->sectorSize>M
18700 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29  AX_SECTOR_SIZE )
18710 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d 41  {.    assert( MA
18720 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35  X_SECTOR_SIZE>=5
18730 31 32 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  12 );.    pPager
18740 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 4d  ->sectorSize = M
18750 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  AX_SECTOR_SIZE;.
18760 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61    }.}../*.** Pla
18770 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61  yback the journa
18780 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f  l and thus resto
18790 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
187a0 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73  file to.** the s
187b0 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62  tate it was in b
187c0 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64  efore we started
187d0 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e   making changes.
187e0 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75    .**.** The jou
187f0 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
18800 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20   is as follows: 
18810 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62  .**.**  (1)  8 b
18820 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63  yte prefix.  A c
18830 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d  opy of aJournalM
18840 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20  agic[]..**  (2) 
18850 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
18860 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
18870 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
18880 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  f valid page rec
18890 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e  ords.**       in
188a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
188b0 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  f this value is 
188c0 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
188d0 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
188e0 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20        number of 
188f0 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f  page records fro
18900 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69  m the journal si
18910 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62  ze..**  (3)  4 b
18920 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
18930 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
18940 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  the initial valu
18950 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20  e for the .**   
18960 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b      sanity check
18970 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20  sum..**  (4)  4 
18980 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
18990 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
189a0 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75   of pages to tru
189b0 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  ncate the.**    
189c0 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64     database to d
189d0 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
189e0 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74  ..**  (5)  4 byt
189f0 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
18a00 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
18a10 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20  e sector size.  
18a20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  The header.**   
18a30 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79      is this many
18a40 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
18a50 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65 20  **  (6)  4 byte 
18a60 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
18a70 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
18a80 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  page size..**  (
18a90 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69 6e 67  7)  zero padding
18aa0 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74   out to the next
18ab0 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a   sector size..**
18ac0 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d    (8)  Zero or m
18ad0 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e  ore pages instan
18ae0 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c  ces, each as fol
18af0 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20  lows:.**        
18b00 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e  +  4 byte page n
18b10 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20  umber..**       
18b20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65   +  pPager->page
18b30 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
18b40 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ta..**        + 
18b50 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d   4 byte checksum
18b60 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73  .**.** When we s
18b70 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  peak of the jour
18b80 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d  nal header, we m
18b90 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 37 20  ean the first 7 
18ba0 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20  items above..** 
18bb0 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68  Each entry in th
18bc0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20  e journal is an 
18bd0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
18be0 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  8th item..**.** 
18bf0 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66  Call the value f
18c00 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62  rom the second b
18c10 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e  ullet "nRec".  n
18c20 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Rec is the numbe
18c30 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61  r of.** valid pa
18c40 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ge entries in th
18c50 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d  e journal.  In m
18c60 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63  ost cases, you c
18c70 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  an compute the.*
18c80 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  * value of nRec 
18c90 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
18ca0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
18cb0 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77  e.  But if a pow
18cc0 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63  er.** failure oc
18cd0 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65  curred while the
18ce0 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
18cf0 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63  ng written, it c
18d00 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63  ould be the.** c
18d10 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a  ase that the siz
18d20 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
18d30 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64   file had alread
18d40 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64  y been increased
18d50 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72   but.** the extr
18d60 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f  a entries had no
18d70 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61  t yet made it sa
18d80 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49  fely to disk.  I
18d90 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a  n such a case,.*
18da0 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
18db0 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f  Rec computed fro
18dc0 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  m the file size 
18dd0 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72  would be too lar
18de0 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74  ge.  For.** that
18df0 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61   reason, we alwa
18e00 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20  ys use the nRec 
18e10 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61  value in the hea
18e20 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  der..**.** If th
18e30 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20  e nRec value is 
18e40 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65  0xffffffff it me
18e50 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68  ans that nRec sh
18e60 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
18e70 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  .** from the fil
18e80 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61  e size.  This va
18e90 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e  lue is used when
18ea0 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74   the user select
18eb0 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63  s the.** no-sync
18ec0 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20   option for the 
18ed0 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65  journal.  A powe
18ee0 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
18ef0 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69  lead to corrupti
18f00 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  on.** in this ca
18f10 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69  se.  But for thi
18f20 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61  ngs like tempora
18f30 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20  ry table (which 
18f40 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74  will be.** delet
18f50 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65  ed when the powe
18f60 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77  r is restored) w
18f70 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a  e don't care.  .
18f80 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
18f90 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20  e opened as the 
18fa0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
18fb0 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  not a well-forme
18fc0 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  d.** journal fil
18fd0 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  e then all pages
18fe0 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74   up to the first
18ff0 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20   corrupted page 
19000 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61  are rolled.** ba
19010 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20  ck (or no pages 
19020 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  if the journal h
19030 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74  eader is corrupt
19040 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ed). The journal
19050 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e   file.** is then
19060 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c   deleted and SQL
19070 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c  ITE_OK returned,
19080 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63   just as if no c
19090 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a  orruption had.**
190a0 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65   been encountere
190b0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
190c0 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  /O or malloc() e
190d0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
190e0 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73   journal-file is
190f0 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20   not deleted.** 
19100 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
19110 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
19120 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70  *.** The isHot p
19130 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74  arameter indicat
19140 65 73 20 74 68 61 74 20 77 65 20 61 72 65 20 74  es that we are t
19150 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  rying to rollbac
19160 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74  k a journal.** t
19170 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 20 68  hat might be a h
19180 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c  ot journal.  Or,
19190 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61   it could be tha
191a0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
191b0 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62   .** preserved b
191c0 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41  ecause of JOURNA
191d0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72  LMODE_PERSIST or
191e0 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55   JOURNALMODE_TRU
191f0 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65  NCATE..** If the
19200 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20   journal really 
19210 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68  is hot, reset th
19220 65 20 70 61 67 65 72 20 63 61 63 68 65 20 70 72  e pager cache pr
19230 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62  ior rolling.** b
19240 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e  ack any content.
19250 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    If the journal
19260 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69   is merely persi
19270 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20  stent, no reset 
19280 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f  is.** needed..*/
19290 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
192a0 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  r_playback(Pager
192b0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73   *pPager, int is
192c0 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Hot){.  sqlite3_
192d0 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
192e0 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20  er->pVfs;.  i64 
192f0 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
19300 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
19310 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
19320 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
19330 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  32 nRec;        
19340 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
19350 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20  r of Records in 
19360 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
19370 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20   u32 u;         
19380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
19390 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
193a0 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  er */.  Pgno mxP
193b0 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
193c0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
193d0 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e  original file in
193e0 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
193f0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
19400 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
19410 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ode of a subrout
19420 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  ine */.  int res
19430 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
19440 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
19450 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
19460 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68  Access() */.  ch
19470 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
19480 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
19490 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
194a0 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a   file if any */.
194b0 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52    int needPagerR
194c0 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72  eset;      /* Tr
194d0 75 65 20 74 6f 20 72 65 73 65 74 20 70 61 67 65  ue to reset page
194e0 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20   prior to first 
194f0 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  page rollback */
19500 0a 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  ..  if( !isOpen(
19510 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
19520 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19530 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
19540 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
19550 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20  any records are 
19560 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
19570 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a   Abort early if.
19580 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
19590 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a   is empty..  */.
195a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
195b0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
195c0 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  >jfd, &szJ);.  i
195d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
195e0 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20   || szJ==0 ){.  
195f0 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
19600 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ack;.  }..  /* R
19610 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ead the master j
19620 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d  ournal name from
19630 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66   the journal, if
19640 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a   it is present..
19650 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72    ** If a master
19660 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
19670 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
19680 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73   but the file is
19690 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e   not.  ** presen
196a0 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20  t on disk, then 
196b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
196c0 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20  ot hot and does 
196d0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
196e0 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   ** played back.
196f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a  .  **.  ** TODO:
19700 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65   Technically the
19710 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e   following is an
19720 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20 69   error because i
19730 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20  t assumes that. 
19740 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65 72   ** buffer Pager
19750 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d  .pTmpSpace is (m
19760 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74  xPathname+1) byt
19770 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e  es or larger. i.
19780 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50  e. that.  ** (pP
19790 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e  ager->pageSize >
197a0 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  = pPager->pVfs->
197b0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55  mxPathname+1). U
197c0 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a  sing os_unix.c,.
197d0 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65    **  mxPathname
197e0 20 69 73 20 35 31 32 2c 20 77 68 69 63 68 20 69   is 512, which i
197f0 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
19800 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61  e minimum allowa
19810 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66  ble value.  ** f
19820 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a  or pageSize..  *
19830 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50  /.  zMaster = pP
19840 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
19850 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74  .  rc = readMast
19860 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
19870 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
19880 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
19890 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69  Pathname+1);.  i
198a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
198b0 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29   && zMaster[0] )
198c0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
198d0 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
198e0 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45   zMaster, SQLITE
198f0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
19900 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61  &res);.  }.  zMa
19910 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ster = 0;.  if( 
19920 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
19930 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74   !res ){.    got
19940 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
19950 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
19960 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
19970 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d  needPagerReset =
19980 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68   isHot;..  /* Th
19990 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  is loop terminat
199a0 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 61  es either when a
199b0 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
199c0 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72  ) or .  ** pager
199d0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
199e0 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e  ge() call return
199f0 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72  s SQLITE_DONE or
19a00 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20   an IO error .  
19a10 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f  ** occurs. .  */
19a20 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
19a30 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e     /* Read the n
19a40 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ext journal head
19a50 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  er from the jour
19a60 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68  nal file.  If th
19a70 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e  ere are.    ** n
19a80 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20  ot enough bytes 
19a90 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  left in the jour
19aa0 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63  nal file for a c
19ab0 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20  omplete header, 
19ac0 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20  or.    ** it is 
19ad0 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20  corrupted, then 
19ae0 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f  a process must o
19af0 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77  f failed while w
19b00 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
19b10 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  * This indicates
19b20 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65   nothing more ne
19b30 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
19b40 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   back..    */.  
19b50 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
19b60 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69 73  alHdr(pPager, is
19b70 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  Hot, szJ, &nRec,
19b80 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
19b90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19ba0 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
19bb0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
19bc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
19bd0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
19be0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
19bf0 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
19c00 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
19c10 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
19c20 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
19c30 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
19c40 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
19c50 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
19c60 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
19c70 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
19c80 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
19c90 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
19ca0 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
19cb0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
19cc0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
19cd0 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
19ce0 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
19cf0 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
19d00 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
19d10 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
19d20 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
19d30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
19d40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
19d50 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
19d60 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
19d70 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28     nRec = (int)(
19d80 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48  (szJ - JOURNAL_H
19d90 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a  DR_SZ(pPager))/J
19da0 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
19db0 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
19dc0 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
19dd0 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62  0 and this rollb
19de0 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e  ack is of a tran
19df0 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20  saction created 
19e00 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70  by this.    ** p
19e10 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74 68  rocess and if th
19e20 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20  is is the final 
19e30 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f  header in the jo
19e40 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d  urnal, then it m
19e50 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  eans.    ** that
19e60 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68   this part of th
19e70 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
19e80 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68  ing filled but h
19e90 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a  as not yet been.
19ea0 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f      ** synced to
19eb0 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20   disk.  Compute 
19ec0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
19ed0 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ges based on the
19ee0 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a   remaining.    *
19ef0 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  * size of the fi
19f00 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
19f10 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d  * The third term
19f20 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73   of the test was
19f30 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69   added to fix ti
19f40 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20  cket #2565..    
19f50 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  ** When rolling 
19f60 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e  back a hot journ
19f70 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61  al, nRec==0 alwa
19f80 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ys means that th
19f90 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68  e next.    ** ch
19fa0 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  unk of the journ
19fb0 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f  al contains zero
19fc0 20 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c   pages to be rol
19fd0 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20  led back.  But. 
19fe0 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67     ** when doing
19ff0 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20   a ROLLBACK and 
1a000 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e  the nRec==0 chun
1a010 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20 63 68  k is the last ch
1a020 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  unk in.    ** th
1a030 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65  e journal, it me
1a040 61 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ans that the jou
1a050 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
1a060 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20  in additional.  
1a070 20 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20    ** pages that 
1a080 6e 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65  need to be rolle
1a090 64 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20  d back and that 
1a0a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1a0b0 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75  ges .    ** shou
1a0c0 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62  ld be computed b
1a0d0 61 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  ased on the jour
1a0e0 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20  nal file size.. 
1a0f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
1a100 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20  ec==0 && !isHot 
1a110 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  &&.        pPage
1a120 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
1a130 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1a140 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
1a150 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
1a160 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28    nRec = (int)((
1a170 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
1a180 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52  urnalOff) / JOUR
1a190 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
1a1a0 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
1a1b0 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
1a1c0 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65   first header re
1a1d0 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
1a1e0 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68  nal, truncate th
1a1f0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
1a200 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
1a210 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
1a220 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1a230 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1a240 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
1a250 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
1a260 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1a270 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
1a280 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66   mxPg);.      if
1a290 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a2a0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
1a2b0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1a2c0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
1a2d0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50  er->dbSize = mxP
1a2e0 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  g;.    }..    /*
1a2f0 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
1a300 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
1a310 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
1a320 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a   into the .    *
1a330 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
1a340 61 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68  and/or page cach
1a350 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
1a360 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75  r(u=0; u<nRec; u
1a370 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  ++){.      if( n
1a380 65 65 64 50 61 67 65 72 52 65 73 65 74 20 29 7b  eedPagerReset ){
1a390 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
1a3a0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1a3b0 20 20 20 20 20 20 6e 65 65 64 50 61 67 65 72 52        needPagerR
1a3c0 65 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  eset = 0;.      
1a3d0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  }.      rc = pag
1a3e0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
1a3f0 70 61 67 65 28 70 50 61 67 65 72 2c 26 70 50 61  page(pPager,&pPa
1a400 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
1a410 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20 20 69 66  0,1,0);.      if
1a420 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a430 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
1a440 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
1a450 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1a460 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1a470 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1a480 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
1a490 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1a4a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1a4b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
1a4c0 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1a4d0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
1a4e0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  f the journal ha
1a4f0 73 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64  s been truncated
1a500 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65  , simply stop re
1a510 61 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20  ading and.      
1a520 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e      ** processin
1a530 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54  g the journal. T
1a540 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e  his might happen
1a550 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
1a560 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  was.          **
1a570 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   not completely 
1a580 77 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63  written and sync
1a590 65 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72  ed prior to a cr
1a5a0 61 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20  ash.  In that.  
1a5b0 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c          ** case,
1a5c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68   the database sh
1a5d0 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20  ould have never 
1a5e0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20  been written in 
1a5f0 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
1a600 20 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20   first place so 
1a610 69 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70  it is OK to simp
1a620 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72  ly abandon the r
1a630 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20  ollback. */.    
1a640 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1a650 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
1a660 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1a670 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
1a680 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
1a690 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  f we are unable 
1a6a0 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69  to rollback, qui
1a6b0 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  t and return the
1a6c0 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20   error.         
1a6d0 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20   ** code.  This 
1a6e0 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70  will cause the p
1a6f0 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68  ager to enter th
1a700 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20  e error state.  
1a710 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68          ** so th
1a720 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61  at no further ha
1a730 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e  rm will be done.
1a740 20 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 65    Perhaps the ne
1a750 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  xt.          ** 
1a760 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20  process to come 
1a770 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62  along will be ab
1a780 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  le to rollback t
1a790 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  he database..   
1a7a0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1a7b0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1a7c0 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
1a7d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a7e0 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45   }.  /*NOTREACHE
1a7f0 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20  D*/.  assert( 0 
1a800 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b  );..end_playback
1a810 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67  :.  /* Following
1a820 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65   a rollback, the
1a830 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
1a840 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e  hould be back in
1a850 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20   its original.  
1a860 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20 74  ** state prior t
1a870 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
1a880 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
1a890 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20  so invoke the.  
1a8a0 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ** SQLITE_FCNTL_
1a8b0 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c  DB_UNCHANGED fil
1a8c0 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64  e-control method
1a8d0 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a   to disable the.
1a8e0 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74    ** assertion t
1a8f0 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
1a900 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
1a910 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20  modified..  */. 
1a920 20 61 73 73 65 72 74 28 0a 20 20 20 20 70 50 61   assert(.    pPa
1a930 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
1a940 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73 71 6c 69  s==0 ||.    sqli
1a950 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
1a960 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49  (pPager->fd,SQLI
1a970 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
1a980 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c 49 54 45  ANGED,0)>=SQLITE
1a990 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49  _OK.  );..  /* I
1a9a0 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20  f this playback 
1a9b0 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74  is happening aut
1a9c0 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20  omatically as a 
1a9d0 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20  result of an IO 
1a9e0 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20  or .  ** malloc 
1a9f0 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72  error that occur
1aa00 72 65 64 20 61 66 74 65 72 20 74 68 65 20 63 68  red after the ch
1aa10 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73  ange-counter was
1aa20 20 75 70 64 61 74 65 64 20 62 75 74 20 0a 20 20   updated but .  
1aa30 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  ** before the tr
1aa40 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f  ansaction was co
1aa50 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68  mmitted, then th
1aa60 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1aa70 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74   .  ** modificat
1aa80 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76  ion may just hav
1aa90 65 20 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e  e been reverted.
1aaa0 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
1aab0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20   in exclusive . 
1aac0 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73   ** mode, then s
1aad0 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61  ubsequent transa
1aae0 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64  ctions performed
1aaf0 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   by the connecti
1ab00 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a  on will not.  **
1ab10 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
1ab20 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c  ge-counter at al
1ab30 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64  l. This may lead
1ab40 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73   to cache incons
1ab50 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f  istency.  ** pro
1ab60 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20  blems for other 
1ab70 70 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d  processes at som
1ab80 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
1ab90 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a  uture. So, just.
1aba0 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69    ** in case thi
1abb0 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20  s has happened, 
1abc0 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67 65  clear the change
1abd0 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e  CountDone flag n
1abe0 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ow..  */.  pPage
1abf0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
1ac00 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
1ac10 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63  pFile;..  if( rc
1ac20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ac30 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61     zMaster = pPa
1ac40 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
1ac50 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
1ac60 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
1ac70 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
1ac80 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
1ac90 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
1aca0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
1acb0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
1acc0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1acd0 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d  E_OK && !pPager-
1ace0 3e 6e 6f 53 79 6e 63 20 26 26 20 70 50 61 67 65  >noSync && pPage
1acf0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
1ad00 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 7b  _WRITER_DBMOD ){
1ad10 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1ad20 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
1ad30 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
1ad40 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 69  _flags);.  }.  i
1ad50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ad60 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
1ad70 79 6e 63 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ync && pPager->e
1ad80 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
1ad90 54 45 52 5f 44 42 4d 4f 44 20 29 7b 0a 20 20 20  TER_DBMOD ){.   
1ada0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
1adb0 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ync(pPager->fd, 
1adc0 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
1add0 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  gs);.  }.  if( r
1ade0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1adf0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
1ae00 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
1ae10 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30  Pager, zMaster[0
1ae20 5d 21 3d 27 5c 30 27 29 3b 0a 20 20 20 20 74 65  ]!='\0');.    te
1ae30 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1ae40 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1ae50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ae60 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26   && zMaster[0] &
1ae70 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20  & res ){.    /* 
1ae80 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
1ae90 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
1aea0 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
1aeb0 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65  ill return succe
1aec0 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69  ss,.    ** see i
1aed0 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
1aee0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
1aef0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20  aster journal.. 
1af00 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
1af10 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70  ager_delmaster(p
1af20 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
1af30 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1af40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1af50 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61    }..  /* The Pa
1af60 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
1af70 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65  ariable may have
1af80 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68   been updated wh
1af90 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a  ile rolling.  **
1afa0 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
1afb0 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
1afc0 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66  cess with a diff
1afd0 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a  erent sector siz
1afe0 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65  e.  ** value. Re
1aff0 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f  set it to the co
1b000 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20  rrect value for 
1b010 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20  this process..  
1b020 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69  */.  setSectorSi
1b030 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ze(pPager);.  re
1b040 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
1b050 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74  ** Read the cont
1b060 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67  ent for page pPg
1b070 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61   out of the data
1b080 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e  base file and in
1b090 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74  to .** pPg->pDat
1b0a0 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b  a. A shared lock
1b0b0 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74   or greater must
1b0c0 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   be held on the 
1b0d0 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
1b0e0 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e   before this fun
1b0f0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
1b100 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31  .**.** If page 1
1b110 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74   is read, then t
1b120 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  he value of Page
1b130 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69  r.dbFileVers[] i
1b140 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20  s set to.** the 
1b150 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
1b160 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b170 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  e..**.** If an I
1b180 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
1b190 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
1b1a0 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  r is returned to
1b1b0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20   the caller..** 
1b1c0 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
1b1d0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1b1e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b1f0 72 65 61 64 44 62 50 61 67 65 28 50 67 48 64 72  readDbPage(PgHdr
1b200 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
1b210 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1b220 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20  Pager; /* Pager 
1b230 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65  object associate
1b240 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67 20  d with page pPg 
1b250 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  */.  Pgno pgno =
1b260 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20   pPg->pgno;     
1b270 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
1b280 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e   to read */.  in
1b290 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1b2a0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
1b2b0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1b2c0 6e 74 20 69 73 49 6e 57 61 6c 20 3d 20 30 3b 20  nt isInWal = 0; 
1b2d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b2e0 72 75 65 20 69 66 20 70 61 67 65 20 69 73 20 69  rue if page is i
1b2f0 6e 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 20 20  n log file */.  
1b300 69 6e 74 20 70 67 73 7a 20 3d 20 70 50 61 67 65  int pgsz = pPage
1b310 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20  r->pageSize; /* 
1b320 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1b330 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73  to read */..  as
1b340 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1b350 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
1b360 45 52 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a  ER && !MEMDB );.
1b370 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1b380 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
1b390 0a 20 20 69 66 28 20 4e 45 56 45 52 28 21 69 73  .  if( NEVER(!is
1b3a0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1b3b0 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
1b3c0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1b3d0 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  e );.    memset(
1b3e0 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70  pPg->pData, 0, p
1b3f0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1b400 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1b410 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69  ITE_OK;.  }..  i
1b420 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
1b430 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a  Pager) ){.    /*
1b440 20 54 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65   Try to pull the
1b450 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77   page from the w
1b460 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20  rite-ahead log. 
1b470 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
1b480 74 65 33 57 61 6c 52 65 61 64 28 70 50 61 67 65  te3WalRead(pPage
1b490 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
1b4a0 69 73 49 6e 57 61 6c 2c 20 70 67 73 7a 2c 20 70  isInWal, pgsz, p
1b4b0 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 0a  Pg->pData);.  }.
1b4c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b4d0 5f 4f 4b 20 26 26 20 21 69 73 49 6e 57 61 6c 20  _OK && !isInWal 
1b4e0 29 7b 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73  ){.    i64 iOffs
1b4f0 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  et = (pgno-1)*(i
1b500 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
1b510 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ize;.    rc = sq
1b520 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
1b530 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61  er->fd, pPg->pDa
1b540 74 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65  ta, pgsz, iOffse
1b550 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
1b560 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1b570 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
1b580 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1b590 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1b5a0 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
1b5b0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1b5c0 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64 20   /* If the read 
1b5d0 69 73 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c  is unsuccessful,
1b5e0 20 73 65 74 20 74 68 65 20 64 62 46 69 6c 65 56   set the dbFileV
1b5f0 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69  ers[] to somethi
1b600 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ng.      ** that
1b610 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61   will never be a
1b620 20 76 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73   valid file vers
1b630 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73  ion.  dbFileVers
1b640 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20  [] is a copy.   
1b650 20 20 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32     ** of bytes 2
1b660 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74  4..39 of the dat
1b670 61 62 61 73 65 2e 20 20 42 79 74 65 73 20 32 38  abase.  Bytes 28
1b680 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61  ..31 should alwa
1b690 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a  ys be.      ** z
1b6a0 65 72 6f 20 6f 72 20 74 68 65 20 73 69 7a 65 20  ero or the size 
1b6b0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1b6c0 69 6e 20 70 61 67 65 2e 20 42 79 74 65 73 20 33  in page. Bytes 3
1b6d0 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39  2..35 and 35..39
1b6e0 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64  .      ** should
1b6f0 20 62 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73   be page numbers
1b700 20 77 68 69 63 68 20 61 72 65 20 6e 65 76 65 72   which are never
1b710 20 30 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f   0xffffffff.  So
1b720 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a   filling.      *
1b730 2a 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  * pPager->dbFile
1b740 56 65 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20  Vers[] with all 
1b750 30 78 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c  0xff bytes shoul
1b760 64 20 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20  d suffice..     
1b770 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72   **.      ** For
1b780 20 61 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61   an encrypted da
1b790 74 61 62 61 73 65 2c 20 74 68 65 20 73 69 74 75  tabase, the situ
1b7a0 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f  ation is more co
1b7b0 6d 70 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20  mplex:  bytes.  
1b7c0 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66      ** 24..39 of
1b7d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 72   the database ar
1b7e0 65 20 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20  e white noise.  
1b7f0 42 75 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c  But the probabil
1b800 69 74 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ity of.      ** 
1b810 77 68 69 74 65 20 6e 6f 69 73 69 6e 67 20 65 71  white noising eq
1b820 75 61 6c 69 6e 67 20 31 36 20 62 79 74 65 73 20  ualing 16 bytes 
1b830 6f 66 20 30 78 66 66 20 69 73 20 76 61 6e 69 73  of 0xff is vanis
1b840 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a  hingly small so.
1b850 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75        ** we shou
1b860 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a  ld still be ok..
1b870 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d        */.      m
1b880 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 64 62  emset(pPager->db
1b890 46 69 6c 65 56 65 72 73 2c 20 30 78 66 66 2c 20  FileVers, 0xff, 
1b8a0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
1b8b0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
1b8c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38   }else{.      u8
1b8d0 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26   *dbFileVers = &
1b8e0 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61  ((u8*)pPg->pData
1b8f0 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  )[24];.      mem
1b900 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
1b910 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
1b920 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  ers, sizeof(pPag
1b930 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
1b940 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f  ;.    }.  }.  CO
1b950 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 50 67  DEC1(pPager, pPg
1b960 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33  ->pData, pgno, 3
1b970 2c 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  , rc = SQLITE_NO
1b980 4d 45 4d 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49  MEM);..  PAGER_I
1b990 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
1b9a0 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b  r_readdb_count);
1b9b0 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50  .  PAGER_INCR(pP
1b9c0 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20  ager->nRead);.  
1b9d0 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20 25  IOTRACE(("PGIN %
1b9e0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
1b9f0 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52   pgno));.  PAGER
1ba00 54 52 41 43 45 28 28 22 46 45 54 43 48 20 25 64  TRACE(("FETCH %d
1ba10 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
1ba20 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
1ba30 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
1ba40 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
1ba50 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
1ba60 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  )));..  return r
1ba70 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
1ba80 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
1ba90 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1baa0 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63  n is invoked onc
1bab0 65 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  e for each page 
1bac0 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79  that has already
1bad0 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65   been .** writte
1bae0 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66  n into the log f
1baf0 69 6c 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74  ile when a WAL t
1bb00 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
1bb10 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61  lled back..** Pa
1bb20 72 61 6d 65 74 65 72 20 69 50 67 20 69 73 20 74  rameter iPg is t
1bb30 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
1bb40 66 20 73 61 69 64 20 70 61 67 65 2e 20 54 68 65  f said page. The
1bb50 20 70 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a   pCtx argument .
1bb60 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  ** is actually a
1bb70 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1bb80 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2e  Pager structure.
1bb90 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69  .**.** If page i
1bba0 50 67 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e  Pg is present in
1bbb0 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20   the cache, and 
1bbc0 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  has no outstandi
1bbd0 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a  ng references,.*
1bbe0 2a 20 69 74 20 69 73 20 64 69 73 63 61 72 64 65  * it is discarde
1bbf0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
1bc00 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f   there are one o
1bc10 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69  r more outstandi
1bc20 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ng.** references
1bc30 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  , the page conte
1bc40 6e 74 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66  nt is reloaded f
1bc50 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1bc60 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65  . If the.** atte
1bc70 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f  mpt to reload co
1bc80 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64  ntent from the d
1bc90 61 74 61 62 61 73 65 20 69 73 20 72 65 71 75 69  atabase is requi
1bca0 72 65 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a  red and fails, .
1bcb0 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  ** return an SQL
1bcc0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ite error code. 
1bcd0 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
1bce0 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
1bcf0 69 6e 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c  int pagerUndoCal
1bd00 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78  lback(void *pCtx
1bd10 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69  , Pgno iPg){.  i
1bd20 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1bd30 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
1bd40 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43  er = (Pager *)pC
1bd50 74 78 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  tx;.  PgHdr *pPg
1bd60 3b 0a 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74  ;..  pPg = sqlit
1bd70 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50  e3PagerLookup(pP
1bd80 61 67 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66  ager, iPg);.  if
1bd90 28 20 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28  ( pPg ){.    if(
1bda0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
1bdb0 67 65 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d  geRefcount(pPg)=
1bdc0 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =1 ){.      sqli
1bdd0 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50  te3PcacheDrop(pP
1bde0 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
1bdf0 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62       rc = readDb
1be00 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
1be10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1be20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  OK ){.        pP
1be30 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
1be40 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pPg);.      }.  
1be50 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1be60 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
1be70 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d  }.  }..  /* Norm
1be80 61 6c 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73  ally, if a trans
1be90 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
1bea0 20 62 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75   back, any backu
1beb0 70 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a  p processes are.
1bec0 20 20 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20    ** updated as 
1bed0 64 61 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f  data is copied o
1bee0 75 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61  ut of the rollba
1bef0 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69  ck journal and i
1bf00 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  nto the.  ** dat
1bf10 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e  abase. This is n
1bf20 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73  ot generally pos
1bf30 73 69 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c  sible with a WAL
1bf40 20 64 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20   database, as.  
1bf50 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f  ** rollback invo
1bf60 6c 76 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e  lves simply trun
1bf70 63 61 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66  cating the log f
1bf80 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20  ile. Therefore, 
1bf90 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d  if one.  ** or m
1bfa0 6f 72 65 20 66 72 61 6d 65 73 20 68 61 76 65 20  ore frames have 
1bfb0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
1bfc0 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20  tten to the log 
1bfd0 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a  (and therefore .
1bfe0 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64    ** also copied
1bff0 20 69 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70   into the backup
1c000 20 64 61 74 61 62 61 73 65 73 29 20 61 73 20 70   databases) as p
1c010 61 72 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e  art of this tran
1c020 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68  saction,.  ** th
1c030 65 20 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62  e backups must b
1c040 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a  e restarted..  *
1c050 2f 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75  /.  sqlite3Backu
1c060 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d  pRestart(pPager-
1c070 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65  >pBackup);..  re
1c080 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1c090 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1c0a0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c  is called to rol
1c0b0 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74  lback a transact
1c0c0 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74  ion on a WAL dat
1c0d0 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
1c0e0 20 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61   int pagerRollba
1c0f0 63 6b 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61  ckWal(Pager *pPa
1c100 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ger){.  int rc; 
1c110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c120 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1c130 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64  n Code */.  PgHd
1c140 72 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20  r *pList;       
1c150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1c160 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67  ist of dirty pag
1c170 65 73 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a  es to revert */.
1c180 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61  .  /* For all pa
1c190 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
1c1a0 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e   that are curren
1c1b0 74 6c 79 20 64 69 72 74 79 20 6f 72 20 68 61 76  tly dirty or hav
1c1c0 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62  e already.  ** b
1c1d0 65 65 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74  een written (but
1c1e0 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20   not committed) 
1c1f0 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c  to the log file,
1c200 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a   do one of the .
1c210 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a    ** following:.
1c220 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69    **.  **   + Di
1c230 73 63 61 72 64 20 74 68 65 20 63 61 63 68 65 64  scard the cached
1c240 20 70 61 67 65 20 28 69 66 20 72 65 66 63 6f 75   page (if refcou
1c250 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20  nt==0), or.  ** 
1c260 20 20 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20    + Reload page 
1c270 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65  content from the
1c280 20 64 61 74 61 62 61 73 65 20 28 69 66 20 72 65   database (if re
1c290 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a  fcount>0)..  */.
1c2a0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1c2b0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69   = pPager->dbOri
1c2c0 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71  gSize;.  rc = sq
1c2d0 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61  lite3WalUndo(pPa
1c2e0 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72  ger->pWal, pager
1c2f0 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76  UndoCallback, (v
1c300 6f 69 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20  oid *)pPager);. 
1c310 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
1c320 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28  PcacheDirtyList(
1c330 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
1c340 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74  ;.  while( pList
1c350 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1c360 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  K ){.    PgHdr *
1c370 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70  pNext = pList->p
1c380 44 69 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20  Dirty;.    rc = 
1c390 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63  pagerUndoCallbac
1c3a0 6b 28 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72  k((void *)pPager
1c3b0 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a  , pList->pgno);.
1c3c0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78      pList = pNex
1c3d0 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  t;.  }..  return
1c3e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1c3f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1c400 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
1c410 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73  sqlite3WalFrames
1c420 28 29 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c  (). As well as l
1c430 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f  ogging.** the co
1c440 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69  ntents of the li
1c450 73 74 20 6f 66 20 70 61 67 65 73 20 68 65 61 64  st of pages head
1c460 65 64 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e  ed by pList (con
1c470 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79  nected by pDirty
1c480 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  ),.** this funct
1c490 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79  ion notifies any
1c4a0 20 61 63 74 69 76 65 20 62 61 63 6b 75 70 20 70   active backup p
1c4b0 72 6f 63 65 73 73 65 73 20 74 68 61 74 20 74 68  rocesses that th
1c4c0 65 20 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20  e pages have.** 
1c4d0 63 68 61 6e 67 65 64 2e 20 0a 2a 2f 20 0a 73 74  changed. .*/ .st
1c4e0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 57 61  atic int pagerWa
1c4f0 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67 65 72  lFrames(.  Pager
1c500 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
1c510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1c520 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
1c530 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20 20 20  PgHdr *pList,   
1c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c550 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61 6d 65  /* List of frame
1c560 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67  s to log */.  Pg
1c570 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20  no nTruncate,   
1c580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c590 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   Database size a
1c5a0 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d 69 74  fter this commit
1c5b0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d   */.  int isComm
1c5c0 69 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  it,             
1c5d0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1c5e0 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d 6d 69   this is a commi
1c5f0 74 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 5f  t */.  int sync_
1c600 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
1c610 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
1c620 74 6f 20 70 61 73 73 20 74 6f 20 4f 73 53 79 6e  to pass to OsSyn
1c630 63 28 29 20 28 6f 72 20 30 29 20 2a 2f 0a 29 7b  c() (or 0) */.){
1c640 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1c650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c660 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1c670 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
1c680 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a  pPager->pWal );.
1c690 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1c6a0 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e  lFrames(pPager->
1c6b0 70 57 61 6c 2c 20 0a 20 20 20 20 20 20 70 50 61  pWal, .      pPa
1c6c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
1c6d0 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c  List, nTruncate,
1c6e0 20 69 73 43 6f 6d 6d 69 74 2c 20 73 79 6e 63 5f   isCommit, sync_
1c6f0 66 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69 66 28  flags.  );.  if(
1c700 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1c710 26 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  & pPager->pBacku
1c720 70 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  p ){.    PgHdr *
1c730 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69  p;.    for(p=pLi
1c740 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72  st; p; p=p->pDir
1c750 74 79 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ty){.      sqlit
1c760 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70  e3BackupUpdate(p
1c770 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20  Pager->pBackup, 
1c780 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70  p->pgno, (u8 *)p
1c790 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  ->pData);.    }.
1c7a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1c7b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
1c7c0 61 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  a read transacti
1c7d0 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a  on on the WAL..*
1c7e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1c7f0 65 20 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c  e used to be cal
1c800 6c 65 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e  led "pagerOpenSn
1c810 61 70 73 68 6f 74 28 29 22 20 62 65 63 61 75 73  apshot()" becaus
1c820 65 20 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79  e it essentially
1c830 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70  .** makes a snap
1c840 73 68 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61  shot of the data
1c850 62 61 73 65 20 61 74 20 74 68 65 20 63 75 72 72  base at the curr
1c860 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d  ent point in tim
1c870 65 20 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a  e and preserves.
1c880 2a 2a 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74  ** that snapshot
1c890 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20   for use by the 
1c8a0 72 65 61 64 65 72 20 69 6e 20 73 70 69 74 65 20  reader in spite 
1c8b0 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20  of concurrently 
1c8c0 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74  changes by.** ot
1c8d0 68 65 72 20 77 72 69 74 65 72 73 20 6f 72 20 63  her writers or c
1c8e0 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f  heckpointers..*/
1c8f0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1c900 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
1c910 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
1c920 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ger){.  int rc; 
1c930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c940 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1c950 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
1c960 63 68 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20  changed = 0;    
1c970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c980 72 75 65 20 69 66 20 63 61 63 68 65 20 6d 75 73  rue if cache mus
1c990 74 20 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20  t be reset */.. 
1c9a0 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
1c9b0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
1c9c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1c9d0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1c9e0 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e  OPEN || pPager->
1c9f0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
1ca00 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71  ADER );..  /* sq
1ca10 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54  lite3WalEndReadT
1ca20 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73  ransaction() was
1ca30 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20   not called for 
1ca40 74 68 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a  the previous.  *
1ca50 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  * transaction in
1ca60 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58   locking_mode=EX
1ca70 43 4c 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c  CLUSIVE.  So cal
1ca80 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65  l it now.  If we
1ca90 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63  .  ** are in loc
1caa0 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c  king_mode=NORMAL
1cab0 20 61 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77   and EndRead() w
1cac0 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61  as previously ca
1cad0 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64  lled,.  ** the d
1cae0 75 70 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73  uplicate call is
1caf0 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a   harmless..  */.
1cb00 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52    sqlite3WalEndR
1cb10 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
1cb20 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20  Pager->pWal);.. 
1cb30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
1cb40 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
1cb50 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
1cb60 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20  l, &changed);.  
1cb70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cb80 4b 20 26 26 20 63 68 61 6e 67 65 64 20 29 7b 0a  K && changed ){.
1cb90 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1cba0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
1cbb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1cbc0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1cbd0 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70  n is called as p
1cbe0 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
1cbf0 69 74 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52  ition from PAGER
1cc00 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45  _OPEN.** to PAGE
1cc10 52 5f 52 45 41 44 45 52 20 73 74 61 74 65 20 74  R_READER state t
1cc20 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
1cc30 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1cc40 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20  base file.** in 
1cc50 70 61 67 65 73 20 28 61 73 73 75 6d 69 6e 67 20  pages (assuming 
1cc60 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 63 75  the page size cu
1cc70 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
1cc80 6e 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  n Pager.pageSize
1cc90 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65  )..**.** If no e
1cca0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c  rror occurs, SQL
1ccb0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1ccc0 65 64 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ed and the size 
1ccd0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
1cce0 2a 2a 20 69 6e 20 70 61 67 65 73 20 69 73 20 73  ** in pages is s
1ccf0 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50 61 67 65  tored in *pnPage
1cd00 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
1cd10 65 72 72 6f 72 20 63 6f 64 65 20 28 70 65 72 68  error code (perh
1cd20 61 70 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f  aps.** SQLITE_IO
1cd30 45 52 52 5f 46 53 54 41 54 29 20 69 73 20 72 65  ERR_FSTAT) is re
1cd40 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61  turned and *pnPa
1cd50 67 65 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64  ge is left unmod
1cd60 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ified..*/.static
1cd70 20 69 6e 74 20 70 61 67 65 72 50 61 67 65 63 6f   int pagerPageco
1cd80 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
1cd90 72 2c 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29  r, Pgno *pnPage)
1cda0 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20  {.  Pgno nPage; 
1cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdc0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
1cdd0 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61  return via *pnPa
1cde0 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72  ge */..  /* Quer
1cdf0 79 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79  y the WAL sub-sy
1ce00 73 74 65 6d 20 66 6f 72 20 74 68 65 20 64 61 74  stem for the dat
1ce10 61 62 61 73 65 20 73 69 7a 65 2e 20 54 68 65 20  abase size. The 
1ce20 57 61 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a  WalDbsize().  **
1ce30 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1ce40 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 57 41  s zero if the WA
1ce50 4c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69  L is not open (i
1ce60 2e 65 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d  .e. Pager.pWal==
1ce70 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74  0), or.  ** if t
1ce80 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1ce90 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
1cea0 65 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20  e. The database 
1ceb0 73 69 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  size is not.  **
1cec0 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20   available from 
1ced0 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74  the WAL sub-syst
1cee0 65 6d 20 69 66 20 74 68 65 20 6c 6f 67 20 66 69  em if the log fi
1cef0 6c 65 20 69 73 20 65 6d 70 74 79 20 6f 72 0a 20  le is empty or. 
1cf00 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   ** contains no 
1cf10 76 61 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64 20  valid committed 
1cf20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20  transactions..  
1cf30 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
1cf40 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1cf50 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73  ER_OPEN );.  ass
1cf60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
1cf70 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck>=SHARED_LOCK 
1cf80 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  || pPager->noRea
1cf90 64 6c 6f 63 6b 20 29 3b 0a 20 20 6e 50 61 67 65  dlock );.  nPage
1cfa0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73   = sqlite3WalDbs
1cfb0 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ize(pPager->pWal
1cfc0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1cfd0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77 61  database size wa
1cfe0 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
1cff0 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62  from the WAL sub
1d000 2d 73 79 73 74 65 6d 2c 0a 20 20 2a 2a 20 64 65  -system,.  ** de
1d010 74 65 72 6d 69 6e 65 20 69 74 20 62 61 73 65 64  termine it based
1d020 20 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20   on the size of 
1d030 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1d040 65 2e 20 49 66 20 74 68 65 20 73 69 7a 65 0a 20  e. If the size. 
1d050 20 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62   ** of the datab
1d060 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ase file is not 
1d070 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
1d080 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
1d090 73 69 7a 65 2c 0a 20 20 2a 2a 20 72 6f 75 6e 64  size,.  ** round
1d0a0 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6e 65 61   down to the nea
1d0b0 72 65 73 74 20 70 61 67 65 2e 20 45 78 63 65 70  rest page. Excep
1d0c0 74 2c 20 61 6e 79 20 66 69 6c 65 20 6c 61 72 67  t, any file larg
1d0d0 65 72 20 74 68 61 6e 20 30 0a 20 20 2a 2a 20 62  er than 0.  ** b
1d0e0 79 74 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20  ytes in size is 
1d0f0 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 63 6f  considered to co
1d100 6e 74 61 69 6e 20 61 74 20 6c 65 61 73 74 20 6f  ntain at least o
1d110 6e 65 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ne page..  */.  
1d120 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a  if( nPage==0 ){.
1d130 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20      i64 n = 0;  
1d140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d150 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62 20    /* Size of db 
1d160 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
1d170 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
1d180 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1d190 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
1d1a0 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69  ile );.    if( i
1d1b0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1d1c0 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  ) ){.      int r
1d1d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
1d1e0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
1d1f0 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  , &n);.      if(
1d200 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d210 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1d220 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1d230 20 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 28   }.    nPage = (
1d240 50 67 6e 6f 29 28 6e 20 2f 20 70 50 61 67 65 72  Pgno)(n / pPager
1d250 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1d260 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 26 26   if( nPage==0 &&
1d270 20 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 6e 50   n>0 ){.      nP
1d280 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  age = 1;.    }. 
1d290 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
1d2a0 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f  current number o
1d2b0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66  f pages in the f
1d2c0 69 6c 65 20 69 73 20 67 72 65 61 74 65 72 20 74  ile is greater t
1d2d0 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e  han the.  ** con
1d2e0 66 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20  figured maximum 
1d2f0 70 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e  pager number, in
1d300 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77  crease the allow
1d310 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a  ed limit so.  **
1d320 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63   that the file c
1d330 61 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f  an be read..  */
1d340 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61  .  if( nPage>pPa
1d350 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
1d360 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
1d370 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b  o = (Pgno)nPage;
1d380 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20  .  }..  *pnPage 
1d390 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = nPage;.  retur
1d3a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1d3b0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20  ./*.** Check if 
1d3c0 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74  the *-wal file t
1d3d0 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
1d3e0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1d3f0 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67 65 72  opened by pPager
1d400 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20 74 68  .** exists if th
1d410 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
1d420 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72 69 66  t empy, or verif
1d430 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77 61 6c  y that the *-wal
1d440 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   file does.** no
1d450 74 20 65 78 69 73 74 20 28 62 79 20 64 65 6c 65  t exist (by dele
1d460 74 69 6e 67 20 69 74 29 20 69 66 20 74 68 65 20  ting it) if the 
1d470 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1d480 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66   empty..**.** If
1d490 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1d4a0 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64 20 74   not empty and t
1d4b0 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78  he *-wal file ex
1d4c0 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 70  ists, open the p
1d4d0 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d  ager.** in WAL m
1d4e0 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64 61 74  ode.  If the dat
1d4f0 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 20 6f  abase is empty o
1d500 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69  r if no *-wal fi
1d510 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a  le exists and.**
1d520 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
1d530 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50  urs, make sure P
1d540 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ager.journalMode
1d550 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a   is not set to.*
1d560 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  * PAGER_JOURNALM
1d570 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52  ODE_WAL..**.** R
1d580 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1d590 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
1d5a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
1d5b0 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53  er must hold a S
1d5c0 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  HARED lock on th
1d5d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1d5e0 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20  to call this.** 
1d5f0 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73  function. Becaus
1d600 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
1d610 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69  ock on the db fi
1d620 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 74  le is required t
1d630 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57  o delete .** a W
1d640 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70  AL on a none-emp
1d650 74 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 69  ty database, thi
1d660 73 20 65 6e 73 75 72 65 73 20 74 68 65 72 65 20  s ensures there 
1d670 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69  is no race condi
1d680 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e  tion .** between
1d690 20 74 68 65 20 78 41 63 63 65 73 73 28 29 20 62   the xAccess() b
1d6a0 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44 65 6c  elow and an xDel
1d6b0 65 74 65 28 29 20 62 65 69 6e 67 20 65 78 65 63  ete() being exec
1d6c0 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a  uted by some .**
1d6d0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
1d6e0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1d6f0 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
1d700 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50  resent(Pager *pP
1d710 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
1d720 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
1d730 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1d740 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
1d750 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
1d760 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48  Pager->eLock>=SH
1d770 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61  ARED_LOCK || pPa
1d780 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
1d790 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  );..  if( !pPage
1d7a0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
1d7b0 20 20 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20     int isWal;   
1d7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7d0 20 2f 2a 20 54 72 75 65 20 69 66 20 57 41 4c 20   /* True if WAL 
1d7e0 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20  file exists */. 
1d7f0 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20     Pgno nPage;  
1d800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d810 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1d820 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1d830 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ..    rc = pager
1d840 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
1d850 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  , &nPage);.    i
1d860 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1d870 63 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65  c;.    if( nPage
1d880 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
1d890 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
1d8a0 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
1d8b0 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29  pPager->zWal, 0)
1d8c0 3b 0a 20 20 20 20 20 20 69 73 57 61 6c 20 3d 20  ;.      isWal = 
1d8d0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1d8e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d8f0 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20  OsAccess(.      
1d900 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73      pPager->pVfs
1d910 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20  , pPager->zWal, 
1d920 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
1d930 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20 20 20  ISTS, &isWal.   
1d940 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
1d950 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d960 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
1d970 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  sWal ){.        
1d980 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
1d990 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74  3PcachePagecount
1d9a0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1d9b0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
1d9c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1d9d0 72 4f 70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c  rOpenWal(pPager,
1d9e0 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
1d9f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1da00 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
1da10 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
1da20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1da30 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
1da40 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
1da50 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20  DE_DELETE;.     
1da60 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
1da70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
1da80 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  if../*.** Playba
1da90 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61  ck savepoint pSa
1daa0 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20  vepoint. Or, if 
1dab0 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c  pSavepoint==NULL
1dac0 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a  , then playback.
1dad0 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ** the entire ma
1dae0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1daf0 65 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76  e. The case pSav
1db00 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63  epoint==NULL occ
1db10 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52  urs when .** a R
1db20 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61  OLLBACK TO comma
1db30 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  nd is invoked on
1db40 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61   a SAVEPOINT tha
1db50 74 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  t is a transacti
1db60 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  on .** savepoint
1db70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61  ..**.** When pSa
1db80 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e  vepoint is not N
1db90 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e  ULL (meaning a n
1dba0 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  on-transaction s
1dbb0 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20  avepoint is .** 
1dbc0 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
1dbd0 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  k), then the rol
1dbe0 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f  lback consists o
1dbf0 66 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74  f up to three st
1dc00 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d  ages,.** perform
1dc10 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
1dc20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a  specified:.**.**
1dc30 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70     * Pages are p
1dc40 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
1dc50 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
1dc60 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74   starting at byt
1dc70 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20  e.**     offset 
1dc80 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
1dc90 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69  Offset and conti
1dca0 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20  nuing to .**    
1dcb0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
1dcc0 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74  iHdrOffset, or t
1dcd0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
1dce0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   main journal.**
1dcf0 20 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67       file if Pag
1dd00 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
1dd10 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a  Offset is zero..
1dd20 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67  **.**   * If Pag
1dd30 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
1dd40 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65  Offset is not ze
1dd50 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  ro, then pages a
1dd60 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20  re played.**    
1dd70 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66   back starting f
1dd80 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
1dd90 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65  header immediate
1dda0 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a  ly following .**
1ddb0 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
1ddc0 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74  int.iHdrOffset t
1ddd0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
1dde0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
1ddf0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61  le..**.**   * Pa
1de00 67 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61  ges are then pla
1de10 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
1de20 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  e sub-journal fi
1de30 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20  le, starting.** 
1de40 20 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67      with the Pag
1de50 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62  erSavepoint.iSub
1de60 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  Rec and continui
1de70 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ng to the end of
1de80 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72  .**     the jour
1de90 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
1dea0 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72  Throughout the r
1deb0 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c  ollback process,
1dec0 20 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67   each time a pag
1ded0 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  e is rolled back
1dee0 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70  , the.** corresp
1def0 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
1df00 74 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74  t in a bitvec st
1df10 72 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c  ructure (variabl
1df20 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a  e pDone in the.*
1df30 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
1df40 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73   below). This is
1df50 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
1df60 74 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f  that a page is o
1df70 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61  nly.** rolled ba
1df80 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
1df90 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65  e it is encounte
1dfa0 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f  red in either jo
1dfb0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
1dfc0 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55  pSavepoint is NU
1dfd0 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  LL, then pages a
1dfe0 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62  re only played b
1dff0 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
1e000 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  n.** journal fil
1e010 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  e. There is no n
1e020 65 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63  eed for a bitvec
1e030 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
1e040 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63  *.** In either c
1e050 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79  ase, before play
1e060 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74  back commences t
1e070 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20  he Pager.dbSize 
1e080 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72  variable.** is r
1e090 65 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75  eset to the valu
1e0a0 65 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61  e that it held a
1e0b0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
1e0c0 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a  he savepoint .**
1e0d0 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e   (or transaction
1e0e0 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20  ). No page with 
1e0f0 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72  a page-number gr
1e100 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20  eater than this 
1e110 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79  value.** is play
1e120 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20  ed back. If one 
1e130 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
1e140 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70  t is simply skip
1e150 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ped..*/.static i
1e160 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  nt pagerPlayback
1e170 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
1e180 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61  *pPager, PagerSa
1e190 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f  vepoint *pSavepo
1e1a0 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b  int){.  i64 szJ;
1e1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1c0 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69   /* Effective si
1e1d0 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ze of the main j
1e1e0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
1e1f0 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
1e200 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66       /* End of f
1e210 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20  irst segment of 
1e220 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63  main-journal rec
1e230 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ords */.  int rc
1e240 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
1e250 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1e260 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
1e270 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Done = 0;       
1e280 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73  /* Bitvec to ens
1e290 75 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64  ure pages played
1e2a0 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20   back only once 
1e2b0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
1e2c0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
1e2d0 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61  GER_ERROR );.  a
1e2e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1e2f0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
1e300 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20  TER_LOCKED );.. 
1e310 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62   /* Allocate a b
1e320 69 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20  itvec to use to 
1e330 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66  store the set of
1e340 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61   pages rolled ba
1e350 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  ck */.  if( pSav
1e360 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44  epoint ){.    pD
1e370 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74  one = sqlite3Bit
1e380 76 65 63 43 72 65 61 74 65 28 70 53 61 76 65 70  vecCreate(pSavep
1e390 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20  oint->nOrig);.  
1e3a0 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a    if( !pDone ){.
1e3b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e3c0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
1e3d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
1e3e0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1e3f0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c   back to the val
1e400 75 65 20 69 74 20 77 61 73 20 62 65 66 6f 72 65  ue it was before
1e410 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
1e420 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72    ** being rever
1e430 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a  ted was opened..
1e440 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64    */.  pPager->d
1e450 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69  bSize = pSavepoi
1e460 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d  nt ? pSavepoint-
1e470 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d  >nOrig : pPager-
1e480 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70  >dbOrigSize;.  p
1e490 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
1e4a0 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
1e4b0 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66  >tempFile;..  if
1e4c0 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20 26 26  ( !pSavepoint &&
1e4d0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1e4e0 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
1e4f0 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  rn pagerRollback
1e500 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  Wal(pPager);.  }
1e510 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65  ..  /* Use pPage
1e520 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73  r->journalOff as
1e530 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
1e540 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ize of the main 
1e550 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
1e560 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75  urnal.  The actu
1e570 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65  al file might be
1e580 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
1e590 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f  s in.  ** PAGER_
1e5a0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
1e5b0 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f  CATE or PAGER_JO
1e5c0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
1e5d0 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67  T.  But anything
1e5e0 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65  .  ** past pPage
1e5f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73  r->journalOff is
1e600 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75   off-limits to u
1e610 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20  s..  */.  szJ = 
1e620 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1e630 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61  ff;.  assert( pa
1e640 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
1e650 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29  )==0 || szJ==0 )
1e660 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79  ;..  /* Begin by
1e670 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65   rolling back re
1e680 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d  cords from the m
1e690 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
1e6a0 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67  ting at.  ** Pag
1e6b0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66  erSavepoint.iOff
1e6c0 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  set and continui
1e6d0 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a  ng to the next j
1e6e0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20  ournal header.. 
1e6f0 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20   ** There might 
1e700 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68  be records in th
1e710 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74  e main journal t
1e720 68 61 74 20 68 61 76 65 20 61 20 70 61 67 65 20  hat have a page 
1e730 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61  number.  ** grea
1e740 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
1e750 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 73 69  rent database si
1e760 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ze (pPager->dbSi
1e770 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20  ze) but those.  
1e780 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70  ** will be skipp
1e790 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
1e7a0 2e 20 20 50 61 67 65 73 20 61 72 65 20 61 64 64  .  Pages are add
1e7b0 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74  ed to pDone as t
1e7c0 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61  hey.  ** are pla
1e7d0 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  yed back..  */. 
1e7e0 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20   if( pSavepoint 
1e7f0 26 26 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  && !pagerUseWal(
1e800 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69  pPager) ){.    i
1e810 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70 6f  HdrOff = pSavepo
1e820 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
1e830 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48  ? pSavepoint->iH
1e840 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a  drOffset : szJ;.
1e850 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1e860 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70 6f  nalOff = pSavepo
1e870 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  int->iOffset;.  
1e880 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
1e890 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
1e8a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64  ->journalOff<iHd
1e8b0 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72 63  rOff ){.      rc
1e8c0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
1e8d0 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
1e8e0 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r, &pPager->jour
1e8f0 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31  nalOff, pDone, 1
1e900 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
1e910 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
1e920 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c  TE_DONE );.  }el
1e930 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
1e940 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
1e950 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e    }..  /* Contin
1e960 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ue rolling back 
1e970 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66 20 74  records out of t
1e980 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
1e990 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a  starting at.  **
1e9a0 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
1e9b0 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e 20 61  al header seen a
1e9c0 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e  nd continuing un
1e9d0 74 69 6c 20 74 68 65 20 65 66 66 65 63 74 69 76  til the effectiv
1e9e0 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68  e end.  ** of th
1e9f0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
1ea00 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74  ile.  Continue t
1ea10 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61  o skip out-of-ra
1ea20 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a 20 20  nge pages and.  
1ea30 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64 64 69  ** continue addi
1ea40 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20  ng pages rolled 
1ea50 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20  back to pDone.. 
1ea60 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   */.  while( rc=
1ea70 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
1ea80 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1ea90 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20  <szJ ){.    u32 
1eaa0 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ii;            /
1eab0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
1eac0 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20  /.    u32 nJRec 
1ead0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  = 0;     /* Numb
1eae0 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65  er of Journal Re
1eaf0 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32  cords */.    u32
1eb00 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d   dummy;.    rc =
1eb10 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
1eb20 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20  pPager, 0, szJ, 
1eb30 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b  &nJRec, &dummy);
1eb40 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
1eb50 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
1eb60 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
1eb70 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72  he "pPager->jour
1eb80 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
1eb90 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
1eba0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1ebb0 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 69  f".    ** test i
1ebc0 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74 69 63  s related to tic
1ebd0 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65 65 20  ket #2565.  See 
1ebe0 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20 69  the discussion i
1ebf0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  n the.    ** pag
1ec00 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 66 75  er_playback() fu
1ec10 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74  nction for addit
1ec20 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
1ec30 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
1ec40 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20  ( nJRec==0 .    
1ec50 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
1ec60 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
1ec70 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
1ec80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1ec90 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e  f.    ){.      n
1eca0 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28 73 7a  JRec = (u32)((sz
1ecb0 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
1ecc0 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f  nalOff)/JOURNAL_
1ecd0 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a  PG_SZ(pPager));.
1ece0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
1ecf0 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
1ed00 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26 26  K && ii<nJRec &&
1ed10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1ed20 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a  Off<szJ; ii++){.
1ed30 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1ed40 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
1ed50 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  ge(pPager, &pPag
1ed60 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
1ed70 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20  pDone, 1, 1);.  
1ed80 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1ed90 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
1eda0 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
1edb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
1edc0 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
1edd0 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20  lOff>=szJ );..  
1ede0 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c  /* Finally,  rol
1edf0 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d  lback pages from
1ee00 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
1ee10 2e 20 20 50 61 67 65 20 74 68 61 74 20 77 65 72  .  Page that wer
1ee20 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c  e.  ** previousl
1ee30 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75  y rolled back ou
1ee40 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
1ee50 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68  urnal (and are h
1ee60 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20  ence in pDone). 
1ee70 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70   ** will be skip
1ee80 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e  ped.  Out-of-ran
1ee90 67 65 20 70 61 67 65 73 20 61 72 65 20 61 6c 73  ge pages are als
1eea0 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a  o skipped..  */.
1eeb0 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
1eec0 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20   ){.    u32 ii; 
1eed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1eee0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1eef0 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70    i64 offset = p
1ef00 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
1ef10 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
1ef20 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66  geSize);..    if
1ef30 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
1ef40 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
1ef50 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61  c = sqlite3WalSa
1ef60 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67  vepointUndo(pPag
1ef70 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70  er->pWal, pSavep
1ef80 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b  oint->aWalData);
1ef90 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
1efa0 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53  i=pSavepoint->iS
1efb0 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54  ubRec; rc==SQLIT
1efc0 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65  E_OK && ii<pPage
1efd0 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b  r->nSubRec; ii++
1efe0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1eff0 20 6f 66 66 73 65 74 3d 3d 69 69 2a 28 34 2b 70   offset==ii*(4+p
1f000 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1f010 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
1f020 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
1f030 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
1f040 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30  offset, pDone, 0
1f050 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
1f060 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
1f070 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a  TE_DONE );.  }..
1f080 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
1f090 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20  estroy(pDone);. 
1f0a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1f0b0 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
1f0c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
1f0d0 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  zJ;.  }..  retur
1f0e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
1f0f0 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
1f100 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
1f110 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
1f120 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f   are allowed..*/
1f130 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
1f140 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50  erSetCachesize(P
1f150 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
1f160 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c  t mxPage){.  sql
1f170 69 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63  ite3PcacheSetCac
1f180 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  hesize(pPager->p
1f190 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b  PCache, mxPage);
1f1a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
1f1b0 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20   the robustness 
1f1c0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1f1d0 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
1f1e0 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f   OS crashes.** o
1f1f0 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
1f200 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65   by changing the
1f210 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
1f220 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
1f230 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
1f240 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65   journal.  There
1f250 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c   are three level
1f260 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20  s:.**.**    OFF 
1f270 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
1f280 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
1f290 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20  alled.  This is 
1f2a0 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20  the default.**  
1f2b0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
1f2c0 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72  temporary and tr
1f2d0 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a  ansient files..*
1f2e0 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20  *.**    NORMAL  
1f2f0 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
1f300 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66   synced once bef
1f310 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
1f320 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
1f330 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
1f340 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
1f350 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f  lly adequate pro
1f360 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  tection, but.** 
1f370 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20               it 
1f380 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79  is theoretically
1f390 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67   possible, thoug
1f3a0 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c  h very unlikely,
1f3b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1f3c0 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74   that an inopert
1f3d0 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72  une power failur
1f3e0 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68  e could leave th
1f3f0 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
1f400 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73            in a s
1f410 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64  tate which would
1f420 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f   cause damage to
1f430 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
1f440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
1f450 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20  en it is rolled 
1f460 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46  back..**.**    F
1f470 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75  ULL      The jou
1f480 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74  rnal is synced t
1f490 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  wice before writ
1f4a0 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
1f4b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1f4c0 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73  database (with s
1f4d0 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  ome additional i
1f4e0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65  nformation - the
1f4f0 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20   nRec field.**  
1f500 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
1f510 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
1f520 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65  r - being writte
1f530 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  n in between the
1f540 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20   two.**         
1f550 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66       syncs).  If
1f560 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   we assume that 
1f570 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20  writing a.**    
1f580 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65            single
1f590 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20   disk sector is 
1f5a0 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69  atomic, then thi
1f5b0 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a  s mode provides.
1f5c0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1f5d0 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74  assurance that t
1f5e0 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20  he journal will 
1f5f0 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
1f600 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
1f610 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66          point of
1f620 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20   causing damage 
1f630 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1f640 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e  during rollback.
1f650 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76  .**.** Numeric v
1f660 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64  alues associated
1f670 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74   with these stat
1f680 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e  es are OFF==1, N
1f690 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20  ORMAL=2,.** and 
1f6a0 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64  FULL=3..*/.#ifnd
1f6b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
1f6c0 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69  AGER_PRAGMAS.voi
1f6d0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
1f6e0 74 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67  tSafetyLevel(Pag
1f6f0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
1f700 6c 65 76 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c  level, int bFull
1f710 46 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72  Fsync){.  pPager
1f720 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76  ->noSync =  (lev
1f730 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d  el==1 || pPager-
1f740 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b  >tempFile) ?1:0;
1f750 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
1f760 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20  ync = (level==3 
1f770 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
1f780 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50  File) ?1:0;.  pP
1f790 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
1f7a0 20 3d 20 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53   = (bFullFsync?S
1f7b0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a  QLITE_SYNC_FULL:
1f7c0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
1f7d0 41 4c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  AL);.}.#endif../
1f7e0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1f7f0 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
1f800 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  le is incremente
1f810 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c  d whenever the l
1f820 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70  ibrary.** attemp
1f830 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  ts to open a tem
1f840 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68  porary file.  Th
1f850 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
1f860 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65  s used for.** te
1f870 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
1f880 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69  is only.  .*/.#i
1f890 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
1f8a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
1f8b0 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b  ntemp_count = 0;
1f8c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
1f8d0 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
1f8e0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74  file..**.** Writ
1f8f0 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
1f900 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c  iptor into *pFil
1f910 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  e. Return SQLITE
1f920 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 0a  _OK on success .
1f930 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ** or some other
1f940 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
1f950 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77  e fail. The OS w
1f960 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
1f970 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65  y .** delete the
1f980 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
1f990 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
1f9a0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  d..**.** The fla
1f9b0 67 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  gs passed to the
1f9c0 20 56 46 53 20 6c 61 79 65 72 20 78 4f 70 65 6e   VFS layer xOpen
1f9d0 28 29 20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73  () call are thos
1f9e0 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62  e specified.** b
1f9f0 79 20 70 61 72 61 6d 65 74 65 72 20 76 66 73 46  y parameter vfsF
1fa00 6c 61 67 73 20 4f 52 65 64 20 77 69 74 68 20 74  lags ORed with t
1fa10 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
1fa20 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
1fa30 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a  PEN_READWRITE.**
1fa40 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1fa50 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20 20 20 53  _CREATE.**     S
1fa60 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
1fa70 53 49 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  SIVE.**     SQLI
1fa80 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
1fa90 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20  CLOSE.*/.static 
1faa0 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d  int pagerOpentem
1fab0 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  p(.  Pager *pPag
1fac0 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  er,        /* Th
1fad0 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  e pager object *
1fae0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
1faf0 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69   *pFile,  /* Wri
1fb00 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  te the file desc
1fb10 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20  riptor here */. 
1fb20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20   int vfsFlags   
1fb30 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
1fb40 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
1fb50 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a  o the VFS */.){.
1fb60 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1fb70 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1fb80 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65  n code */..#ifde
1fb90 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
1fba0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
1fbb0 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73  _count++;  /* Us
1fbc0 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
1fbd0 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
1fbe0 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66   */.#endif..  vf
1fbf0 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54  sFlags |=  SQLIT
1fc00 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1fc10 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
1fc20 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20  REATE |.        
1fc30 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1fc40 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49  EXCLUSIVE | SQLI
1fc50 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
1fc60 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71  CLOSE;.  rc = sq
1fc70 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61 67  lite3OsOpen(pPag
1fc80 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46 69  er->pVfs, 0, pFi
1fc90 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29  le, vfsFlags, 0)
1fca0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
1fcb0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
1fcc0 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20 20  pen(pFile) );.  
1fcd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1fce0 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79  .** Set the busy
1fcf0 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f   handler functio
1fd00 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  n..**.** The pag
1fd10 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 62  er invokes the b
1fd20 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20 73  usy-handler if s
1fd30 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72  qlite3OsLock() r
1fd40 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54  eturns .** SQLIT
1fd50 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79 69  E_BUSY when tryi
1fd60 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ng to upgrade fr
1fd70 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20  om no-lock to a 
1fd80 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20  SHARED lock,.** 
1fd90 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74  or when trying t
1fda0 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61  o upgrade from a
1fdb0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74   RESERVED lock t
1fdc0 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a  o an EXCLUSIVE .
1fdd0 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73  ** lock. It does
1fde0 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68   *not* invoke th
1fdf0 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77  e busy handler w
1fe00 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72  hen upgrading fr
1fe10 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f 20  om.** SHARED to 
1fe20 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68 65  RESERVED, or whe
1fe30 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d  n upgrading from
1fe40 20 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c 55   SHARED to EXCLU
1fe50 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f  SIVE.** (which o
1fe60 63 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f 74  ccurs during hot
1fe70 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
1fe80 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a  k). Summary:.**.
1fe90 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e 20  **   Transition 
1fea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1feb0 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73         | Invokes
1fec0 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a   xBusyHandler.**
1fed0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
1fee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ff00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
1ff10 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d   NO_LOCK       -
1ff20 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20  > SHARED_LOCK   
1ff30 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48     | Yes.**   SH
1ff40 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52  ARED_LOCK   -> R
1ff50 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20  ESERVED_LOCK    
1ff60 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44  | No.**   SHARED
1ff70 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55  _LOCK   -> EXCLU
1ff80 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f  SIVE_LOCK   | No
1ff90 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f 4c  .**   RESERVED_L
1ffa0 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  OCK -> EXCLUSIVE
1ffb0 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a  _LOCK   | Yes.**
1ffc0 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79 2d  .** If the busy-
1ffd0 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
1ffe0 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
1fff0 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a  o, the lock is .
20000 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20 69  ** retried. If i
20010 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20  t returns zero, 
20020 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  then the SQLITE_
20030 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a  BUSY error is.**
20040 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
20050 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20 70   caller of the p
20060 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f  ager API functio
20070 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
20080 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
20090 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a  ndler(.  Pager *
200a0 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
200b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
200c0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
200d0 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61  .  int (*xBusyHa
200e0 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c 20  ndler)(void *), 
200f0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
20100 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c  er to busy-handl
20110 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  er function */. 
20120 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64   void *pBusyHand
20130 6c 65 72 41 72 67 20 20 20 20 20 20 20 20 20 20  lerArg          
20140 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
20150 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42 75  t to pass to xBu
20160 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20  syHandler */.){ 
20170 20 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73   .  pPager->xBus
20180 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79  yHandler = xBusy
20190 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65  Handler;.  pPage
201a0 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
201b0 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65  rg = pBusyHandle
201c0 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rArg;.}../*.** C
201d0 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73  hange the page s
201e0 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
201f0 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68  Pager object. Th
20200 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  e new page size 
20210 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e  .** is passed in
20220 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a   *pPageSize..**.
20230 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
20240 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
20250 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
20260 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
20270 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e  ed, it.** is a n
20280 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20  o-op. The value 
20290 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
202a0 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f  error state erro
202b0 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a  r code (i.e. .**
202c0 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49   one of SQLITE_I
202d0 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
202e0 52 55 50 54 20 6f 72 20 53 51 4c 49 54 45 5f 46  RUPT or SQLITE_F
202f0 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ULL)..**.** Othe
20300 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66  rwise, if all of
20310 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
20320 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
20330 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 20   * the new page 
20340 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a  size (value of *
20350 70 50 61 67 65 53 69 7a 65 29 20 69 73 20 76 61  pPageSize) is va
20360 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a  lid (a power .**
20370 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77       of two betw
20380 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49  een 512 and SQLI
20390 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
203a0 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e  , inclusive), an
203b0 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72  d.**.**   * ther
203c0 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
203d0 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65  ding page refere
203e0 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  nces, and.**.** 
203f0 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65    * the database
20400 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61   is either not a
20410 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
20420 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a  base or it is.**
20430 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72       an in-memor
20440 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  y database that 
20450 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73  currently consis
20460 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73  ts of zero pages
20470 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ..**.** then the
20480 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61   pager object pa
20490 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74  ge size is set t
204a0 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a  o *pPageSize..**
204b0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
204c0 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c  size is changed,
204d0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
204e0 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33  ion uses sqlite3
204f0 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a  PagerMalloc() .*
20500 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65  * to obtain a ne
20510 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  w Pager.pTmpSpac
20520 65 20 62 75 66 66 65 72 2e 20 49 66 20 74 68 69  e buffer. If thi
20530 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74  s allocation att
20540 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20  empt .** fails, 
20550 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
20560 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
20570 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69   page size remai
20580 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a  ns unchanged. .*
20590 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63  * In all other c
205a0 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ases, SQLITE_OK 
205b0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
205c0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73  ** If the page s
205d0 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67  ize is not chang
205e0 65 64 2c 20 65 69 74 68 65 72 20 62 65 63 61 75  ed, either becau
205f0 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e  se one of the en
20600 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64  umerated.** cond
20610 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20  itions above is 
20620 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70 61  not true, the pa
20630 67 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72  ger was in error
20640 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
20650 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  .** function was
20660 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61   called, or beca
20670 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  use the memory a
20680 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
20690 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68  t failed, .** th
206a0 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73  en *pPageSize is
206b0 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c   set to the old,
206c0 20 72 65 74 61 69 6e 65 64 20 70 61 67 65 20 73   retained page s
206d0 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ize before retur
206e0 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
206f0 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
20700 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
20710 65 72 2c 20 75 31 36 20 2a 70 50 61 67 65 53 69  er, u16 *pPageSi
20720 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
20730 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50  ){.  int rc = pP
20740 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a  ager->errCode;..
20750 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70    /* It is not p
20760 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 61 20  ossible to do a 
20770 66 75 6c 6c 20 61 73 73 65 72 74 5f 70 61 67 65  full assert_page
20780 72 5f 73 74 61 74 65 28 29 20 68 65 72 65 2c 20  r_state() here, 
20790 61 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  as this.  ** fun
207a0 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
207b0 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
207c0 50 61 67 65 72 4f 70 65 6e 28 29 2c 20 62 65 66  PagerOpen(), bef
207d0 6f 72 65 20 74 68 65 20 73 74 61 74 65 0a 20 20  ore the state.  
207e0 2a 2a 20 6f 66 20 74 68 65 20 50 61 67 65 72 20  ** of the Pager 
207f0 6f 62 6a 65 63 74 20 69 73 20 69 6e 74 65 72 6e  object is intern
20800 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e  ally consistent.
20810 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
20820 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
20830 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
20840 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
20850 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
20860 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 31 36 20  E_OK ){.    u16 
20870 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67  pageSize = *pPag
20880 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72  eSize;.    asser
20890 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c  t( pageSize==0 |
208a0 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  | (pageSize>=512
208b0 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
208c0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
208d0 5a 45 29 20 29 3b 0a 20 20 20 20 69 66 28 20 28  ZE) );.    if( (
208e0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30  pPager->memDb==0
208f0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69   || pPager->dbSi
20900 7a 65 3d 3d 30 29 0a 20 20 20 20 20 26 26 20 73  ze==0).     && s
20910 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
20920 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
20930 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 20 20 26  ache)==0 .     &
20940 26 20 70 61 67 65 53 69 7a 65 20 26 26 20 70 61  & pageSize && pa
20950 67 65 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e  geSize!=pPager->
20960 70 61 67 65 53 69 7a 65 20 0a 20 20 20 20 29 7b  pageSize .    ){
20970 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 4e 65  .      char *pNe
20980 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
20990 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73     /* New temp s
209a0 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 69 36  pace */.      i6
209b0 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 20  4 nByte = 0;.   
209c0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
209d0 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e  State>PAGER_OPEN
209e0 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
209f0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20  r->fd) ){.      
20a00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
20a10 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
20a20 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  >fd, &nByte);.  
20a30 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
20a40 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
20a50 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
20a60 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61 72 20     pNew = (char 
20a70 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  *)sqlite3PageMal
20a80 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20  loc(pageSize);. 
20a90 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29       if( !pNew )
20aa0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
20ab0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
20ac0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20ad0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
20ae0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70  ager);.        p
20af0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
20b00 6e 42 79 74 65 2f 70 61 67 65 53 69 7a 65 3b 0a  nByte/pageSize;.
20b10 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
20b20 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
20b30 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ize;.        sql
20b40 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61  ite3PageFree(pPa
20b50 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
20b60 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
20b70 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65  >pTmpSpace = pNe
20b80 77 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  w;.        sqlit
20b90 65 33 50 63 61 63 68 65 53 65 74 50 61 67 65 53  e3PcacheSetPageS
20ba0 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
20bb0 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a  che, pageSize);.
20bc0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20bd0 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 28    *pPageSize = (
20be0 75 31 36 29 70 50 61 67 65 72 2d 3e 70 61 67 65  u16)pPager->page
20bf0 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 6e 52  Size;.    if( nR
20c00 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65  eserve<0 ) nRese
20c10 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  rve = pPager->nR
20c20 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65  eserve;.    asse
20c30 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20  rt( nReserve>=0 
20c40 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30  && nReserve<1000
20c50 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
20c60 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31 36 29  nReserve = (i16)
20c70 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61  nReserve;.    pa
20c80 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50  gerReportSize(pP
20c90 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
20ca0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
20cb0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
20cc0 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72  r to the "tempor
20cd0 61 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72  ary page" buffer
20ce0 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79   held internally
20cf0 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72  .** by the pager
20d00 2e 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66  .  This is a buf
20d10 66 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20  fer that is big 
20d20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
20d30 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e  he.** entire con
20d40 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61  tent of a databa
20d50 73 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62  se page.  This b
20d60 75 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e  uffer is used in
20d70 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69  ternally.** duri
20d80 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20  ng rollback and 
20d90 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74  will be overwrit
20da0 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72  ten whenever a r
20db0 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72  ollback.** occur
20dc0 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f  s.  But other mo
20dd0 64 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74  dules are free t
20de0 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73  o use it too, as
20df0 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72   long as.** no r
20e00 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70  ollbacks are hap
20e10 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20  pening..*/.void 
20e20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d  *sqlite3PagerTem
20e30 70 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50  pSpace(Pager *pP
20e40 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
20e50 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
20e60 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  e;.}../*.** Atte
20e70 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d  mpt to set the m
20e80 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20  aximum database 
20e90 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78  page count if mx
20ea0 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
20eb0 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68  . .** Make no ch
20ec0 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20  anges if mxPage 
20ed0 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74  is zero or negat
20ee0 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20  ive.  And never 
20ef0 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61  reduce the.** ma
20f00 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
20f10 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65   below the curre
20f20 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
20f30 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52  atabase..**.** R
20f40 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50  egardless of mxP
20f50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
20f60 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20  current maximum 
20f70 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69  page count..*/.i
20f80 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  nt sqlite3PagerM
20f90 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65  axPageCount(Page
20fa0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
20fb0 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78  xPage){.  if( mx
20fc0 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50  Page>0 ){.    pP
20fd0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d  ager->mxPgno = m
20fe0 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28  xPage;.  }.  if(
20ff0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
21000 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 70  =PAGER_OPEN && p
21010 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3c 70 50  Pager->mxPgno<pP
21020 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
21030 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
21040 6e 6f 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  no = pPager->dbS
21050 69 7a 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ize;.  }.  retur
21060 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  n pPager->mxPgno
21070 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
21080 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20  ollowing set of 
21090 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
210a0 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
210b0 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f   simulated.** I/
210c0 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73  O error mechanis
210d0 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e  m.  These routin
210e0 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  es are used to a
210f0 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a  void simulated.*
21100 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63  * errors in plac
21110 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  es where we do n
21120 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72  ot care about er
21130 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65  rors..**.** Unle
21140 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54  ss -DSQLITE_TEST
21150 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73  =1 is used, thes
21160 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61  e routines are a
21170 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64  ll no-ops.** and
21180 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64   generate no cod
21190 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
211a0 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20  ITE_TEST.extern 
211b0 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
211c0 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78  rror_pending;.ex
211d0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
211e0 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73  _io_error_hit;.s
211f0 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f  tatic int saved_
21200 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c  cnt;.void disabl
21210 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
21220 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
21230 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74  aved_cnt = sqlit
21240 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
21250 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ing;.  sqlite3_i
21260 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
21270 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61  = -1;.}.void ena
21280 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
21290 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
212a0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
212b0 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65  r_pending = save
212c0 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23  d_cnt;.}.#else.#
212d0 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f   define disable_
212e0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
212f0 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65  ors().# define e
21300 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
21310 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64  io_errors().#end
21320 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  if../*.** Read t
21330 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73  he first N bytes
21340 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e   from the beginn
21350 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ing of the file 
21360 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74  into memory.** t
21370 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73  hat pDest points
21380 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74   to. .**.** If t
21390 68 65 20 70 61 67 65 72 20 77 61 73 20 6f 70 65  he pager was ope
213a0 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65  ned on a transie
213b0 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61  nt file (zFilena
213c0 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f  me==""), or.** o
213d0 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20  pened on a file 
213e0 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65  less than N byte
213f0 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f  s in size, the o
21400 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73 0a  utput buffer is.
21410 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51  ** zeroed and SQ
21420 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
21430 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20  . The rationale 
21440 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74  for this is that
21450 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
21460 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  on is used to re
21470 61 64 20 64 61 74 61 62 61 73 65 20 68 65 61 64  ad database head
21480 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 74  ers, and a new t
21490 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a  ransient or.** z
214a0 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62 61  ero sized databa
214b0 73 65 20 68 61 73 20 61 20 68 65 61 64 65 72 20  se has a header 
214c0 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e  than consists en
214d0 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73  tirely of zeroes
214e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49  ..**.** If any I
214f0 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20 66 72  O error apart fr
21500 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  om SQLITE_IOERR_
21510 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65 6e  SHORT_READ is en
21520 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68  countered,.** th
21530 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
21540 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
21550 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20 63  caller and the c
21560 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
21570 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  * output buffer 
21580 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e  undefined..*/.in
21590 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
215a0 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67  adFileheader(Pag
215b0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
215c0 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  N, unsigned char
215d0 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20   *pDest){.  int 
215e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
215f0 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20    memset(pDest, 
21600 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28  0, N);.  assert(
21610 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
21620 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
21630 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  empFile );..  /*
21640 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
21650 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20   only called by 
21660 62 74 72 65 65 20 69 6d 6d 65 64 69 61 74 65 6c  btree immediatel
21670 79 20 61 66 74 65 72 20 63 72 65 61 74 69 6e 67  y after creating
21680 0a 20 20 2a 2a 20 74 68 65 20 50 61 67 65 72 20  .  ** the Pager 
21690 6f 62 6a 65 63 74 2e 20 20 54 68 65 72 65 20 68  object.  There h
216a0 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f  as not been an o
216b0 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 74 72  pportunity to tr
216c0 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f  ansition.  ** to
216d0 20 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20   WAL mode yet.. 
216e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
216f0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
21700 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f  r) );..  if( isO
21710 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
21720 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
21730 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e  "DBHDR %p 0 %d\n
21740 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20  ", pPager, N)). 
21750 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
21760 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
21770 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a  , pDest, N, 0);.
21780 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21790 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
217a0 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAD ){.      rc 
217b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
217c0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
217d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
217e0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f  s function may o
217f0 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68  nly be called wh
21800 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  en a read-transa
21810 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e  ction is open on
21820 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 2e 20 49  .** the pager. I
21830 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f  t returns the to
21840 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
21850 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
21860 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76  ase..**.** Howev
21870 65 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20  er, if the file 
21880 69 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  is between 1 and
21890 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74   <page-size> byt
218a0 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e  es in size, then
218b0 20 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e   .** this is con
218c0 73 69 64 65 72 65 64 20 61 20 31 20 70 61 67 65  sidered a 1 page
218d0 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   file..*/.int sq
218e0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
218f0 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
21900 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b  r, int *pnPage){
21910 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
21920 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
21930 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73  _READER );.  ass
21940 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
21950 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45  ate!=PAGER_WRITE
21960 52 5f 46 49 4e 49 53 48 45 44 20 29 3b 0a 20 20  R_FINISHED );.  
21970 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e 74 29 70  *pnPage = (int)p
21980 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
21990 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
219a0 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  K;.}.../*.** Try
219b0 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63   to obtain a loc
219c0 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79  k of type lockty
219d0 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  pe on the databa
219e0 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61  se file. If.** a
219f0 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61   similar or grea
21a00 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  ter lock is alre
21a10 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66  ady held, this f
21a20 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
21a30 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67  op.** (returning
21a40 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64   SQLITE_OK immed
21a50 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f  iately)..**.** O
21a60 74 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70  therwise, attemp
21a70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  t to obtain the 
21a80 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74  lock using sqlit
21a90 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f  e3OsLock(). Invo
21aa0 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20  ke .** the busy 
21ab0 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20  callback if the 
21ac0 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  lock is currentl
21ad0 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  y not available.
21ae0 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69   Repeat .** unti
21af0 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  l the busy callb
21b00 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ack returns fals
21b10 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61  e or until the a
21b20 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62  ttempt to .** ob
21b30 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75  tain the lock su
21b40 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
21b50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
21b60 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
21b70 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
21b80 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
21b90 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20  ** the lock. If 
21ba0 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61  the lock is obta
21bb0 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ined successfull
21bc0 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72  y, set the Pager
21bd0 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61  .state .** varia
21be0 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20  ble to locktype 
21bf0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
21c00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21c10 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
21c20 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
21c30 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
21c40 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
21c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c60 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
21c70 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
21c80 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20  Check that this 
21c90 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f  is either a no-o
21ca0 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72  p (because the r
21cb0 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73  equested lock is
21cc0 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68   .  ** already h
21cd0 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74  eld, or one of t
21ce0 68 65 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20  he transistions 
21cf0 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61  that the busy-ha
21d00 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62  ndler.  ** may b
21d10 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67  e invoked during
21d20 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
21d30 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
21d40 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  .  ** sqlite3Pag
21d50 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
21d60 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ()..  */.  asser
21d70 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  t( (pPager->eLoc
21d80 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20  k>=locktype).   
21d90 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
21da0 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26  eLock==NO_LOCK &
21db0 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  & locktype==SHAR
21dc0 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20  ED_LOCK).       
21dd0 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  || (pPager->eLoc
21de0 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
21df0 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58   && locktype==EX
21e00 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
21e10 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72  );..  do {.    r
21e20 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
21e30 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65  pPager, locktype
21e40 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  );.  }while( rc=
21e50 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
21e60 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
21e70 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
21e80 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b  syHandlerArg) );
21e90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21ea0 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  ./*.** Function 
21eb0 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
21ec0 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
21ed0 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65   checks that one
21ee0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c   of the .** foll
21ef0 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f  owing is true fo
21f00 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  r all dirty page
21f10 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  s currently in t
21f20 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a  he page-cache:.*
21f30 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61  *.**   a) The pa
21f40 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge number is les
21f50 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
21f60 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
21f70 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72  he .**      curr
21f80 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d 61  ent database ima
21f90 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52  ge, in pages, OR
21fa0 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74  .**.**   b) if t
21fb0 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
21fc0 77 65 72 65 20 77 72 69 74 74 65 6e 20 61 74 20  were written at 
21fd0 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f  this time, it wo
21fe0 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  uld not.**      
21ff0 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  be necessary to 
22000 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
22010 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f  t content out to
22020 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
22030 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65 74  .**      (as det
22040 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74  ermined by funct
22050 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73  ion subjRequires
22060 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49  Page())..**.** I
22070 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  f the condition 
22080 61 73 73 65 72 74 65 64 20 62 79 20 74 68 69 73  asserted by this
22090 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e   function were n
220a0 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65  ot true, and the
220b0 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 77  .** dirty page w
220c0 65 72 65 20 74 6f 20 62 65 20 64 69 73 63 61 72  ere to be discar
220d0 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63  ded from the cac
220e0 68 65 20 76 69 61 20 74 68 65 20 70 61 67 65 72  he via the pager
220f0 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74  Stress().** rout
22100 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73 73  ine, pagerStress
22110 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69  () would not wri
22120 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
22130 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a  age content to.*
22140 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
22150 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f  ile. If a savepo
22160 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  int transaction 
22170 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  were rolled back
22180 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68   after.** this h
22190 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72  appened, the cor
221a0 72 65 63 74 20 62 65 68 61 76 69 6f 75 72 20 77  rect behaviour w
221b0 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f  ould be to resto
221c0 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  re the current.*
221d0 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
221e0 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20   page. However, 
221f0 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65  since this conte
22200 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  nt is not presen
22210 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74  t in either.** t
22220 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22230 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20   or the portion 
22240 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
22250 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20  journal and .** 
22260 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  sub-journal roll
22270 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74  ed back the cont
22280 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ent could not be
22290 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68   restored and th
222a0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d  e.** database im
222b0 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65  age would become
222c0 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20   corrupt. It is 
222d0 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e  therefore fortun
222e0 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69  ate that .** thi
222f0 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63  s circumstance c
22300 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a  annot arise..*/.
22310 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
22320 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63  TE_DEBUG).static
22330 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
22340 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62  cateConstraintCb
22350 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
22360 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
22370 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
22380 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62  ;.  assert( !sub
22390 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
223a0 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c  g) || pPg->pgno<
223b0 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62  =pPg->pPager->db
223c0 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63  Size );.}.static
223d0 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
223e0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50  cateConstraint(P
223f0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
22400 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74   sqlite3PcacheIt
22410 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65  erateDirty(pPage
22420 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65  r->pPCache, asse
22430 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
22440 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65  aintCb);.}.#else
22450 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  .# define assert
22460 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
22470 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69  nt(pPager).#endi
22480 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  f../*.** Truncat
22490 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
224a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d  database file im
224b0 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67  age to nPage pag
224c0 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  es. This .** fun
224d0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61  ction does not a
224e0 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74  ctually modify t
224f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22500 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a   on disk. It .**
22510 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69   just sets the i
22520 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66  nternal state of
22530 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
22540 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a  t so that the .*
22550 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c  * truncation wil
22560 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74  l be done when t
22570 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
22580 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
22590 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
225a0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
225b0 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50  eImage(Pager *pP
225c0 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
225d0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
225e0 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61  ger->dbSize>=nPa
225f0 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
22600 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
22610 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
22620 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65  HEMOD );.  pPage
22630 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
22640 65 3b 0a 20 20 61 73 73 65 72 74 54 72 75 6e 63  e;.  assertTrunc
22650 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  ateConstraint(pP
22660 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ager);.}.../*.**
22670 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
22680 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
22690 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68 6f 74  attempting a hot
226a0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
226b0 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74  k. It.** syncs t
226c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
226d0 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20 73 65  to disk, then se
226e0 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ts pPager->journ
226f0 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20  alHdr to the.** 
22700 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
22710 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68 61 74  nal file so that
22720 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
22730 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e  ack() routine kn
22740 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ows.** that the 
22750 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66  entire journal f
22760 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
22770 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69  ced..**.** Synci
22780 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
22790 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 20   to disk before 
227a0 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f  attempting to ro
227b0 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73 75 72  ll it back ensur
227c0 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66 20 61  es .** that if a
227d0 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 6f   power-failure o
227e0 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
227f0 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70   rollback, the p
22800 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a 20 61  rocess that.** a
22810 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b  ttempts rollback
22820 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65   following syste
22830 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65 73 20  m recovery sees 
22840 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c  the same journal
22850 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20 74  .** content as t
22860 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  his process..**.
22870 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
22880 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65 64   goes as planned
22890 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
228a0 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
228b0 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74  se, .** an SQLit
228c0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
228d0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
228e0 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28  rSyncHotJournal(
228f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
22900 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
22910 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61  E_OK;.  if( !pPa
22920 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
22930 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
22940 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
22950 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  d, SQLITE_SYNC_N
22960 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66  ORMAL);.  }.  if
22970 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22980 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
22990 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
229a0 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
229b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b  er->journalHdr);
229c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
229d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64  ;.}../*.** Shutd
229e0 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63  own the page cac
229f0 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65  he.  Free all me
22a00 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61  mory and close a
22a10 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ll files..**.** 
22a20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
22a30 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73   was in progress
22a40 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
22a50 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
22a60 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  at.** transactio
22a70 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
22a80 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69  .  All outstandi
22a90 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
22aa0 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20  alidated.** and 
22ab0 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20  their memory is 
22ac0 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65  freed.  Any atte
22ad0 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67  mpt to use a pag
22ae0 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
22af0 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63  with this page c
22b00 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
22b10 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
22b20 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
22b30 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
22b40 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dump..**.** This
22b50 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
22b60 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20   succeeds. If a 
22b70 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
22b80 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74  ctive an attempt
22b90 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72  .** is made to r
22ba0 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20  oll it back. If 
22bb0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
22bc0 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
22bd0 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f  ack .** a hot jo
22be0 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66  urnal may be lef
22bf0 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73  t in the filesys
22c00 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  tem but no error
22c10 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
22c20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
22c30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
22c40 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70  erClose(Pager *p
22c50 50 61 67 65 72 29 7b 0a 20 20 75 38 20 2a 70 54  Pager){.  u8 *pT
22c60 6d 70 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65  mp = (u8 *)pPage
22c70 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20  r->pTmpSpace;.. 
22c80 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
22c90 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
22ca0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
22cb0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
22cc0 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  /* pPager->errCo
22cd0 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  de = 0; */.  pPa
22ce0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
22cf0 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  de = 0;.#ifndef 
22d00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
22d10 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73    sqlite3WalClos
22d20 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 0a  e(pPager->pWal,.
22d30 20 20 20 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53      (pPager->noS
22d40 79 6e 63 20 3f 20 30 20 3a 20 70 50 61 67 65 72  ync ? 0 : pPager
22d50 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 2c 20 0a  ->sync_flags), .
22d60 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
22d70 53 69 7a 65 2c 20 70 54 6d 70 0a 20 20 29 3b 0a  Size, pTmp.  );.
22d80 20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d    pPager->pWal =
22d90 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61 67   0;.#endif.  pag
22da0 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
22db0 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
22dc0 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63  .    pager_unloc
22dd0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c  k(pPager);.  }el
22de0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74  se{.    /* If it
22df0 20 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74   is open, sync t
22e00 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
22e10 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55  before calling U
22e20 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
22e30 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73  ..    ** If this
22e40 20 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68   is not done, th
22e50 65 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64 20 70  en an unsynced p
22e60 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70  ortion of the op
22e70 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  en journal .    
22e80 2a 2a 20 66 69 6c 65 20 6d 61 79 20 62 65 20 70  ** file may be p
22e90 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20  layed back into 
22ea0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
22eb0 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
22ec0 20 6f 63 63 75 72 73 20 0a 20 20 20 20 2a 2a 20   occurs .    ** 
22ed0 77 68 69 6c 65 20 74 68 69 73 20 69 73 20 68 61  while this is ha
22ee0 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74  ppening, the dat
22ef0 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 63 6f  abase could beco
22f00 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20  me corrupt..    
22f10 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 20  **.    ** If an 
22f20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
22f30 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 79 6e  le trying to syn
22f40 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73  c the journal, s
22f50 68 69 66 74 20 74 68 65 20 70 61 67 65 72 0a 20  hift the pager. 
22f60 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45     ** into the E
22f70 52 52 4f 52 20 73 74 61 74 65 2e 20 54 68 69 73  RROR state. This
22f80 20 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e   causes UnlockAn
22f90 64 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c  dRollback to unl
22fa0 6f 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ock the.    ** d
22fb0 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c 6f 73  atabase and clos
22fc0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
22fd0 6c 65 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d  le without attem
22fe0 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74  pting to roll it
22ff0 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20  .    ** back or 
23000 66 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68 65  finalize it. The
23010 20 6e 65 78 74 20 64 61 74 61 62 61 73 65 20 75   next database u
23020 73 65 72 20 77 69 6c 6c 20 68 61 76 65 20 74 6f  ser will have to
23030 20 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a   do hot-journal.
23040 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
23050 62 65 66 6f 72 65 20 61 63 63 65 73 73 69 6e 67  before accessing
23060 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23070 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
23080 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
23090 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
230a0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
230b0 65 72 2c 20 70 61 67 65 72 53 79 6e 63 48 6f 74  er, pagerSyncHot
230c0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 29  Journal(pPager))
230d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
230e0 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
230f0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
23100 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
23110 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e  gnMalloc();.  en
23120 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
23130 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41  o_errors();.  PA
23140 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45  GERTRACE(("CLOSE
23150 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
23160 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54  pPager)));.  IOT
23170 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c  RACE(("CLOSE %p\
23180 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73  n", pPager)).  s
23190 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
231a0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71  ager->jfd);.  sq
231b0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
231c0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69  ger->fd);.  sqli
231d0 74 65 33 50 61 67 65 46 72 65 65 28 70 54 6d 70  te3PageFree(pTmp
231e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
231f0 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  heClose(pPager->
23200 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65  pPCache);..#ifde
23210 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
23220 45 43 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  EC.  if( pPager-
23230 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50  >xCodecFree ) pP
23240 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
23250 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29  (pPager->pCodec)
23260 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
23270 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61  rt( !pPager->aSa
23280 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67  vepoint && !pPag
23290 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->pInJournal )
232a0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f  ;.  assert( !isO
232b0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
232c0 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67   && !isOpen(pPag
232d0 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20  er->sjfd) );..  
232e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
232f0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
23300 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
23310 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
23320 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
23330 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
23340 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
23350 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20  number for page 
23360 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c  pPg..*/.Pgno sql
23370 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
23380 62 65 72 28 44 62 50 61 67 65 20 2a 70 50 67 29  ber(DbPage *pPg)
23390 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  {.  return pPg->
233a0 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  pgno;.}.#endif..
233b0 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
233c0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
233d0 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67  unt for page pPg
233e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
233f0 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65  3PagerRef(DbPage
23400 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65   *pPg){.  sqlite
23410 33 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b  3PcacheRef(pPg);
23420 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
23430 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f  he journal. In o
23440 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65  ther words, make
23450 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61   sure all the pa
23460 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  ges that have.**
23470 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
23480 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76   the journal hav
23490 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68  e actually reach
234a0 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f  ed the surface o
234b0 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  f the.** disk an
234c0 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  d can be restore
234d0 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  d in the event o
234e0 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  f a hot-journal 
234f0 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
23500 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53  If the Pager.noS
23510 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ync flag is set,
23520 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
23530 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
23540 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  ** Otherwise, th
23550 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72  e actions requir
23560 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65  ed depend on the
23570 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e   journal-mode an
23580 64 20 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65  d the .** device
23590 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
235a0 20 6f 66 20 74 68 65 20 74 68 65 20 66 69 6c 65   of the the file
235b0 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c  -system, as foll
235c0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ows:.**.**   * I
235d0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
235e0 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  le is an in-memo
235f0 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ry journal file,
23600 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a   no action need.
23610 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e  **     be taken.
23620 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72  .**.**   * Other
23630 77 69 73 65 2c 20 69 66 20 74 68 65 20 64 65 76  wise, if the dev
23640 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
23650 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41 50  port the SAFE_AP
23660 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a  PEND property,.*
23670 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e  *     then the n
23680 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65  Rec field of the
23690 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77   most recently w
236a0 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68  ritten journal h
236b0 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20  eader.**     is 
236c0 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61  updated to conta
236d0 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  in the number of
236e0 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73   journal records
236f0 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20   that have.**   
23700 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66    been written f
23710 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20  ollowing it. If 
23720 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 70 65  the pager is ope
23730 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73  rating in full-s
23740 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c  ync.**     mode,
23750 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
23760 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  l file is synced
23770 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 69 65   before this fie
23780 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a  ld is updated..*
23790 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
237a0 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20  device does not 
237b0 73 75 70 70 6f 72 74 20 74 68 65 20 53 45 51 55  support the SEQU
237c0 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c  ENTIAL property,
237d0 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f   then .**     jo
237e0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79  urnal file is sy
237f0 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  nced..**.** Or, 
23800 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a  in pseudo-code:.
23810 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20  **.**   if( NOT 
23820 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e  <in-memory journ
23830 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66  al> ){.**     if
23840 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e  ( NOT SAFE_APPEN
23850 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66  D ){.**       if
23860 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  ( <full-sync mod
23870 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72  e> ) xSync(<jour
23880 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20  nal file>);.**  
23890 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65       <update nRe
238a0 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20  c field>.**     
238b0 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f  } .**     if( NO
238c0 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78  T SEQUENTIAL ) x
238d0 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
238e0 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a  le>);.**   }.**.
238f0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
23900 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
23910 6c 65 61 72 73 20 74 68 65 20 50 47 48 44 52 5f  lears the PGHDR_
23920 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f  NEED_SYNC flag o
23930 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67 65  f every .** page
23940 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
23950 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65  in memory before
23960 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54   returning SQLIT
23970 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a  E_OK. If an IO.*
23980 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  * error is encou
23990 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74 68 65  ntered, then the
239a0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
239b0 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
239c0 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61  e caller..*/.sta
239d0 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
239e0 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
239f0 72 2c 20 69 6e 74 20 6e 65 77 48 64 72 29 7b 0a  r, int newHdr){.
23a00 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
23a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
23a30 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
23a40 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
23a50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
23a60 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  EMOD.       || p
23a70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
23a80 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
23a90 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  D.  );.  assert(
23aa0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
23ab0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
23ac0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
23ad0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
23ae0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
23af0 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f  PagerExclusiveLo
23b00 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ck(pPager);.  if
23b10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23b20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
23b30 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
23b40 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ync ){.    asser
23b50 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
23b60 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20  File );.    if( 
23b70 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
23b80 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  fd) && pPager->j
23b90 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
23ba0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
23bb0 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 63 6f  MORY ){.      co
23bc0 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20 73 71  nst int iDc = sq
23bd0 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
23be0 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
23bf0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
23c00 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
23c10 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a  Pager->jfd) );..
23c20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
23c30 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
23c40 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20  AFE_APPEND) ){. 
23c50 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
23c60 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20  lock deals with 
23c70 61 6e 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c  an obscure probl
23c80 65 6d 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20  em. If the last 
23c90 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20  connection.     
23ca0 20 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65     ** that wrote
23cb0 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
23cc0 65 20 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20  e was operating 
23cd0 69 6e 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f  in persistent-jo
23ce0 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
23cf0 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
23d00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79  journal file may
23d10 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61   at this point a
23d20 63 74 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65  ctually be large
23d30 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  r.        ** tha
23d40 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  n Pager.journalO
23d50 66 66 20 62 79 74 65 73 2e 20 49 66 20 74 68 65  ff bytes. If the
23d60 20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74   next thing in t
23d70 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
23d80 20 20 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65     ** file happe
23d90 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e  ns to be a journ
23da0 61 6c 2d 68 65 61 64 65 72 20 28 77 72 69 74 74  al-header (writt
23db0 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  en as part of th
23dc0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  e.        ** pre
23dd0 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e  vious connection
23de0 27 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  's transaction),
23df0 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f 72 20   and a crash or 
23e00 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 0a 20  power-failure . 
23e10 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 73         ** occurs
23e20 20 61 66 74 65 72 20 6e 52 65 63 20 69 73 20 75   after nRec is u
23e30 70 64 61 74 65 64 20 62 75 74 20 62 65 66 6f 72  pdated but befor
23e40 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  e this connectio
23e50 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20 20 20  n writes .      
23e60 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c    ** anything el
23e70 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  se to the journa
23e80 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69  l file (or commi
23e90 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74  ts/rolls back it
23ea0 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  s .        ** tr
23eb0 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e  ansaction), then
23ec0 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65 63 6f   SQLite may beco
23ed0 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68 65 6e  me confused when
23ee0 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20 20 20   doing the .    
23ef0 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e      ** hot-journ
23f00 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c  al rollback foll
23f10 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79 2e 20  owing recovery. 
23f20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b  It may roll back
23f30 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20   all.        ** 
23f40 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  of this connecti
23f50 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e 20 70  ons data, then p
23f60 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e  roceed to rollin
23f70 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a  g back the old,.
23f80 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f          ** out-o
23f90 66 2d 64 61 74 65 20 64 61 74 61 20 74 68 61 74  f-date data that
23fa0 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74   follows it. Dat
23fb0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
23fc0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
23fd0 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20       ** To work 
23fe0 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20  around this, if 
23ff0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
24000 20 64 6f 65 73 20 61 70 70 65 61 72 20 74 6f 20   does appear to 
24010 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 20 20  contain.        
24020 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61 64 65  ** a valid heade
24030 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65  r following Page
24040 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68  r.journalOff, th
24050 65 6e 20 77 72 69 74 65 20 61 20 30 78 30 30 0a  en write a 0x00.
24060 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20          ** byte 
24070 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
24080 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74  it to prevent it
24090 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f   from being reco
240a0 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20 20 20  gnized..        
240b0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 56 61  **.        ** Va
240c0 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64 72 4f  riable iNextHdrO
240d0 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f 20  ffset is set to 
240e0 74 68 65 20 6f 66 66 73 65 74 20 61 74 20 77 68  the offset at wh
240f0 69 63 68 20 74 68 69 73 0a 20 20 20 20 20 20 20  ich this.       
24100 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63 20   ** problematic 
24110 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63 63 75  header will occu
24120 72 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  r, if it exists.
24130 20 61 4d 61 67 69 63 20 69 73 20 75 73 65 64 20   aMagic is used 
24140 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61  .        ** as a
24150 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
24160 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74 68 65  r to inspect the
24170 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20 6f 66   first couple of
24180 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20 20 20   bytes of.      
24190 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74 69    ** the potenti
241a0 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  al journal heade
241b0 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  r..        */.  
241c0 20 20 20 20 20 20 69 36 34 20 69 4e 65 78 74 48        i64 iNextH
241d0 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  drOffset;.      
241e0 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a    u8 aMagic[8];.
241f0 20 20 20 20 20 20 20 20 75 38 20 7a 48 65 61 64          u8 zHead
24200 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
24210 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20  alMagic)+4];..  
24220 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65        memcpy(zHe
24230 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  ader, aJournalMa
24240 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
24250 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20  rnalMagic));.   
24260 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26       put32bits(&
24270 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
24280 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
24290 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a  pPager->nRec);..
242a0 20 20 20 20 20 20 20 20 69 4e 65 78 74 48 64 72          iNextHdr
242b0 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c  Offset = journal
242c0 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
242d0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
242e0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
242f0 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
24300 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66  c, 8, iNextHdrOf
24310 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69  fset);.        i
24320 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24330 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d   && 0==memcmp(aM
24340 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
24350 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20  gic, 8) ){.     
24360 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
24370 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20  t u8 zerobyte = 
24380 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
24390 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
243a0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a  (pPager->jfd, &z
243b0 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78  erobyte, 1, iNex
243c0 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20  tHdrOffset);.   
243d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
243e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
243f0 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
24400 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
24410 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
24420 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
24430 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72  }..        /* Wr
24440 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  ite the nRec val
24450 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ue into the jour
24460 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e  nal file header.
24470 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a   If in.        *
24480 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f  * full-synchrono
24490 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  us mode, sync th
244a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e  e journal first.
244b0 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
244c0 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  at.        ** al
244d0 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c  l data has reall
244e0 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62  y hit the disk b
244f0 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70  efore nRec is up
24500 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20  dated to mark.  
24510 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61        ** it as a
24520 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72   candidate for r
24530 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ollback..       
24540 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
24550 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
24560 72 65 64 20 69 66 20 74 68 65 20 70 65 72 73 69  red if the persi
24570 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70  stent media supp
24580 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20 20 20  orts the.       
24590 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20   ** SAFE_APPEND 
245a0 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73  property. Becaus
245b0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69  e in this case i
245c0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
245d0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  e .        ** fo
245e0 72 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  r garbage data t
245f0 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f  o be appended to
24600 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e   the file, the n
24610 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20  Rec field.      
24620 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65    ** is populate
24630 64 20 77 69 74 68 20 30 78 46 46 46 46 46 46 46  d with 0xFFFFFFF
24640 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  F when the journ
24650 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72 69  al header is wri
24660 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tten.        ** 
24670 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20  and never needs 
24680 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20  to be updated.. 
24690 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
246a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
246b0 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44  llSync && 0==(iD
246c0 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
246d0 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
246e0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
246f0 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
24700 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
24710 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
24720 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45           IOTRACE
24730 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20  (("JSYNC %p\n", 
24740 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
24750 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
24760 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
24770 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
24780 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20  flags);.        
24790 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
247a0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
247b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
247c0 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
247d0 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50  R %p %lld\n", pP
247e0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
247f0 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20  urnalHdr));.    
24800 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
24810 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20 20 20  OsWrite(.       
24820 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64       pPager->jfd
24830 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  , zHeader, sizeo
24840 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67  f(zHeader), pPag
24850 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20  er->journalHdr. 
24860 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
24870 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
24880 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
24890 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
248a0 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
248b0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
248c0 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50  AL) ){.        P
248d0 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
248e0 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
248f0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
24900 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f  r)));.        IO
24910 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
24920 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
24930 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
24940 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
24950 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
24960 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20  nc_flags| .     
24970 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79       (pPager->sy
24980 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45  nc_flags==SQLITE
24990 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54  _SYNC_FULL?SQLIT
249a0 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a  E_SYNC_DATAONLY:
249b0 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  0).        );.  
249c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
249d0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
249e0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
249f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
24a00 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
24a10 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
24a20 20 20 20 69 66 28 20 6e 65 77 48 64 72 20 26 26     if( newHdr &&
24a30 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
24a40 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
24a50 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  D) ){.        pP
24a60 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
24a70 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
24a80 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
24a90 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ger);.        if
24aa0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
24ab0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
24ac0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
24ad0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
24ae0 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
24af0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
24b00 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55     }.  }..  /* U
24b10 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
24b20 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64  is in noSync mod
24b30 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  e, the journal f
24b40 69 6c 65 20 77 61 73 20 6a 75 73 74 20 0a 20 20  ile was just .  
24b50 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ** successfully 
24b60 73 79 6e 63 65 64 2e 20 45 69 74 68 65 72 20 77  synced. Either w
24b70 61 79 2c 20 63 6c 65 61 72 20 74 68 65 20 50 47  ay, clear the PG
24b80 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
24b90 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20  ag on .  ** all 
24ba0 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  pages..  */.  sq
24bb0 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72  lite3PcacheClear
24bc0 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72  SyncFlags(pPager
24bd0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 70 50  ->pPCache);.  pP
24be0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
24bf0 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
24c00 44 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  D;.  assert( ass
24c10 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
24c20 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
24c30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
24c40 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  ../*.** The argu
24c50 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73  ment is the firs
24c60 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69  t in a linked li
24c70 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65  st of dirty page
24c80 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62  s connected.** b
24c90 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72  y the PgHdr.pDir
24ca0 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73  ty pointer. This
24cb0 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73   function writes
24cc0 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65   each one of the
24cd0 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  .** in-memory pa
24ce0 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ges in the list 
24cf0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
24d00 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65  file. The argume
24d10 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c  nt may.** be NUL
24d20 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  L, representing 
24d30 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49  an empty list. I
24d40 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
24d50 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
24d60 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
24d70 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f  he pager must ho
24d80 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  ld at least a RE
24d90 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e  SERVED lock when
24da0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
24db0 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66  * is called. Bef
24dc0 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74  ore writing anyt
24dd0 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
24de0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20  base file, this 
24df0 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61  lock.** is upgra
24e00 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  ded to an EXCLUS
24e10 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65  IVE lock. If the
24e20 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20   lock cannot be 
24e30 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c  obtained,.** SQL
24e40 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
24e50 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61  rned and no data
24e60 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
24e70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24e80 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
24e90 70 61 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d  pager is a temp-
24ea0 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74  file pager and t
24eb0 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73  he actual file-s
24ec0 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73  ystem file.** is
24ed0 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69   not yet open, i
24ee0 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
24ef0 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61   opened before a
24f00 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77  ny data is .** w
24f10 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a  ritten out..**.*
24f20 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20  * Once the lock 
24f30 68 61 73 20 62 65 65 6e 20 75 70 67 72 61 64 65  has been upgrade
24f40 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73  d and, if necess
24f50 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70  ary, the file op
24f60 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67  ened,.** the pag
24f70 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  es are written o
24f80 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
24f90 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20  se file in list 
24fa0 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a  order. Writing.*
24fb0 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b 69 70  * a page is skip
24fc0 70 65 64 20 69 66 20 69 74 20 6d 65 65 74 73 20  ped if it meets 
24fd0 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f  either of the fo
24fe0 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61  llowing criteria
24ff0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
25000 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67  page number is g
25010 72 65 61 74 65 72 20 74 68 61 6e 20 50 61 67 65  reater than Page
25020 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20  r.dbSize, or.** 
25030 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f    * The PGHDR_DO
25040 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73  NT_WRITE flag is
25050 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65   set on the page
25060 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69  ..**.** If writi
25070 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20 63 61  ng out a page ca
25080 75 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73  uses the databas
25090 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20  e file to grow, 
250a0 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65  Pager.dbFileSize
250b0 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20 61  .** is updated a
250c0 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70  ccordingly. If p
250d0 61 67 65 20 31 20 69 73 20 77 72 69 74 74 65 6e  age 1 is written
250e0 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76   out, then the v
250f0 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69  alue cached.** i
25100 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  n Pager.dbFileVe
25110 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20  rs[] is updated 
25120 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77  to match the new
25130 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
25140 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
25150 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
25160 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
25170 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
25180 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
25190 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
251a0 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49  .** occurs, an I
251b0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
251c0 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66  returned. Or, if
251d0 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c   the EXCLUSIVE l
251e0 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65  ock cannot.** be
251f0 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54   obtained, SQLIT
25200 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
25210 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
25220 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  t pager_write_pa
25230 67 65 6c 69 73 74 28 50 61 67 65 72 20 2a 70 50  gelist(Pager *pP
25240 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 4c 69  ager, PgHdr *pLi
25250 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  st){.  int rc;  
25260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
25280 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
25290 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68   /* Normally, th
252a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
252b0 61 6c 6c 65 64 20 69 6e 20 57 52 49 54 45 52 5f  alled in WRITER_
252c0 44 42 4d 4f 44 20 73 74 61 74 65 2e 0a 20 20 2a  DBMOD state..  *
252d0 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 69  *.  ** However i
252e0 74 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  t may be called 
252f0 69 6e 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d  in WRITER_CACHEM
25300 4f 44 20 73 74 61 74 65 20 69 66 20 74 68 65 20  OD state if the 
25310 70 61 67 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20  page being.  ** 
25320 77 72 69 74 74 65 6e 20 28 61 6e 64 20 61 6c 6c  written (and all
25330 20 6f 74 68 65 72 20 70 61 67 65 73 20 74 68 61   other pages tha
25340 74 20 72 65 73 69 64 65 20 6f 6e 20 74 68 65 20  t reside on the 
25350 73 61 6d 65 20 64 69 73 6b 20 73 65 63 74 6f 72  same disk sector
25360 29 20 77 61 73 0a 20 20 2a 2a 20 61 20 66 72 65  ) was.  ** a fre
25370 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
25380 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
25390 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
253a0 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 0a 20  . In that case. 
253b0 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
253c0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
253d0 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  lly being modifi
253e0 65 64 2c 20 73 6f 20 69 74 20 69 73 20 4f 6b 20  ed, so it is Ok 
253f0 74 6f 20 77 72 69 74 65 0a 20 20 2a 2a 20 74 6f  to write.  ** to
25400 20 69 74 20 69 6e 20 43 41 43 48 45 4d 4f 44 20   it in CACHEMOD 
25410 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  state..  */.  as
25420 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
25430 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
25440 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
25450 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
25460 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20  ITER_DBMOD.     
25470 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
25480 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
25490 52 5f 43 41 43 48 45 4d 4f 44 20 0a 20 20 29 3b  R_CACHEMOD .  );
254a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
254b0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
254c0 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 0a 20  _WRITER_DBMOD . 
254d0 20 20 20 20 20 20 7c 7c 20 28 70 4c 69 73 74 2d        || (pList-
254e0 3e 70 44 69 72 74 79 3d 3d 30 20 26 26 20 70 4c  >pDirty==0 && pL
254f0 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65  ist->pgno<=pPage
25500 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 29 0a 20  r->dbFileSize). 
25510 20 29 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69   );..  /* At thi
25520 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61  s point there ma
25530 79 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45  y be either a RE
25540 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
25550 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  IVE lock on the.
25560 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
25570 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  le. If there is 
25580 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55  already an EXCLU
25590 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66  SIVE lock, the f
255a0 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61  ollowing.  ** ca
255b0 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  ll is a no-op.. 
255c0 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20   **.  ** Moving 
255d0 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45  the lock from RE
255e0 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53  SERVED to EXCLUS
255f0 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76  IVE actually inv
25600 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a  olves going.  **
25610 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65   through an inte
25620 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50  rmediate state P
25630 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44  ENDING.   A PEND
25640 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74  ING lock prevent
25650 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65  s new.  ** reade
25660 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e  rs from attachin
25670 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
25680 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69  e but is unsuffi
25690 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a  cient for us to.
256a0 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65    ** write.  The
256b0 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49   idea of a PENDI
256c0 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72  NG lock is to pr
256d0 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72  event new reader
256e0 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69  s from.  ** comi
256f0 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77  ng in while we w
25700 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67  ait for existing
25710 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61   readers to clea
25720 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69  r..  **.  ** Whi
25730 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  le the pager is 
25740 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20  in the RESERVED 
25750 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69  state, the origi
25760 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
25770 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e  e.  ** is unchan
25780 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72  ged and we can r
25790 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ollback without 
257a0 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61  having to playba
257b0 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  ck the.  ** jour
257c0 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  nal into the ori
257d0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
257e0 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72  ile.  Once we tr
257f0 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a  ansition to.  **
25800 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d   EXCLUSIVE, it m
25810 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
25820 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  e file has been 
25830 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20  changed and any 
25840 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69  rollback.  ** wi
25850 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75  ll require a jou
25860 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20  rnal playback.. 
25870 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
25880 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
25890 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
258a0 4c 4f 43 4b 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  LOCK);..  /* If 
258b0 74 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65  the file is a te
258c0 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  mp-file has not 
258d0 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
258e0 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74   open it now. It
258f0 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73  .  ** is not pos
25900 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20  sible for rc to 
25910 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  be other than SQ
25920 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20  LITE_OK if this 
25930 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74  branch.  ** is t
25940 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77  aken, as pager_w
25950 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73  ait_on_lock() is
25960 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d   a no-op for tem
25970 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20  p-files..  */.  
25980 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
25990 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
259a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
259b0 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53  empFile && rc==S
259c0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
259d0 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65  rc = pagerOpente
259e0 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  mp(pPager, pPage
259f0 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76  r->fd, pPager->v
25a00 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20  fsFlags);.  }.. 
25a10 20 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66   /* Before the f
25a20 69 72 73 74 20 77 72 69 74 65 2c 20 67 69 76 65  irst write, give
25a30 20 74 68 65 20 56 46 53 20 61 20 68 69 6e 74 20   the VFS a hint 
25a40 6f 66 20 77 68 61 74 20 74 68 65 20 66 69 6e 61  of what the fina
25a50 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65  l.  ** file size
25a60 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20   will be..  */. 
25a70 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
25a80 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
25a90 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
25aa0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25ab0 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 64  _OK && pPager->d
25ac0 62 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62  bSize>pPager->db
25ad0 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20  OrigSize ){.    
25ae0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
25af0 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  File = pPager->p
25b00 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74  ageSize * (sqlit
25b10 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d  e3_int64)pPager-
25b20 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c  >dbSize;.    sql
25b30 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
25b40 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  l(pPager->fd, SQ
25b50 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
25b60 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a  HINT, &szFile);.
25b70 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63    }..  while( rc
25b80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
25b90 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f  List ){.    Pgno
25ba0 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70   pgno = pList->p
25bb0 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  gno;..    /* If 
25bc0 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20  there are dirty 
25bd0 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
25be0 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67  e cache with pag
25bf0 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65  e numbers greate
25c00 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61  r.    ** than Pa
25c10 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73  ger.dbSize, this
25c20 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61   means sqlite3Pa
25c30 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
25c40 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  () was called to
25c50 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65  .    ** make the
25c60 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70   file smaller (p
25c70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74  resumably by aut
25c80 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20  o-vacuum code). 
25c90 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20  Do not write.   
25ca0 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67   ** any such pag
25cb0 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a  es to the file..
25cc0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
25cd0 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65  so, do not write
25ce0 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74 68   out any page th
25cf0 61 74 20 68 61 73 20 74 68 65 20 50 47 48 44 52  at has the PGHDR
25d00 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67  _DONT_WRITE flag
25d10 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74  .    ** set (set
25d20 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72   by sqlite3Pager
25d30 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20  DontWrite())..  
25d40 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e    */.    if( pgn
25d50 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o<=pPager->dbSiz
25d60 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e  e && 0==(pList->
25d70 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54  flags&PGHDR_DONT
25d80 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20  _WRITE) ){.     
25d90 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70   i64 offset = (p
25da0 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
25db0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20  er->pageSize;   
25dc0 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69  /* Offset to wri
25dd0 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  te */.      char
25de0 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20   *pData;        
25df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
25e10 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20  ta to write */  
25e20 20 20 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74    ..      assert
25e30 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26  ( (pList->flags&
25e40 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
25e50 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ==0 );..      /*
25e60 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61 74 61   Encode the data
25e70 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f  base */.      CO
25e80 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69  DEC2(pPager, pLi
25e90 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c  st->pData, pgno,
25ea0 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   6, return SQLIT
25eb0 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b  E_NOMEM, pData);
25ec0 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ..      /* Write
25ed0 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64 61   out the page da
25ee0 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ta. */.      rc 
25ef0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
25f00 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61  (pPager->fd, pDa
25f10 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
25f20 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a  Size, offset);..
25f30 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65        /* If page
25f40 20 31 20 77 61 73 20 6a 75 73 74 20 77 72 69 74   1 was just writ
25f50 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65  ten, update Page
25f60 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20  r.dbFileVers to 
25f70 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74  match.      ** t
25f80 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f  he value now sto
25f90 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  red in the datab
25fa0 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69  ase file. If wri
25fb0 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20  ting this .     
25fc0 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64 20   ** page caused 
25fd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
25fe0 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74  e to grow, updat
25ff0 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20  e dbFileSize. . 
26000 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
26010 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
26020 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
26030 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
26040 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a   &pData[24], siz
26050 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
26060 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
26070 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  }.      if( pgno
26080 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
26090 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ize ){.        p
260a0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
260b0 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  e = pgno;.      
260c0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  }..      /* Upda
260d0 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62  te any backup ob
260e0 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68  jects copying th
260f0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
26100 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20  is pager. */.   
26110 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
26120 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
26130 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
26140 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29  8*)pList->pData)
26150 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  ;..      PAGERTR
26160 41 43 45 28 28 22 53 54 4f 52 45 20 25 64 20 70  ACE(("STORE %d p
26170 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
26180 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
26190 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
261a0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
261b0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
261c0 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49  List)));.      I
261d0 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25  OTRACE(("PGOUT %
261e0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
261f0 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50   pgno));.      P
26200 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
26210 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
26220 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 50 41  count);.      PA
26230 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
26240 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 7d 65  >nWrite);.    }e
26250 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52  lse{.      PAGER
26260 54 52 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20  TRACE(("NOSTORE 
26270 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
26280 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
26290 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 23 69  pgno));.    }.#i
262a0 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
262b0 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 4c 69 73  K_PAGES.    pLis
262c0 74 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  t->pageHash = pa
262d0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69  ger_pagehash(pLi
262e0 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  st);.#endif.    
262f0 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70  pList = pList->p
26300 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65  Dirty;.  }..  re
26310 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
26320 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 74 68  * Ensure that th
26330 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  e sub-journal fi
26340 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49 66 20 69  le is open. If i
26350 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  t is already ope
26360 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  n, this .** func
26370 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
26380 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
26390 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
263a0 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
263b0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61  according to pla
263c0 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  n. An .** SQLITE
263d0 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72  _IOERR_XXX error
263e0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
263f0 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 73  d if a call to s
26400 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a  qlite3OsOpen() .
26410 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  ** fails..*/.sta
26420 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a  tic int openSubJ
26430 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
26440 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
26450 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
26460 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
26470 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
26480 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
26490 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
264a0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
264b0 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62  Y || pPager->sub
264c0 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20  jInMemory ){.   
264d0 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75     sqlite3MemJou
264e0 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
264f0 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73  >sjfd);.    }els
26500 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  e{.      rc = pa
26510 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
26520 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  er, pPager->sjfd
26530 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55  , SQLITE_OPEN_SU
26540 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d  BJOURNAL);.    }
26550 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
26560 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
26570 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68  d a record of th
26580 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
26590 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74  of page pPg to t
265a0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
265b0 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 63 61  .** It is the ca
265c0 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69  llers responsibi
265d0 6c 69 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a  lity to use subj
265e0 52 65 71 75 69 72 65 73 50 61 67 65 28 29 20 74  RequiresPage() t
265f0 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74  o check .** that
26600 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65   it is really re
26610 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 63 61  quired before ca
26620 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
26630 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ion..**.** If su
26640 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
26650 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
26660 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f  ing to pPg->pgno
26670 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a   in the bitvecs.
26680 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20  ** for all open 
26690 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72  savepoints befor
266a0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
266b0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
266c0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
266d0 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
266e0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
266f0 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63  an IO.** error c
26700 6f 64 65 20 69 66 20 74 68 65 20 61 74 74 65 6d  ode if the attem
26710 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  pt to write to t
26720 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
26730 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c  ails, or .** SQL
26740 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
26750 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c  alloc fails whil
26760 65 20 73 65 74 74 69 6e 67 20 61 20 62 69 74 20  e setting a bit 
26770 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a  in a savepoint.*
26780 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61  * bitvec..*/.sta
26790 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e  tic int subjourn
267a0 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  alPage(PgHdr *pP
267b0 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
267c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
267d0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
267e0 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70  >pPager;.  if( p
267f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
26800 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
26810 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20  LMODE_OFF ){..  
26820 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75    /* Open the su
26830 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74  b-journal, if it
26840 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
26850 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a   been opened */.
26860 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
26870 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
26880 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ;.    assert( is
26890 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
268a0 29 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c  ) || pagerUseWal
268b0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
268c0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
268d0 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20  Pager->sjfd) || 
268e0 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d  pPager->nSubRec=
268f0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
26900 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
26910 61 67 65 72 29 20 0a 20 20 20 20 20 20 20 20 20  ager) .         
26920 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  || pageInJournal
26930 28 70 50 67 29 20 0a 20 20 20 20 20 20 20 20 20  (pPg) .         
26940 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  || pPg->pgno>pPa
26950 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
26960 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d  .    );.    rc =
26970 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
26980 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a  pPager);..    /*
26990 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   If the sub-jour
269a0 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73  nal was opened s
269b0 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20  uccessfully (or 
269c0 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  was already open
269d0 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20  ),.    ** write 
269e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
269f0 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  rd into the file
26a00 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  .  */.    if( rc
26a10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26a20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61       void *pData
26a30 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
26a40 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
26a50 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  = pPager->nSubRe
26a60 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  c*(4+pPager->pag
26a70 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 63 68  eSize);.      ch
26a80 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 0a 20  ar *pData2;.  . 
26a90 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
26aa0 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
26ab0 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20  pgno, 7, return 
26ac0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44  SQLITE_NOMEM, pD
26ad0 61 74 61 32 29 3b 0a 20 20 20 20 20 20 50 41 47  ata2);.      PAG
26ae0 45 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a  ERTRACE(("STMT-J
26af0 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
26b00 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
26b10 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
26b20 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ));.      rc = w
26b30 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
26b40 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c  r->sjfd, offset,
26b50 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
26b60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
26b70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
26b80 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
26b90 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ite(pPager->sjfd
26ba0 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
26bb0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
26bc0 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20  et+4);.      }. 
26bd0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
26be0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26bf0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62      pPager->nSub
26c00 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  Rec++;.    asser
26c10 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  t( pPager->nSave
26c20 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72  point>0 );.    r
26c30 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69  c = addToSavepoi
26c40 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
26c50 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
26c60 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
26c70 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
26c80 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
26c90 62 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61  by the pcache la
26ca0 79 65 72 20 77 68 65 6e 20 69 74 20 68 61 73 20  yer when it has 
26cb0 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20  reached some.** 
26cc0 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69  soft memory limi
26cd0 74 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67  t. The first arg
26ce0 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
26cf0 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62  er to a Pager ob
26d00 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73  ject.** (cast as
26d10 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70   a void*). The p
26d20 61 67 65 72 20 69 73 20 61 6c 77 61 79 73 20 27  ager is always '
26d30 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20  purgeable' (not 
26d40 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  an in-memory.** 
26d50 64 61 74 61 62 61 73 65 29 2e 20 54 68 65 20 73  database). The s
26d60 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
26d70 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
26d80 20 61 20 70 61 67 65 20 74 68 61 74 20 69 73 20   a page that is 
26d90 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69  .** currently di
26da0 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f  rty but has no o
26db0 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
26dc0 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a  ences. The page.
26dd0 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73 73  ** is always ass
26de0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
26df0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61   Pager object pa
26e00 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
26e10 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  t .** argument..
26e20 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66  **.** The job of
26e30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
26e40 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c  s to make pPg cl
26e50 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69  ean by writing i
26e60 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  ts contents.** o
26e70 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
26e80 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73  se file, if poss
26e90 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69  ible. This may i
26ea0 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74  nvolve syncing t
26eb0 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
26ec0 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  le. .**.** If su
26ed0 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65  ccessful, sqlite
26ee0 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
26ef0 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
26f00 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20  the page and.** 
26f10 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
26f20 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
26f30 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
26f40 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74  trying to make t
26f50 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e  he.** page clean
26f60 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  , the IO error c
26f70 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
26f80 20 49 66 20 74 68 65 20 70 61 67 65 20 63 61 6e   If the page can
26f90 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63  not be.** made c
26fa0 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74  lean for some ot
26fb0 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20  her reason, but 
26fc0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
26fd0 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a   then SQLITE_OK.
26fe0 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 62  ** is returned b
26ff0 79 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  y sqlite3PcacheM
27000 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f  akeClean() is no
27010 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  t called..*/.sta
27020 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72  tic int pagerStr
27030 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48  ess(void *p, PgH
27040 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
27050 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67  r *pPager = (Pag
27060 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63  er *)p;.  int rc
27070 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
27080 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
27090 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
270a0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
270b0 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
270c0 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f   );..  /* The do
270d0 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 66 6c 61  NotSyncSpill fla
270e0 67 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 20  g is set during 
270f0 74 69 6d 65 73 20 77 68 65 6e 20 64 6f 69 6e 67  times when doing
27100 20 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a 2a 20   a sync of.  ** 
27110 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 64 64  journal (and add
27120 69 6e 67 20 61 20 6e 65 77 20 68 65 61 64 65 72  ing a new header
27130 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  ) is not allowed
27140 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73 0a 20  .  This occurs. 
27150 20 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c 6c 73   ** during calls
27160 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
27170 57 72 69 74 65 28 29 20 77 68 69 6c 65 20 74 72  Write() while tr
27180 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  ying to journal 
27190 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20 70 61  multiple.  ** pa
271a0 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  ges belonging to
271b0 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72   the same sector
271c0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
271d0 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61 67 20  doNotSpill flag 
271e0 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63 61 63  inhibits all cac
271f0 68 65 20 73 70 69 6c 6c 69 6e 67 20 72 65 67 61  he spilling rega
27200 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
27210 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 61 20  r.  ** or not a 
27220 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64  sync is required
27230 2e 20 20 54 68 69 73 20 69 73 20 73 65 74 20 64  .  This is set d
27240 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
27250 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c  ..  **.  ** Spil
27260 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20 69 6e 68  ling is also inh
27270 69 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61  ibited when in a
27280 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 20  n error state.. 
27290 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
272a0 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75  ->errCode ) retu
272b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
272c0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  if( pPager->doNo
272d0 74 53 70 69 6c 6c 20 29 20 72 65 74 75 72 6e 20  tSpill ) return 
272e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
272f0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
27300 6e 63 53 70 69 6c 6c 20 26 26 20 28 70 50 67 2d  ncSpill && (pPg-
27310 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e  >flags & PGHDR_N
27320 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29 7b 0a  EED_SYNC)!=0 ){.
27330 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27340 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 67  E_OK;.  }..  pPg
27350 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
27360 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
27370 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f  pPager) ){.    /
27380 2a 20 57 72 69 74 65 20 61 20 73 69 6e 67 6c 65  * Write a single
27390 20 66 72 61 6d 65 20 66 6f 72 20 74 68 69 73 20   frame for this 
273a0 70 61 67 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e  page to the log.
273b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a   */.    if( subj
273c0 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
273d0 29 20 29 7b 20 0a 20 20 20 20 20 20 72 63 20 3d  ) ){ .      rc =
273e0 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
273f0 70 50 67 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20  pPg); .    }.   
27400 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27410 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
27420 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
27430 70 50 61 67 65 72 2c 20 70 50 67 2c 20 30 2c 20  pPager, pPg, 0, 
27440 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
27450 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20  else{.  .    /* 
27460 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
27470 20 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65   file if require
27480 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  d. */.    if( pP
27490 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
274a0 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20  EED_SYNC ){.    
274b0 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
274c0 61 6c 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  al(pPager, 1);. 
274d0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
274e0 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  f the page numbe
274f0 72 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 69  r of this page i
27500 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
27510 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
27520 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  f.    ** the dat
27530 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 74 20  abase image, it 
27540 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 77  may need to be w
27550 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75  ritten to the su
27560 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  b-journal..    *
27570 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  * This is becaus
27580 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 70 61  e the call to pa
27590 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
275a0 73 74 28 29 20 62 65 6c 6f 77 20 77 69 6c 6c 20  st() below will 
275b0 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 63 74 75 61  not.    ** actua
275c0 6c 6c 79 20 77 72 69 74 65 20 64 61 74 61 20 74  lly write data t
275d0 6f 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74 68  o the file in th
275e0 69 73 20 63 61 73 65 2e 0a 20 20 20 20 2a 2a 0a  is case..    **.
275f0 20 20 20 20 2a 2a 20 43 6f 6e 73 69 64 65 72 20      ** Consider 
27600 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  the following se
27610 71 75 65 6e 63 65 20 6f 66 20 65 76 65 6e 74 73  quence of events
27620 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
27630 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 2a 2a 20    BEGIN;.    ** 
27640 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67      <journal pag
27650 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20  e X>.    **     
27660 3c 6d 6f 64 69 66 79 20 70 61 67 65 20 58 3e 0a  <modify page X>.
27670 20 20 20 20 2a 2a 20 20 20 20 20 53 41 56 45 50      **     SAVEP
27680 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20 2a 2a 20  OINT sp;.    ** 
27690 20 20 20 20 20 20 3c 73 68 72 69 6e 6b 20 64 61        <shrink da
276a0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 59  tabase file to Y
276b0 20 70 61 67 65 73 3e 0a 20 20 20 20 2a 2a 20 20   pages>.    **  
276c0 20 20 20 20 20 70 61 67 65 72 53 74 72 65 73 73       pagerStress
276d0 28 70 61 67 65 20 58 29 0a 20 20 20 20 2a 2a 20  (page X).    ** 
276e0 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20      ROLLBACK TO 
276f0 73 70 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  sp;.    **.    *
27700 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68 65 6e  * If (X>Y), then
27710 20 77 68 65 6e 20 70 61 67 65 72 53 74 72 65 73   when pagerStres
27720 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67 65  s is called page
27730 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77   X will not be w
27740 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 6f 75  ritten.    ** ou
27750 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
27760 65 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c  e file, but will
27770 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d   be dropped from
27780 20 74 68 65 20 63 61 63 68 65 2e 20 54 68 65 6e   the cache. Then
27790 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  ,.    ** followi
277a0 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b  ng the "ROLLBACK
277b0 20 54 4f 20 73 70 22 20 73 74 61 74 65 6d 65 6e   TO sp" statemen
277c0 74 2c 20 72 65 61 64 69 6e 67 20 70 61 67 65 20  t, reading page 
277d0 58 20 77 69 6c 6c 20 72 65 61 64 0a 20 20 20 20  X will read.    
277e0 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
277f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
27800 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65  This will be the
27810 20 63 6f 70 79 20 6f 66 20 70 61 67 65 20 58 20   copy of page X 
27820 61 73 20 69 74 0a 20 20 20 20 2a 2a 20 77 61 73  as it.    ** was
27830 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
27840 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 6e  ction started, n
27850 6f 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65  ot as it was whe
27860 6e 20 22 53 41 56 45 50 4f 49 4e 54 20 73 70 22  n "SAVEPOINT sp"
27870 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 78 65 63  .    ** was exec
27880 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  uted..    **.   
27890 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e   ** The solution
278a0 20 69 73 20 74 6f 20 77 72 69 74 65 20 74 68 65   is to write the
278b0 20 63 75 72 72 65 6e 74 20 64 61 74 61 20 66 6f   current data fo
278c0 72 20 70 61 67 65 20 58 20 69 6e 74 6f 20 74 68  r page X into th
278d0 65 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d 6a 6f  e .    ** sub-jo
278e0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20 28  urnal file now (
278f0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
27900 65 61 64 79 20 74 68 65 72 65 29 2c 20 73 6f 20  eady there), so 
27910 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20 20 20  that it will.   
27920 20 2a 2a 20 62 65 20 72 65 73 74 6f 72 65 64 20   ** be restored 
27930 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 76  to its current v
27940 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20 22 52  alue when the "R
27950 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 69  OLLBACK TO sp" i
27960 73 20 0a 20 20 20 20 2a 2a 20 65 78 65 63 75 74  s .    ** execut
27970 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
27980 66 28 20 4e 45 56 45 52 28 0a 20 20 20 20 20 20  f( NEVER(.      
27990 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
279a0 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  && pPg->pgno>pPa
279b0 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 73  ger->dbSize && s
279c0 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
279d0 70 50 67 29 0a 20 20 20 20 29 20 29 7b 0a 20 20  pPg).    ) ){.  
279e0 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72      rc = subjour
279f0 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20  nalPage(pPg);.  
27a00 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72    }.  .    /* Wr
27a10 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ite the contents
27a20 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75 74   of the page out
27a30 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
27a40 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
27a50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27a60 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
27a70 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
27a80 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30  DR_NEED_SYNC)==0
27a90 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
27aa0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
27ab0 69 73 74 28 70 50 61 67 65 72 2c 20 70 50 67 29  ist(pPager, pPg)
27ac0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
27ad0 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
27ae0 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69  as clean. */.  i
27af0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27b00 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41   ){.    PAGERTRA
27b10 43 45 28 28 22 53 54 52 45 53 53 20 25 64 20 70  CE(("STRESS %d p
27b20 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
27b30 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
27b40 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c  >pgno));.    sql
27b50 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
27b60 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  ean(pPg);.  }.. 
27b70 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
27b80 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
27b90 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  .}.../*.** Alloc
27ba0 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
27bb0 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f  ze a new Pager o
27bc0 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61 20  bject and put a 
27bd0 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a  pointer to it.**
27be0 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68   in *ppPager. Th
27bf0 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65  e pager should e
27c00 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65  ventually be fre
27c10 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 69 74  ed by passing it
27c20 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
27c30 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a  gerClose()..**.*
27c40 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  * The zFilename 
27c50 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
27c60 70 61 74 68 20 74 6f 20 74 68 65 20 64 61 74 61  path to the data
27c70 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
27c80 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  n..** If zFilena
27c90 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
27ca0 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64  a randomly-named
27cb0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
27cc0 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
27cd0 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69  d used as the fi
27ce0 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e  le to be cached.
27cf0 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   Temporary files
27d00 20 61 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a   are be deleted.
27d10 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
27d20 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 63   when they are c
27d30 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e  losed. If zFilen
27d40 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
27d50 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69  " then .** all i
27d60 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65  nformation is he
27d70 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20  ld in cache. It 
27d80 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
27d90 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68   to disk. .** Th
27da0 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
27db0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69  o implement an i
27dc0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
27dd0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78  e..**.** The nEx
27de0 74 72 61 20 70 61 72 61 6d 65 74 65 72 20 73 70  tra parameter sp
27df0 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62  ecifies the numb
27e00 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
27e10 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  pace allocated.*
27e20 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63  * along with eac
27e30 68 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  h page reference
27e40 2e 20 54 68 69 73 20 73 70 61 63 65 20 69 73 20  . This space is 
27e50 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65  available to the
27e60 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65   user.** via the
27e70 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
27e80 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a  Extra() API..**.
27e90 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72 67  ** The flags arg
27ea0 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f  ument is used to
27eb0 20 73 70 65 63 69 66 79 20 70 72 6f 70 65 72 74   specify propert
27ec0 69 65 73 20 74 68 61 74 20 61 66 66 65 63 74 20  ies that affect 
27ed0 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  the.** operation
27ee0 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20 49   of the pager. I
27ef0 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73  t should be pass
27f00 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20  ed some bitwise 
27f10 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f  combination.** o
27f20 66 20 74 68 65 20 50 41 47 45 52 5f 4f 4d 49 54  f the PAGER_OMIT
27f30 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41 47  _JOURNAL and PAG
27f40 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66  ER_NO_READLOCK f
27f50 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lags..**.** The 
27f60 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74  vfsFlags paramet
27f70 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20  er is a bitmask 
27f80 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20 66  to pass to the f
27f90 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a  lags parameter.*
27fa0 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29  * of the xOpen()
27fb0 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73   method of the s
27fc0 75 70 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e  upplied VFS when
27fd0 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20   opening files. 
27fe0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
27ff0 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  ger object is al
28000 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
28010 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f  specified file o
28020 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73  pened .** succes
28030 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f  sfully, SQLITE_O
28040 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  K is returned an
28050 64 20 2a 70 70 50 61 67 65 72 20 73 65 74 20 74  d *ppPager set t
28060 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68  o point to.** th
28070 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65  e new pager obje
28080 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ct. If an error 
28090 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72  occurs, *ppPager
280a0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a   is set to NULL.
280b0 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64  ** and error cod
280c0 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  e returned. This
280d0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65   function may re
280e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
280f0 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c  M.** (sqlite3Mal
28100 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20 74 6f  loc() is used to
28110 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
28120 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  ), SQLITE_CANTOP
28130 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75  EN or .** variou
28140 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20  s SQLITE_IO_XXX 
28150 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  errors..*/.int s
28160 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
28170 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
28180 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54  pVfs,       /* T
28190 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20  he virtual file 
281a0 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f  system to use */
281b0 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67  .  Pager **ppPag
281c0 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  er,         /* O
281d0 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50  UT: Return the P
281e0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68  ager structure h
281f0 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
28200 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
28210 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
28220 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
28230 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
28240 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
28250 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79       /* Extra by
28260 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61  tes append to ea
28270 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
28280 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
28290 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
282a0 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c  /* flags control
282b0 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a  ling this file *
282c0 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
282d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
282e0 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  flags passed thr
282f0 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
28300 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20  vfs.xOpen() */. 
28310 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29   void (*xReinit)
28320 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e  (DbPage*) /* Fun
28330 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69  ction to reiniti
28340 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29  alize pages */.)
28350 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20  {.  u8 *pPtr;.  
28360 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
28370 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  0;       /* Page
28380 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f  r object to allo
28390 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  cate and return 
283a0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
283b0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a  LITE_OK;      /*
283c0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
283d0 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d    int tempFile =
283e0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
283f0 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65  ue for temp file
28400 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f  s (incl. in-memo
28410 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69  ry files) */.  i
28420 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20  nt memDb = 0;   
28430 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
28440 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  if this is an in
28450 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
28460 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d    int readOnly =
28470 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
28480 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
28490 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a  read-only file *
284a0 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46  /.  int journalF
284b0 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20  ileSize;     /* 
284c0 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  Bytes to allocat
284d0 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e  e for each journ
284e0 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20  al fd */.  char 
284f0 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20  *zPathname = 0; 
28500 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68      /* Full path
28510 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c   to database fil
28520 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68  e */.  int nPath
28530 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  name = 0;       
28540 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
28550 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20  es in zPathname 
28560 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72  */.  int useJour
28570 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50  nal = (flags & P
28580 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
28590 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20  L)==0; /* False 
285a0 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20  to omit journal 
285b0 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c  */.  int noReadl
285c0 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50  ock = (flags & P
285d0 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
285e0 29 21 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74  )!=0;  /* True t
285f0 6f 20 6f 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b  o omit read-lock
28600 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65   */.  int pcache
28610 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63  Size = sqlite3Pc
28620 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20  acheSize();     
28630 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
28640 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63 68  locate for PCach
28650 65 20 2a 2f 0a 20 20 75 31 36 20 73 7a 50 61 67  e */.  u16 szPag
28660 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44  eDflt = SQLITE_D
28670 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
28680 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61  ;  /* Default pa
28690 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a  ge size */..  /*
286a0 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
286b0 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65  much space is re
286c0 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20  quired for each 
286d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e  journal file-han
286e0 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20  dle.  ** (there 
286f0 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c  are two of them,
28700 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
28710 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f  l and the sub-jo
28720 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a  urnal). This.  *
28730 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  * is the maximum
28740 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
28750 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
28760 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
28770 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61  ndle .  ** and a
28780 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c   regular journal
28790 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f   file-handle. No
287a0 74 65 20 74 68 61 74 20 61 20 22 72 65 67 75 6c  te that a "regul
287b0 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c  ar journal-handl
287c0 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61  e".  ** may be a
287d0 20 77 72 61 70 70 65 72 20 63 61 70 61 62 6c 65   wrapper capable
287e0 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68 65 20   of caching the 
287f0 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66  first portion of
28800 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
28810 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79  * file in memory
28820 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
28830 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
28840 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65  ptimization (see
28850 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69   .  ** source fi
28860 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20  le journal.c).. 
28870 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
28880 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
28890 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75  s)>sqlite3MemJou
288a0 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20  rnalSize() ){.  
288b0 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
288c0 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74  e = ROUND8(sqlit
288d0 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56  e3JournalSize(pV
288e0 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fs));.  }else{. 
288f0 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
28900 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69  ze = ROUND8(sqli
28910 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a  te3MemJournalSiz
28920 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e());.  }..  /* 
28930 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76  Set the output v
28940 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20  ariable to NULL 
28950 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72  in case an error
28960 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70   occurs. */.  *p
28970 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f  pPager = 0;..  /
28980 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74  * Compute and st
28990 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74  ore the full pat
289a0 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f  hname in an allo
289b0 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69  cated buffer poi
289c0 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20  nted.  ** to by 
289d0 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74  zPathname, lengt
289e0 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c  h nPathname. Or,
289f0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65   if this is a te
28a00 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20  mporary file,.  
28a10 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50  ** leave both nP
28a20 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74  athname and zPat
28a30 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a  hname set to 0..
28a40 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
28a50 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
28a60 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74  e[0] ){.    nPat
28a70 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
28a80 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
28a90 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  zPathname = sqli
28aa0 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e  te3Malloc(nPathn
28ab0 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20  ame*2);.    if( 
28ac0 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a  zPathname==0 ){.
28ad0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
28ae0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
28af0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
28b00 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
28b10 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69    if( strcmp(zFi
28b20 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a  lename,":memory:
28b30 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  ")==0 ){.      m
28b40 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20  emDb = 1;.      
28b50 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30  zPathname[0] = 0
28b60 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
28b70 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a  if.    {.      z
28b80 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b  Pathname[0] = 0;
28b90 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e   /* Make sure in
28ba0 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69  itialized even i
28bb0 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29  f FullPathname()
28bc0 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20   fails */.      
28bd0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  rc = sqlite3OsFu
28be0 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
28bf0 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74   zFilename, nPat
28c00 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  hname, zPathname
28c10 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 50  );.    }..    nP
28c20 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
28c30 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e  3Strlen30(zPathn
28c40 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
28c50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
28c60 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d  Pathname+8>pVfs-
28c70 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  >mxPathname ){. 
28c80 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
28c90 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
28ca0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  n the journal pa
28cb0 74 68 20 72 65 71 75 69 72 65 64 20 62 79 0a 20  th required by. 
28cc0 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
28cd0 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  base being opene
28ce0 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74  d will be more t
28cf0 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  han pVfs->mxPath
28d00 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79  name.      ** by
28d10 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54  tes in length. T
28d20 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61  his means the da
28d30 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65  tabase cannot be
28d40 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a   opened,.      *
28d50 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74  * as it will not
28d60 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
28d70 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
28d80 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20   file or even.  
28d90 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72      ** check for
28da0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62   a hot-journal b
28db0 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20  efore reading.. 
28dc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
28dd0 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
28de0 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
28df0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28e00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
28e10 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68  lite3_free(zPath
28e20 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  name);.      ret
28e30 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
28e40 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
28e50 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20   memory for the 
28e60 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  Pager structure,
28e70 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20   PCache object, 
28e80 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66  the.  ** three f
28e90 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c  ile descriptors,
28ea0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
28eb0 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
28ec0 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
28ed0 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79  le name. The lay
28ee0 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73  out in memory is
28ef0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
28f00 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72  *.  **     Pager
28f10 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
28f20 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65             (size
28f30 6f 66 28 50 61 67 65 72 29 20 62 79 74 65 73 29  of(Pager) bytes)
28f40 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65  .  **     PCache
28f50 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
28f60 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
28f70 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 20 62  e3PcacheSize() b
28f80 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44  ytes).  **     D
28f90 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e  atabase file han
28fa0 64 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 28  dle            (
28fb0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62  pVfs->szOsFile b
28fc0 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53  ytes).  **     S
28fd0 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
28fe0 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28  handle         (
28ff0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
29000 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
29010 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  Main journal fil
29020 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
29030 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
29040 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
29050 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   Database file n
29060 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
29070 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79   (nPathname+1 by
29080 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f  tes).  **     Jo
29090 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
290a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
290b0 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74  Pathname+8+1 byt
290c0 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20  es).  */.  pPtr 
290d0 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d  = (u8 *)sqlite3M
290e0 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52  allocZero(.    R
290f0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50  OUND8(sizeof(*pP
29100 61 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a  ager)) +      /*
29110 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
29120 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
29130 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20  cacheSize) +    
29140 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65         /* PCache
29150 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52   object */.    R
29160 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73  OUND8(pVfs->szOs
29170 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a  File) +       /*
29180 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c   The main db fil
29190 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  e */.    journal
291a0 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20  FileSize * 2 +  
291b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
291c0 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  wo journal files
291d0 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61   */ .    nPathna
291e0 6d 65 20 2b 20 31 20 2b 20 20 20 20 20 20 20 20  me + 1 +        
291f0 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65          /* zFile
29200 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74  name */.    nPat
29210 68 6e 61 6d 65 20 2b 20 38 20 2b 20 31 20 20 20  hname + 8 + 1   
29220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a             /* zJ
29230 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
29240 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
29250 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d  L.    + nPathnam
29260 65 20 2b 20 34 20 2b 20 31 20 20 20 20 20 20 20  e + 4 + 1       
29270 20 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a         /* zWal *
29280 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20  /.#endif.  );.  
29290 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
292a0 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c  TE_ALIGNMENT(SQL
292b0 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a  ITE_INT_TO_PTR(j
292c0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29  ournalFileSize))
292d0 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72 20   );.  if( !pPtr 
292e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
292f0 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
29300 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29310 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
29320 50 61 67 65 72 20 3d 20 20 20 20 20 20 20 20 20  Pager =         
29330 20 20 20 20 20 28 50 61 67 65 72 2a 29 28 70 50       (Pager*)(pP
29340 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  tr);.  pPager->p
29350 50 43 61 63 68 65 20 3d 20 20 20 20 28 50 43 61  PCache =    (PCa
29360 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  che*)(pPtr += RO
29370 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61  UND8(sizeof(*pPa
29380 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72  ger)));.  pPager
29390 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65  ->fd =   (sqlite
293a0 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
293b0 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69   ROUND8(pcacheSi
293c0 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ze));.  pPager->
293d0 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  sjfd = (sqlite3_
293e0 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  file*)(pPtr += R
293f0 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73  OUND8(pVfs->szOs
29400 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72  File));.  pPager
29410 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65  ->jfd =  (sqlite
29420 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
29430 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
29440 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69  );.  pPager->zFi
29450 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61  lename =    (cha
29460 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72  r*)(pPtr += jour
29470 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20  nalFileSize);.  
29480 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
29490 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61  TE_ALIGNMENT(pPa
294a0 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  ger->jfd) );..  
294b0 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50  /* Fill in the P
294c0 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61  ager.zFilename a
294d0 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61  nd Pager.zJourna
294e0 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20 72 65  l buffers, if re
294f0 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28  quired. */.  if(
29500 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20   zPathname ){.  
29510 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e    pPager->zJourn
29520 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70  al =   (char*)(p
29530 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65  Ptr += nPathname
29540 20 2b 20 31 29 3b 0a 20 20 20 20 6d 65 6d 63 70   + 1);.    memcp
29550 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  y(pPager->zFilen
29560 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  ame, zPathname, 
29570 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
29580 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
29590 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61  Journal, zPathna
295a0 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
295b0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
295c0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
295d0 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e  thname], "-journ
295e0 61 6c 22 2c 20 38 29 3b 0a 20 20 20 20 69 66 28  al", 8);.    if(
295f0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
29600 6d 65 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  me[0]==0 ){.    
29610 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e    pPager->zJourn
29620 61 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  al[0] = 0;.    }
29630 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29640 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 65 6c 73  OMIT_WAL.    els
29650 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e{.      pPager-
29660 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d  >zWal = &pPager-
29670 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e  >zJournal[nPathn
29680 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 20 20  ame+8+1];.      
29690 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
296a0 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  Wal, zPathname, 
296b0 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
296c0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
296d0 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ->zWal[nPathname
296e0 5d 2c 20 22 2d 77 61 6c 22 2c 20 34 29 3b 0a 20  ], "-wal", 4);. 
296f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
29700 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
29710 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70  thname);.  }.  p
29720 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56  Pager->pVfs = pV
29730 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66  fs;.  pPager->vf
29740 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67  sFlags = vfsFlag
29750 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  s;..  /* Open th
29760 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20  e pager file..  
29770 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
29780 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
29790 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a  0] && !memDb ){.
297a0 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30      int fout = 0
297b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
297c0 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67       /* VFS flag
297d0 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f  s returned by xO
297e0 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20  pen() */.    rc 
297f0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
29800 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46  pVfs, pPager->zF
29810 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
29820 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26  >fd, vfsFlags, &
29830 66 6f 75 74 29 3b 0a 20 20 20 20 72 65 61 64 4f  fout);.    readO
29840 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49  nly = (fout&SQLI
29850 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
29860 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
29870 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65  e file was succe
29880 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66  ssfully opened f
29890 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
298a0 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f  cess,.    ** cho
298b0 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61  ose a default pa
298c0 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20  ge size in case 
298d0 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74  we have to creat
298e0 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
298f0 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
29900 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
29910 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  e is the maximum
29920 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
29930 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44  **    + SQLITE_D
29940 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
29950 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  ,.    **    + Th
29960 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
29970 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
29980 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
29990 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73      + The larges
299a0 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74  t page size that
299b0 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
299c0 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20  atomically..    
299d0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
299e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61  QLITE_OK && !rea
299f0 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 73  dOnly ){.      s
29a00 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
29a10 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ger);.      asse
29a20 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  rt(SQLITE_DEFAUL
29a30 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c  T_PAGE_SIZE<=SQL
29a40 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
29a50 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
29a60 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74    if( szPageDflt
29a70 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  <pPager->sectorS
29a80 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ize ){.        i
29a90 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  f( pPager->secto
29aa0 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  rSize>SQLITE_MAX
29ab0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
29ac0 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ZE ){.          
29ad0 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
29ae0 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
29af0 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20  PAGE_SIZE;.     
29b00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29b10 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
29b20 20 28 75 31 36 29 70 50 61 67 65 72 2d 3e 73 65   (u16)pPager->se
29b30 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  ctorSize;.      
29b40 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64    }.      }.#ifd
29b50 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
29b60 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
29b70 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e      {.        in
29b80 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
29b90 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
29ba0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
29bb0 64 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  d);.        int 
29bc0 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ii;.        asse
29bd0 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
29be0 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
29bf0 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >8));.        as
29c00 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
29c10 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
29c20 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  536>>8));.      
29c30 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
29c40 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
29c50 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20  _SIZE<=65536);. 
29c60 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a         for(ii=sz
29c70 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51  PageDflt; ii<=SQ
29c80 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
29c90 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69  _PAGE_SIZE; ii=i
29ca0 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i*2){.          
29cb0 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f  if( iDc&(SQLITE_
29cc0 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69  IOCAP_ATOMIC|(ii
29cd0 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20  >>8)) ){.       
29ce0 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20       szPageDflt 
29cf0 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20  = ii;.          
29d00 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
29d10 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
29d20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
29d30 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   If a temporary 
29d40 66 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65  file is requeste
29d50 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  d, it is not ope
29d60 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ned immediately.
29d70 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  .    ** In this 
29d80 63 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74  case we accept t
29d90 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
29da0 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61  size and delay a
29db0 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f  ctually.    ** o
29dc0 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20  pening the file 
29dd0 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
29de0 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28  call to OsWrite(
29df0 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
29e00 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
29e10 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20  also run for an 
29e20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
29e30 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79  se. An in-memory
29e40 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
29e50 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
29e60 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74  a temp-file that
29e70 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65   is never writte
29e80 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20  n out to.    ** 
29e90 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e  disk and uses an
29ea0 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62   in-memory rollb
29eb0 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ack journal..   
29ec0 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c   */ .    tempFil
29ed0 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
29ee0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
29ef0 52 5f 52 45 41 44 45 52 3b 0a 20 20 20 20 70 50  R_READER;.    pP
29f00 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58  ager->eLock = EX
29f10 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20  CLUSIVE_LOCK;.  
29f20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66    readOnly = (vf
29f30 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
29f40 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
29f50 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
29f60 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61  owing call to Pa
29f70 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
29f80 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74   serves to set t
29f90 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a  he value of .  *
29fa0 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
29fb0 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65   and to allocate
29fc0 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53   the Pager.pTmpS
29fd0 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a  pace buffer..  *
29fe0 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
29ff0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
2a000 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d  ert( pPager->mem
2a010 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  Db==0 );.    rc 
2a020 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
2a030 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
2a040 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d  , &szPageDflt, -
2a050 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
2a060 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2a070 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
2a080 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  an error occurre
2a090 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74  d in either of t
2a0a0 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c  he blocks above,
2a0b0 20 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a 20   free the .  ** 
2a0c0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
2a0d0 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69  and close the fi
2a0e0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  le..  */.  if( r
2a0f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2a100 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
2a110 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  ger->pTmpSpace )
2a120 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  ;.    sqlite3OsC
2a130 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
2a140 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
2a150 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ee(pPager);.    
2a160 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
2a170 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
2a180 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63  the PCache objec
2a190 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  t. */.  assert( 
2a1a0 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20  nExtra<1000 );. 
2a1b0 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38   nExtra = ROUND8
2a1c0 28 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69  (nExtra);.  sqli
2a1d0 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a  te3PcacheOpen(sz
2a1e0 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61  PageDflt, nExtra
2a1f0 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20  , !memDb,.      
2a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d                !m
2a210 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73  emDb?pagerStress
2a220 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  :0, (void *)pPag
2a230 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61  er, pPager->pPCa
2a240 63 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52  che);..  PAGERTR
2a250 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE(("OPEN %d %s
2a260 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
2a270 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70  D(pPager->fd), p
2a280 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2a290 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
2a2a0 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70  OPEN %p %s\n", p
2a2b0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a  Pager, pPager->z
2a2c0 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50  Filename))..  pP
2a2d0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2a2e0 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61   = (u8)useJourna
2a2f0 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52  l;.  pPager->noR
2a300 65 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61  eadlock = (noRea
2a310 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c  dlock && readOnl
2a320 79 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50  y) ?1:0;.  /* pP
2a330 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
2a340 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2a350 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
2a360 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2a370 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a  r->nRef = 0; */.
2a380 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2a390 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  tSize = 0; */.  
2a3a0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  /* pPager->stmtJ
2a3b0 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
2a3c0 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20  * pPager->nPage 
2a3d0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
2a3e0 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54  ->mxPgno = SQLIT
2a3f0 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54  E_MAX_PAGE_COUNT
2a400 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
2a410 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
2a420 4f 43 4b 3b 20 2a 2f 0a 23 69 66 20 30 0a 20 20  OCK; */.#if 0.  
2a430 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2a440 73 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69  state == (tempFi
2a450 6c 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55  le ? PAGER_EXCLU
2a460 53 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c  SIVE : PAGER_UNL
2a470 4f 43 4b 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  OCK) );.#endif. 
2a480 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d   /* pPager->errM
2a490 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ask = 0; */.  pP
2a4a0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d  ager->tempFile =
2a4b0 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20   (u8)tempFile;. 
2a4c0 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c   assert( tempFil
2a4d0 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
2a4e0 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20  MODE_NORMAL .   
2a4f0 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69         || tempFi
2a500 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
2a510 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
2a520 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
2a530 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
2a540 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20  XCLUSIVE==1 );. 
2a550 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
2a560 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d  veMode = (u8)tem
2a570 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72  pFile; .  pPager
2a580 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
2a590 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
2a5a0 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
2a5b0 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44  memDb = (u8)memD
2a5c0 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61  b;.  pPager->rea
2a5d0 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64  dOnly = (u8)read
2a5e0 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74 28 20  Only;.  assert( 
2a5f0 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50  useJournal || pP
2a600 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
2a610 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  ;.  pPager->noSy
2a620 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  nc = pPager->tem
2a630 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
2a640 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 70 50 61 67  >fullSync = pPag
2a650 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b  er->noSync ?0:1;
2a660 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  .  pPager->sync_
2a670 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  flags = SQLITE_S
2a680 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a  YNC_NORMAL;.  /*
2a690 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
2a6a0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2a6b0 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
2a6c0 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  d = 0; */.  /* p
2a6d0 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30  Pager->pLast = 0
2a6e0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
2a6f0 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78  Extra = (u16)nEx
2a700 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  tra;.  pPager->j
2a710 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
2a720 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
2a730 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49  _JOURNAL_SIZE_LI
2a740 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69  MIT;.  assert( i
2a750 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
2a760 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b  ) || tempFile );
2a770 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  .  setSectorSize
2a780 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
2a790 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  !useJournal ){. 
2a7a0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2a7b0 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
2a7c0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a  OURNALMODE_OFF;.
2a7d0 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44    }else if( memD
2a7e0 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  b ){.    pPager-
2a7f0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
2a800 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2a810 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f  _MEMORY;.  }.  /
2a820 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  * pPager->xBusyH
2a830 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20  andler = 0; */. 
2a840 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73   /* pPager->pBus
2a850 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b  yHandlerArg = 0;
2a860 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52   */.  pPager->xR
2a870 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69  einiter = xReini
2a880 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70  t;.  /* memset(p
2a890 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c  Pager->aHash, 0,
2a8a0 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
2a8b0 61 48 61 73 68 29 29 3b 20 2a 2f 0a 0a 20 20 2a  aHash)); */..  *
2a8c0 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
2a8d0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2a8e0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  E_OK;.}..../*.**
2a8f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2a900 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  s called after t
2a910 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f  ransitioning fro
2a920 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74  m PAGER_UNLOCK t
2a930 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45  o.** PAGER_SHARE
2a940 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73 74  D state. It test
2a950 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
2a960 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73  hot journal pres
2a970 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69  ent in.** the fi
2a980 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  le-system for th
2a990 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41  e given pager. A
2a9a0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20   hot journal is 
2a9b0 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65  one that .** nee
2a9c0 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
2a9d0 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20  back. According 
2a9e0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
2a9f0 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a  , a hot-journal.
2aa00 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  ** file exists i
2aa10 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2aa20 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65 74  criteria are met
2aa30 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
2aa40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
2aa50 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  sts in the file 
2aa60 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20  system, and.**  
2aa70 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f   * No process ho
2aa80 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6f  lds a RESERVED o
2aa90 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
2aaa0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2aab0 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ile, and.**   * 
2aac0 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
2aad0 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65 61  e itself is grea
2aae0 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
2aaf0 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a   in size, and.**
2ab00 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20 62     * The first b
2ab10 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  yte of the journ
2ab20 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
2ab30 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a  nd is not 0x00..
2ab40 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
2ab50 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
2ab60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2ab70 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61  s 0 but a journa
2ab80 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73  l file.** exists
2ab90 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62  , that is probab
2aba0 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ly an old journa
2abb0 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d  l left over from
2abc0 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61   a prior.** data
2abd0 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
2abe0 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  me name. In this
2abf0 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61   case the journa
2ac00 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73  l file is.** jus
2ac10 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  t deleted using 
2ac20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73  OsDelete, *pExis
2ac30 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  ts is set to 0 a
2ac40 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  nd SQLITE_OK.** 
2ac50 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
2ac60 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2ac70 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69  does not check i
2ac80 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61 73  f there is a mas
2ac90 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
2aca0 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65  name.** at the e
2acb0 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20  nd of the file. 
2acc0 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64  If there is, and
2acd0 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75   that master jou
2ace0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65  rnal file.** doe
2acf0 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65  s not exist, the
2ad00 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
2ad10 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
2ad20 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a   hot. In this.**
2ad30 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
2ad40 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  ne will return a
2ad50 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e   false-positive.
2ad60 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   The pager_playb
2ad70 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ack().** routine
2ad80 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74   will discover t
2ad90 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
2ada0 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  file is not real
2adb0 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77  ly hot and .** w
2adc0 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20  ill not roll it 
2add0 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  back. .**.** If 
2ade0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
2adf0 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65  le is found to e
2ae00 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69  xist, *pExists i
2ae10 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a  s set to 1 and .
2ae20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
2ae30 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74  urned. If no hot
2ae40 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
2ae50 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73   present, *pExis
2ae60 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ts is.** set to 
2ae70 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  0 and SQLITE_OK 
2ae80 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
2ae90 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
2aea0 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20  while trying.** 
2aeb0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
2aec0 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f  ther or not a ho
2aed0 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  t-journal file e
2aee0 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72  xists, the IO er
2aef0 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72  ror.** code is r
2af00 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
2af10 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74  value of *pExist
2af20 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a  s is undefined..
2af30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
2af40 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sHotJournal(Page
2af50 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
2af60 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69  pExists){.  sqli
2af70 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
2af80 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
2af90 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Vfs;.  int rc = 
2afa0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2afb0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2afc0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69  ode */.  int exi
2afd0 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  sts = 1;        
2afe0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2aff0 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
2b000 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
2b010 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20   int jrnlOpen = 
2b020 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  !!isOpen(pPager-
2b030 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74  >jfd);..  assert
2b040 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
2b050 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
2b060 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2b070 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  >fd) );.  assert
2b080 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
2b090 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
2b0a0 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f  .  assert( jrnlO
2b0b0 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69  pen==0 || ( sqli
2b0c0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
2b0d0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
2b0e0 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51  r->jfd) &.    SQ
2b0f0 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
2b100 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
2b110 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73  .  ));..  *pExis
2b120 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a  ts = 0;.  if( !j
2b130 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  rnlOpen ){.    r
2b140 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
2b150 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72  ess(pVfs, pPager
2b160 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  ->zJournal, SQLI
2b170 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
2b180 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a  , &exists);.  }.
2b190 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2b1a0 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b  _OK && exists ){
2b1b0 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20  .    int locked 
2b1c0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2b1d0 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65   /* True if some
2b1e0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
2b1f0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
2b200 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63  /..    /* Race c
2b210 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20  ondition here:  
2b220 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  Another process 
2b230 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
2b240 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20  holding the.    
2b250 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ** the RESERVED 
2b260 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20  lock and have a 
2b270 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20  journal open at 
2b280 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63  the sqlite3OsAcc
2b290 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61  ess() .    ** ca
2b2a0 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68  ll above, but th
2b2b0 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  en delete the jo
2b2c0 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74  urnal and drop t
2b2d0 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20  he lock before. 
2b2e0 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20     ** we get to 
2b2f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71  the following sq
2b300 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
2b310 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e  rvedLock() call.
2b320 20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a    If that.    **
2b330 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
2b340 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
2b350 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20   think there is 
2b360 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68  a hot journal wh
2b370 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63  en.    ** in fac
2b380 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e  t there is none.
2b390 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69    This results i
2b3a0 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
2b3b0 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20  ve which will.  
2b3c0 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69    ** be dealt wi
2b3d0 74 68 20 62 79 20 74 68 65 20 70 6c 61 79 62 61  th by the playba
2b3e0 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63  ck routine.  Tic
2b3f0 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a  ket #3883..    *
2b400 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2b410 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
2b420 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  dLock(pPager->fd
2b430 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20  , &locked);.    
2b440 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b450 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a  K && !locked ){.
2b460 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65        Pgno nPage
2b470 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b480 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
2b490 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
2b4a0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20   file */..      
2b4b0 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 73 69 7a  /* Check the siz
2b4c0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2b4d0 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20 63 6f  e file. If it co
2b4e0 6e 73 69 73 74 73 20 6f 66 20 30 20 70 61 67 65  nsists of 0 page
2b4f0 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  s,.      ** then
2b500 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
2b510 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65 20 74 68  nal file. See th
2b520 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
2b530 20 61 62 6f 76 65 20 66 6f 72 20 0a 20 20 20 20   above for .    
2b540 20 20 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e 69    ** the reasoni
2b550 6e 67 20 68 65 72 65 2e 20 20 44 65 6c 65 74 65  ng here.  Delete
2b560 20 74 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f   the obsolete jo
2b570 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65 72  urnal file under
2b580 0a 20 20 20 20 20 20 2a 2a 20 61 20 52 45 53 45  .      ** a RESE
2b590 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f  RVED lock to avo
2b5a0 69 64 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  id race conditio
2b5b0 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f 69 64 20  ns and to avoid 
2b5c0 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20 20  violating.      
2b5d0 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20  ** [H33020]..   
2b5e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
2b5f0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
2b600 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
2b610 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2b620 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b630 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
2b640 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2b650 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
2b660 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
2b670 20 20 20 20 69 66 28 20 70 61 67 65 72 4c 6f 63      if( pagerLoc
2b680 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45  kDb(pPager, RESE
2b690 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49  RVED_LOCK)==SQLI
2b6a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2b6b0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
2b6c0 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65  lete(pVfs, pPage
2b6d0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
2b6e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67  .            pag
2b6f0 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
2b700 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
2b710 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2b720 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
2b730 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
2b740 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2b750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2b760 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
2b770 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ists and no othe
2b780 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  r connection has
2b790 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20 20   a reserved.    
2b7a0 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61        ** or grea
2b7b0 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
2b7c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e  database file. N
2b7d0 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ow check that th
2b7e0 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20  ere is.         
2b7f0 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
2b800 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20   non-zero bytes 
2b810 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
2b820 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2b830 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  ..          ** I
2b840 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e  f there is, then
2b850 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69   we consider thi
2b860 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  s journal to be 
2b870 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20  hot. If not, .  
2b880 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61          ** it ca
2b890 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20  n be ignored..  
2b8a0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2b8b0 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70       if( !jrnlOp
2b8c0 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
2b8d0 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45    int f = SQLITE
2b8e0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
2b8f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2b900 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
2b910 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2b920 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
2b930 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2b940 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20  pPager->jfd, f, 
2b950 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  &f);.          }
2b960 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2b970 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2b980 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20 66              u8 f
2b990 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  irst = 0;.      
2b9a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2b9b0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
2b9c0 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66  >jfd, (void *)&f
2b9d0 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  irst, 1, 0);.   
2b9e0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
2b9f0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
2ba00 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
2ba10 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2ba20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2ba30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ba40 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65      if( !jrnlOpe
2ba50 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
2ba60 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
2ba70 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
2ba80 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2ba90 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73            *pExis
2baa0 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29 3b  ts = (first!=0);
2bab0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2bac0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2bad0 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20  CANTOPEN ){.    
2bae0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
2baf0 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65   cannot open the
2bb00 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
2bb10 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  l file in order 
2bb20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20 20  to see if.      
2bb30 20 20 20 20 20 20 2a 2a 20 69 74 73 20 68 61 73        ** its has
2bb40 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c 20   a zero header, 
2bb50 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 64 75  that might be du
2bb60 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f  e to an I/O erro
2bb70 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20  r, or.          
2bb80 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65    ** it might be
2bb90 20 64 75 65 20 74 6f 20 74 68 65 20 72 61 63 65   due to the race
2bba0 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
2bbb0 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20 69  ibed above and i
2bbc0 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  n.            **
2bbd0 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20 20   ticket #3883.  
2bbe0 45 69 74 68 65 72 20 77 61 79 2c 20 61 73 73 75  Either way, assu
2bbf0 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  me that the jour
2bc00 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20 20  nal is hot..    
2bc10 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
2bc20 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c 73 65  might be a false
2bc30 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74 20   positive.  But 
2bc40 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74  if it is, then t
2bc50 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  he.            *
2bc60 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72  * automatic jour
2bc70 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e 64  nal playback and
2bc80 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61 6e   recovery mechan
2bc90 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20  ism will deal.  
2bca0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74            ** wit
2bcb0 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45 58  h it under an EX
2bcc0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68 65  CLUSIVE lock whe
2bcd0 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  re we do not nee
2bce0 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20  d to.           
2bcf0 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75 63   ** worry so muc
2bd00 68 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e 64  h with race cond
2bd10 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20  itions..        
2bd20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
2bd30 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b     *pExists = 1;
2bd40 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2bd50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2bd60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bd70 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2bd80 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
2bd90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
2bda0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2bdb0 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  led to obtain a 
2bdc0 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
2bdd0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2bde0 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67  ..** It is illeg
2bdf0 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  al to call sqlit
2be00 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 29  e3PagerAcquire()
2be10 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 69   until after thi
2be20 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61  s function.** ha
2be30 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
2be40 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20 61  lly called. If a
2be50 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20   shared-lock is 
2be60 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68 65  already held whe
2be70 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  n.** this functi
2be80 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
2be90 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
2bea0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
2beb0 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20   operations are 
2bec0 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20 62  also performed b
2bed0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
2bee0 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20 74  .**.**   1) If t
2bef0 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72 72  he pager is curr
2bf00 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f 55  ently in PAGER_U
2bf10 4e 4c 4f 43 4b 20 73 74 61 74 65 20 28 6e 6f 20  NLOCK state (no 
2bf20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20  lock held.**    
2bf30 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73    on the databas
2bf40 65 20 66 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e  e file), then an
2bf50 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
2bf60 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20   to obtain a.** 
2bf70 20 20 20 20 20 53 48 41 52 45 44 20 6c 6f 63 6b       SHARED lock
2bf80 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2bf90 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65   file. Immediate
2bfa0 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69  ly after obtaini
2bfb0 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 53  ng.**      the S
2bfc0 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
2bfd0 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 63  file-system is c
2bfe0 68 65 63 6b 65 64 20 66 6f 72 20 61 20 68 6f 74  hecked for a hot
2bff0 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20  -journal,.**    
2c000 20 20 77 68 69 63 68 20 69 73 20 70 6c 61 79 65    which is playe
2c010 64 20 62 61 63 6b 20 69 66 20 70 72 65 73 65 6e  d back if presen
2c020 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79  t. Following any
2c030 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a   hot-journal .**
2c040 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20        rollback, 
2c050 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2c060 74 68 65 20 63 61 63 68 65 20 61 72 65 20 76 61  the cache are va
2c070 6c 69 64 61 74 65 64 20 62 79 20 63 68 65 63 6b  lidated by check
2c080 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20  ing.**      the 
2c090 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27  'change-counter'
2c0a0 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 64 61   field of the da
2c0b0 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64  tabase file head
2c0c0 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64  er and.**      d
2c0d0 69 73 63 61 72 64 65 64 20 69 66 20 74 68 65 79  iscarded if they
2c0e0 20 61 72 65 20 66 6f 75 6e 64 20 74 6f 20 62 65   are found to be
2c0f0 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20   invalid..**.** 
2c100 20 20 32 29 20 49 66 20 74 68 65 20 70 61 67 65    2) If the page
2c110 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20  r is running in 
2c120 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20  exclusive-mode, 
2c130 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 63 75  and there are cu
2c140 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20  rrently.**      
2c150 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
2c160 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6e 79  eferences to any
2c170 20 70 61 67 65 73 2c 20 61 6e 64 20 69 73 20 69   pages, and is i
2c180 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
2c190 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e 20  e,.**      then 
2c1a0 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  an attempt is ma
2c1b0 64 65 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20  de to clear the 
2c1c0 65 72 72 6f 72 20 73 74 61 74 65 20 62 79 20 64  error state by d
2c1d0 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20  iscarding.**    
2c1e0 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
2c1f0 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2c200 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63   and rolling bac
2c210 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e  k any open journ
2c220 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e  al.**      file.
2c230 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70  .**.** If the op
2c240 65 72 61 74 69 6f 6e 20 64 65 73 63 72 69 62 65  eration describe
2c250 64 20 62 79 20 28 32 29 20 61 62 6f 76 65 20 69  d by (2) above i
2c260 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c  s not attempted,
2c270 20 61 6e 64 20 69 66 20 74 68 65 0a 2a 2a 20 70   and if the.** p
2c280 61 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72  ager is in an er
2c290 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20  ror state other 
2c2a0 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  than SQLITE_FULL
2c2b0 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   when this is ca
2c2c0 6c 6c 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72  lled,.** the err
2c2d0 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
2c2e0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
2c2f0 20 49 74 20 69 73 20 70 65 72 6d 69 74 74 65 64   It is permitted
2c300 20 74 6f 20 72 65 61 64 20 74 68 65 0a 2a 2a 20   to read the.** 
2c310 64 61 74 61 62 61 73 65 20 77 68 65 6e 20 69 6e  database when in
2c320 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 65 72 72   SQLITE_FULL err
2c330 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  or state..**.** 
2c340 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 65 76  Otherwise, if ev
2c350 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
2c360 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
2c370 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
2c380 66 20 61 6e 0a 2a 2a 20 49 4f 20 65 72 72 6f 72  f an.** IO error
2c390 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c 6f   occurs while lo
2c3a0 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  cking the databa
2c3b0 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  se, checking for
2c3c0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a   a hot-journal.*
2c3d0 2a 20 66 69 6c 65 20 6f 72 20 72 6f 6c 6c 69 6e  * file or rollin
2c3e0 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  g back a journal
2c3f0 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65 72   file, the IO er
2c400 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2c410 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
2c420 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c  ite3PagerSharedL
2c430 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
2c440 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
2c450 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2c460 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2c470 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
2c480 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2c490 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f   only called fro
2c4a0 6d 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c  m b-tree and onl
2c4b0 79 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  y when there are
2c4c0 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e   no.  ** outstan
2c4d0 64 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69 73  ding pages. This
2c4e0 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68   implies that th
2c4f0 65 20 70 61 67 65 72 20 73 74 61 74 65 20 73 68  e pager state sh
2c500 6f 75 6c 64 20 65 69 74 68 65 72 0a 20 20 2a 2a  ould either.  **
2c510 20 62 65 20 4f 50 45 4e 20 6f 72 20 52 45 41 44   be OPEN or READ
2c520 45 52 2e 20 52 45 41 44 45 52 20 69 73 20 6f 6e  ER. READER is on
2c530 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20 74  ly possible if t
2c540 68 65 20 70 61 67 65 72 20 69 73 20 6f 72 20 77  he pager is or w
2c550 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65 78 63 6c  as in .  ** excl
2c560 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64  usive access mod
2c570 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
2c580 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
2c590 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
2c5a0 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
2c5b0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
2c5c0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
2c5d0 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
2c5e0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2c5f0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70  =PAGER_OPEN || p
2c600 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
2c610 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
2c620 20 69 66 28 20 4e 45 56 45 52 28 4d 45 4d 44 42   if( NEVER(MEMDB
2c630 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
2c640 6f 64 65 29 20 29 7b 20 72 65 74 75 72 6e 20 70  ode) ){ return p
2c650 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 20  Pager->errCode; 
2c660 7d 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72 55  }..  if( !pagerU
2c670 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26  seWal(pPager) &&
2c680 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2c690 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20  =PAGER_OPEN ){. 
2c6a0 20 20 20 69 6e 74 20 62 48 6f 74 4a 6f 75 72 6e     int bHotJourn
2c6b0 61 6c 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  al = 1;         
2c6c0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72   /* True if ther
2c6d0 65 20 65 78 69 73 74 73 20 61 20 68 6f 74 20 6a  e exists a hot j
2c6e0 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a  ournal-file */..
2c6f0 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
2c700 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  DB );.    assert
2c710 28 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64  ( pPager->noRead
2c720 6c 6f 63 6b 3d 3d 30 20 7c 7c 20 70 50 61 67 65  lock==0 || pPage
2c730 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a  r->readOnly );..
2c740 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2c750 6e 6f 52 65 61 64 6c 6f 63 6b 3d 3d 30 20 29 7b  noReadlock==0 ){
2c760 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2c770 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
2c780 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
2c790 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
2c7a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2c7b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2c7c0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e  pPager->eLock==N
2c7d0 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72  O_LOCK || pPager
2c7e0 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e  ->eLock==UNKNOWN
2c7f0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  _LOCK );.       
2c800 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
2c810 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2c820 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
2c830 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
2c840 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
2c850 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
2c860 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
2c870 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
2c880 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
2c890 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
2c8a0 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
2c8b0 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
2c8c0 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  r->eLock<=SHARED
2c8d0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  _LOCK ){.      r
2c8e0 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  c = hasHotJourna
2c8f0 6c 28 70 50 61 67 65 72 2c 20 26 62 48 6f 74 4a  l(pPager, &bHotJ
2c900 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  ournal);.    }. 
2c910 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2c920 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
2c930 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  to failed;.    }
2c940 0a 20 20 20 20 69 66 28 20 62 48 6f 74 4a 6f 75  .    if( bHotJou
2c950 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a  rnal ){.      /*
2c960 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   Get an EXCLUSIV
2c970 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
2c980 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20  tabase file. At 
2c990 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73  this point it is
2c9a0 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74  .      ** import
2c9b0 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52  ant that a RESER
2c9c0 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
2c9d0 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
2c9e0 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20  way to the.     
2c9f0 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
2ca00 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20  ck. If it were, 
2ca10 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
2ca20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20  might open the. 
2ca30 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
2ca40 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68   file, detect th
2ca50 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  e RESERVED lock,
2ca60 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68   and conclude th
2ca70 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
2ca80 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65  database is safe
2ca90 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74   to read while t
2caa0 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73  his process is s
2cab0 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65  till rolling the
2cac0 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a   .      ** hot-j
2cad0 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20  ournal back..   
2cae0 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20     ** .      ** 
2caf0 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65  Because the inte
2cb00 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45  rmediate RESERVE
2cb10 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  D lock is not re
2cb20 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20  quested, any.   
2cb30 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63     ** other proc
2cb40 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ess attempting t
2cb50 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
2cb60 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20  abase file will 
2cb70 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  get to .      **
2cb80 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74   this point in t
2cb90 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c  he code and fail
2cba0 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f   to obtain its o
2cbb0 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  wn EXCLUSIVE loc
2cbc0 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  k .      ** on t
2cbd0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cbe0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2cbf0 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70   ** Unless the p
2cc00 61 67 65 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69  ager is in locki
2cc10 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
2cc20 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b  e mode, the lock
2cc30 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77   is.      ** dow
2cc40 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41 52 45  ngraded to SHARE
2cc50 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20 74 68  D_LOCK before th
2cc60 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
2cc70 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  rns..      */.  
2cc80 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
2cc90 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58 43  ckDb(pPager, EXC
2cca0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
2ccb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2ccc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2ccd0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
2cce0 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a      }. .      /*
2ccf0 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   If it is not al
2cd00 72 65 61 64 79 20 6f 70 65 6e 20 61 6e 64 20 74  ready open and t
2cd10 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 20 6f  he file exists o
2cd20 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65  n disk, open the
2cd30 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e   .      ** journ
2cd40 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  al for read/writ
2cd50 65 20 61 63 63 65 73 73 2e 20 57 72 69 74 65 20  e access. Write 
2cd60 61 63 63 65 73 73 20 69 73 20 72 65 71 75 69 72  access is requir
2cd70 65 64 20 62 65 63 61 75 73 65 20 0a 20 20 20 20  ed because .    
2cd80 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73 69 76    ** in exclusiv
2cd90 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68  e-access mode th
2cda0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2cdb0 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f  r will be kept o
2cdc0 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  pen .      ** an
2cdd0 64 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20  d possibly used 
2cde0 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
2cdf0 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f  n later on. Also
2ce00 2c 20 77 72 69 74 65 2d 61 63 63 65 73 73 20 0a  , write-access .
2ce10 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 75 61        ** is usua
2ce20 6c 6c 79 20 72 65 71 75 69 72 65 64 20 74 6f 20  lly required to 
2ce30 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
2ce40 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f  rnal in journal_
2ce50 6d 6f 64 65 3d 70 65 72 73 69 73 74 20 0a 20 20  mode=persist .  
2ce60 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64      ** mode (and
2ce70 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61   also for journa
2ce80 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 20  l_mode=truncate 
2ce90 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 29  on some systems)
2cea0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2ceb0 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   ** If the journ
2cec0 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  al does not exis
2ced0 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65  t, it usually me
2cee0 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a 20  ans that some . 
2cef0 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f       ** other co
2cf00 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64  nnection managed
2cf10 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64 20 72   to get in and r
2cf20 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65 66 6f  oll it back befo
2cf30 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  re .      ** thi
2cf40 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74  s connection obt
2cf50 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73  ained the exclus
2cf60 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20  ive lock above. 
2cf70 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20 2a 2a  Or, it .      **
2cf80 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74 20 74   may mean that t
2cf90 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
2cfa0 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20  the error-state 
2cfb0 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20 20 20  when this.      
2cfc0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  ** function was 
2cfd0 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65 20 6a  called and the j
2cfe0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
2cff0 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20   not exist..    
2d000 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
2d010 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2d020 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  fd) ){.        s
2d030 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
2d040 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
2d050 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20 20 20 20  ->pVfs;.        
2d060 69 6e 74 20 62 45 78 69 73 74 73 3b 20 20 20 20  int bExists;    
2d070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2d080 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e if journal fil
2d090 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  e exists */.    
2d0a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2d0b0 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20  OsAccess(.      
2d0c0 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67        pVfs, pPag
2d0d0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  er->zJournal, SQ
2d0e0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
2d0f0 54 53 2c 20 26 62 45 78 69 73 74 73 29 3b 0a 20  TS, &bExists);. 
2d100 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2d110 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45 78 69  QLITE_OK && bExi
2d120 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sts ){.         
2d130 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20   int fout = 0;. 
2d140 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d           int f =
2d150 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
2d160 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
2d170 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b  EN_MAIN_JOURNAL;
2d180 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2d190 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
2d1a0 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  File );.        
2d1b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2d1c0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
2d1d0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
2d1e0 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f  ger->jfd, f, &fo
2d1f0 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ut);.          a
2d200 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
2d210 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
2d220 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
2d230 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
2d240 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f  =SQLITE_OK && fo
2d250 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
2d260 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  EADONLY ){.     
2d270 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2d280 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
2d290 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
2d2a0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
2d2b0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
2d2c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2d2d0 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20  .      }. .     
2d2e0 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64   /* Playback and
2d2f0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
2d300 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64  nal.  Drop the d
2d310 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20  atabase write.  
2d320 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20      ** lock and 
2d330 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65  reacquire the re
2d340 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74  ad lock. Purge t
2d350 68 65 20 63 61 63 68 65 20 62 65 66 6f 72 65 0a  he cache before.
2d360 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67        ** playing
2d370 20 62 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f   back the hot-jo
2d380 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 77 65  urnal so that we
2d390 20 64 6f 6e 27 74 20 65 6e 64 20 75 70 20 77 69   don't end up wi
2d3a0 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69  th.      ** an i
2d3b0 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68  nconsistent cach
2d3c0 65 2e 20 20 53 79 6e 63 20 74 68 65 20 68 6f 74  e.  Sync the hot
2d3d0 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
2d3e0 70 6c 61 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a  playing.      **
2d3f0 20 69 74 20 62 61 63 6b 20 73 69 6e 63 65 20 74   it back since t
2d400 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
2d410 63 72 61 73 68 65 64 20 61 6e 64 20 6c 65 66 74  crashed and left
2d420 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c   the hot journal
2d430 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62  .      ** probab
2d440 6c 79 20 64 69 64 20 6e 6f 74 20 73 79 6e 63 20  ly did not sync 
2d450 69 74 20 61 6e 64 20 77 65 20 61 72 65 20 72 65  it and we are re
2d460 71 75 69 72 65 64 20 74 6f 20 61 6c 77 61 79 73  quired to always
2d470 20 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74   sync.      ** t
2d480 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  he journal befor
2d490 65 20 70 6c 61 79 69 6e 67 20 69 74 20 62 61 63  e playing it bac
2d4a0 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
2d4b0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
2d4c0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
2d4d0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
2d4e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
2d4f0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2d500 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70  SyncHotJournal(p
2d510 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
2d520 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2d530 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
2d540 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
2d550 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  ck(pPager, 1);. 
2d560 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
2d570 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
2d580 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OPEN;.        }.
2d590 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2d5a0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
2d5b0 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  veMode ){.      
2d5c0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28    pagerUnlockDb(
2d5d0 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
2d5e0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  OCK);.      }.. 
2d5f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2d600 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d610 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
2d620 20 69 73 20 74 61 6b 65 6e 20 69 66 20 61 6e 20   is taken if an 
2d630 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
2d640 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65  le trying to ope
2d650 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20  n.        ** or 
2d660 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d  roll back a hot-
2d670 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f  journal while ho
2d680 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  lding an EXCLUSI
2d690 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20  VE lock. The.   
2d6a0 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e       ** pager_un
2d6b0 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 77  lock() routine w
2d6c0 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ill be called be
2d6d0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 74  fore returning t
2d6e0 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20  o unlock.       
2d6f0 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20 49 66   ** the file. If
2d700 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65   the unlock atte
2d710 6d 70 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  mpt fails, then 
2d720 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74  Pager.eLock must
2d730 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73   be.        ** s
2d740 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
2d750 43 4b 20 28 73 65 65 20 74 68 65 20 63 6f 6d 6d  CK (see the comm
2d760 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64  ent above the #d
2d770 65 66 69 6e 65 20 66 6f 72 20 0a 20 20 20 20 20  efine for .     
2d780 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f     ** UNKNOWN_LO
2d790 43 4b 20 61 62 6f 76 65 20 66 6f 72 20 61 6e 20  CK above for an 
2d7a0 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20  explanation). . 
2d7b0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2d7c0 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f    ** In order to
2d7d0 20 67 65 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63   get pager_unloc
2d7e0 6b 28 29 20 74 6f 20 64 6f 20 74 68 69 73 2c 20  k() to do this, 
2d7f0 73 65 74 20 50 61 67 65 72 2e 65 53 74 61 74 65  set Pager.eState
2d800 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 50   to.        ** P
2d810 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20  AGER_ERROR now. 
2d820 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75  This is not actu
2d830 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61 73 20  ally counted as 
2d840 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20  a transition.   
2d850 20 20 20 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52       ** to ERROR
2d860 20 73 74 61 74 65 20 69 6e 20 74 68 65 20 73 74   state in the st
2d870 61 74 65 20 64 69 61 67 72 61 6d 20 61 74 20 74  ate diagram at t
2d880 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66  he top of this f
2d890 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ile,.        ** 
2d8a0 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68  since we know th
2d8b0 61 74 20 74 68 65 20 73 61 6d 65 20 63 61 6c 6c  at the same call
2d8c0 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
2d8d0 28 29 20 77 69 6c 6c 20 76 65 72 79 0a 20 20 20  () will very.   
2d8e0 20 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20       ** shortly 
2d8f0 74 72 61 6e 73 69 74 69 6f 6e 20 74 68 65 20 70  transition the p
2d900 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74  ager object to t
2d910 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 43  he OPEN state. C
2d920 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  alling.        *
2d930 2a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  * assert_pager_s
2d940 74 61 74 65 28 29 20 77 6f 75 6c 64 20 66 61 69  tate() would fai
2d950 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20 73 68 6f  l now, as it sho
2d960 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  uld not be possi
2d970 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ble.        ** t
2d980 6f 20 62 65 20 69 6e 20 45 52 52 4f 52 20 73 74  o be in ERROR st
2d990 61 74 65 20 77 68 65 6e 20 74 68 65 72 65 20 61  ate when there a
2d9a0 72 65 20 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64  re zero outstand
2d9b0 69 6e 67 20 70 61 67 65 20 0a 20 20 20 20 20 20  ing page .      
2d9c0 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e    ** references.
2d9d0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2d9e0 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
2d9f0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
2da00 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
2da10 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2da20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2da30 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
2da40 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  PEN );.      ass
2da50 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c  ert( (pPager->eL
2da60 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
2da70 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  ).           || 
2da80 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
2da90 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
2daa0 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ->eLock>SHARED_L
2dab0 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  OCK).      );.  
2dac0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50    }..    if( !pP
2dad0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 0a  ager->tempFile .
2dae0 20 20 20 20 20 26 26 20 28 70 50 61 67 65 72 2d       && (pPager-
2daf0 3e 70 42 61 63 6b 75 70 20 7c 7c 20 73 71 6c 69  >pBackup || sqli
2db00 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
2db10 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
2db20 68 65 29 3e 30 29 20 0a 20 20 20 20 29 7b 0a 20  he)>0) .    ){. 
2db30 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
2db40 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74  ed-lock has just
2db50 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f   been acquired o
2db60 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2db70 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ile.      ** and
2db80 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61   there are alrea
2db90 64 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  dy pages in the 
2dba0 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72  cache (from a pr
2dbb0 65 76 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20  evious.      ** 
2dbc0 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
2dbd0 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65  ansaction).  Che
2dbe0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
2dbf0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
2dc00 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  ** has been modi
2dc10 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61  fied.  If the da
2dc20 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67  tabase has chang
2dc30 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20  ed, flush the.  
2dc40 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20      ** cache..  
2dc50 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2dc60 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  Database changes
2dc70 20 69 73 20 64 65 74 65 63 74 65 64 20 62 79 20   is detected by 
2dc80 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79  looking at 15 by
2dc90 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  tes beginning.  
2dca0 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74      ** at offset
2dcb0 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c   24 into the fil
2dcc0 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20  e.  The first 4 
2dcd0 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65  of these 16 byte
2dce0 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61  s are.      ** a
2dcf0 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20   32-bit counter 
2dd00 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e  that is incremen
2dd10 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68  ted with each ch
2dd20 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ange.  The.     
2dd30 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20   ** other bytes 
2dd40 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20  change randomly 
2dd50 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63  with each file c
2dd60 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20  hange when.     
2dd70 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69   ** a codec is i
2dd80 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20  n use..      ** 
2dd90 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
2dda0 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79  is a vanishingly
2ddb0 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68   small chance th
2ddc0 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c  at a change will
2ddd0 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a   not be .      *
2dde0 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65  * detected.  The
2ddf0 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e   chance of an un
2de00 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20  detected change 
2de10 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74  is so small that
2de20 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e  .      ** it can
2de30 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20   be neglected.. 
2de40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67       */.      Pg
2de50 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  no nPage = 0;.  
2de60 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56      char dbFileV
2de70 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65  ers[sizeof(pPage
2de80 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b  r->dbFileVers)];
2de90 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ..      rc = pag
2dea0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
2deb0 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
2dec0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2ded0 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20   failed;..      
2dee0 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20  if( nPage>0 ){. 
2def0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
2df00 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22  "CKVERS %p %d\n"
2df10 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66  , pPager, sizeof
2df20 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a  (dbFileVers)));.
2df30 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2df40 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
2df50 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65  r->fd, &dbFileVe
2df60 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
2df70 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20  eVers), 24);.   
2df80 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2df90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2dfa0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
2dfb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2dfc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2dfd0 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72  memset(dbFileVer
2dfe0 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46  s, 0, sizeof(dbF
2dff0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
2e000 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65   }..      if( me
2e010 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46  mcmp(pPager->dbF
2e020 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
2e030 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
2e040 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20  leVers))!=0 ){. 
2e050 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
2e060 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
2e070 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
2e080 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
2e090 57 41 4c 20 66 69 6c 65 20 69 6e 20 74 68 65 20  WAL file in the 
2e0a0 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65  file-system, ope
2e0b0 6e 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  n this database 
2e0c0 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f  in WAL.    ** mo
2e0d0 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  de. Otherwise, t
2e0e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
2e0f0 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20  ction call is a 
2e100 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  no-op..    */.  
2e110 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
2e120 57 61 6c 49 66 50 72 65 73 65 6e 74 28 70 50 61  WalIfPresent(pPa
2e130 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ger);.  }..  if(
2e140 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
2e150 67 65 72 29 20 26 26 20 72 63 3d 3d 53 51 4c 49  ger) && rc==SQLI
2e160 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
2e170 3d 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  = pagerBeginRead
2e180 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
2e190 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  er);.  }..  if( 
2e1a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
2e1b0 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72 63  PAGER_OPEN && rc
2e1c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2e1d0 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
2e1e0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
2e1f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
2e200 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20  .  }.. failed:. 
2e210 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2e220 4f 4b 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  OK ){.    pager_
2e230 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
2e240 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2e250 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
2e260 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c 73  R_OPEN );.  }els
2e270 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  e{.    pPager->e
2e280 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  State = PAGER_RE
2e290 41 44 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ADER;.  }.  retu
2e2a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2e2b0 49 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  If the reference
2e2c0 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68   count has reach
2e2d0 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63  ed zero, rollbac
2e2e0 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20  k any active.** 
2e2f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
2e300 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
2e310 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20  ..**.** Except, 
2e320 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
2e330 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74  EXCLUSIVE when t
2e340 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20  here is nothing 
2e350 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c  to in.** the rol
2e360 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74  lback journal, t
2e370 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74  he unlock is not
2e380 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74   performed and t
2e390 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69  here is.** nothi
2e3a0 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  ng to rollback, 
2e3b0 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  so this routine 
2e3c0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a  is a no-op..*/ .
2e3d0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
2e3e0 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
2e3f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2e400 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 50 63    if( (sqlite3Pc
2e410 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
2e420 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
2e430 29 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e  ) ){.    pagerUn
2e440 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
2e450 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  pPager);.  }.}..
2e460 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
2e470 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
2e480 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e  e number pgno in
2e490 20 70 61 67 65 72 20 70 50 61 67 65 72 20 28 61   pager pPager (a
2e4a0 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e   page.** referen
2e4b0 63 65 20 68 61 73 20 74 79 70 65 20 44 62 50 61  ce has type DbPa
2e4c0 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71  ge*). If the req
2e4d0 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65  uested reference
2e4e0 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66   is .** successf
2e4f0 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69  ully obtained, i
2e500 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a  t is copied to *
2e510 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54  ppPage and SQLIT
2e520 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
2e530 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75  *.** If the requ
2e540 65 73 74 65 64 20 70 61 67 65 20 69 73 20 61 6c  ested page is al
2e550 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63  ready in the cac
2e560 68 65 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e  he, it is return
2e570 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ed. .** Otherwis
2e580 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62  e, a new page ob
2e590 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65  ject is allocate
2e5a0 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20  d and populated 
2e5b0 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61  with data.** rea
2e5c0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
2e5d0 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d  ase file. In som
2e5e0 65 20 63 61 73 65 73 2c 20 74 68 65 20 70 63 61  e cases, the pca
2e5f0 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a  che module may.*
2e600 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20  * choose not to 
2e610 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  allocate a new p
2e620 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d  age object and m
2e630 61 79 20 72 65 75 73 65 20 61 6e 20 65 78 69 73  ay reuse an exis
2e640 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77  ting.** object w
2e650 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  ith no outstandi
2e660 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a  ng references..*
2e670 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64  *.** The extra d
2e680 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ata appended to 
2e690 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73  a page is always
2e6a0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
2e6b0 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69  zeros the .** fi
2e6c0 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20  rst time a page 
2e6d0 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d  is loaded into m
2e6e0 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61  emory. If the pa
2e6f0 67 65 20 72 65 71 75 65 73 74 65 64 20 69 73 20  ge requested is 
2e700 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
2e710 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 74 68  he cache when th
2e720 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2e730 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  alled, then the 
2e740 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73  extra.** data is
2e750 20 6c 65 66 74 20 61 73 20 69 74 20 77 61 73 20   left as it was 
2e760 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62  when the page ob
2e770 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20 75 73  ject was last us
2e780 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
2e790 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
2e7a0 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
2e7b0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
2e7c0 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e  ge or if a .** n
2e7d0 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73  on-zero value is
2e7e0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6e   passed as the n
2e7f0 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74  oContent paramet
2e800 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72  er and the .** r
2e810 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
2e820 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f   not already sto
2e830 72 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  red in the cache
2e840 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63  , then no .** ac
2e850 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f  tual disk read o
2e860 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63  ccurs. In this c
2e870 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69  ase the memory i
2e880 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  mage of the .** 
2e890 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69  page is initiali
2e8a0 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73  zed to all zeros
2e8b0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f  . .**.** If noCo
2e8c0 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69  ntent is true, i
2e8d0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
2e8e0 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
2e8f0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  t the contents.*
2e900 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54  * of the page. T
2e910 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77  his occurs in tw
2e920 6f 20 73 65 70 65 72 61 74 65 20 73 63 65 6e 61  o seperate scena
2e930 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29  rios:.**.**   a)
2e940 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20   When reading a 
2e950 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
2e960 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
2e970 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  abase, and.**.**
2e980 20 20 20 62 29 20 57 68 65 6e 20 61 20 73 61 76     b) When a sav
2e990 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20  epoint is being 
2e9a0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20  rolled back and 
2e9b0 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a  we need to load.
2e9c0 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70 61  **      a new pa
2e9d0 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ge into the cach
2e9e0 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77  e to be filled w
2e9f0 69 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61  ith the data rea
2ea00 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74  d.**      from t
2ea10 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75  he savepoint jou
2ea20 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  rnal..**.** If n
2ea30 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65  oContent is true
2ea40 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20  , then the data 
2ea50 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f  returned is zero
2ea60 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ed instead of.**
2ea70 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d   being read from
2ea80 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41   the database. A
2ea90 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65  dditionally, the
2eaa0 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64   bits correspond
2eab0 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69  ing.** to pgno i
2eac0 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  n Pager.pInJourn
2ead0 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70 61  al (bitvec of pa
2eae0 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69 74  ges already writ
2eaf0 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f  ten to the.** jo
2eb00 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20  urnal file) and 
2eb10 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
2eb20 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
2eb30 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f  bitvecs of any o
2eb40 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  pen.** savepoint
2eb50 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20  s are set. This 
2eb60 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61 67  means if the pag
2eb70 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62  e is made writab
2eb80 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69  le at any.** poi
2eb90 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
2eba0 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74  , using a call t
2ebb0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
2ebc0 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65  ite(), its conte
2ebd0 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  nts.** will not 
2ebe0 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68  be journaled. Th
2ebf0 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a  is saves IO..**.
2ec00 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69  ** The acquisiti
2ec10 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f  on might fail fo
2ec20 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e  r several reason
2ec30 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73  s.  In all cases
2ec40 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69  ,.** an appropri
2ec50 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
2ec60 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
2ec70 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
2ec80 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   NULL..**.** See
2ec90 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
2eca0 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74  erLookup().  Bot
2ecb0 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  h this routine a
2ecc0 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65  nd Lookup() atte
2ecd0 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61  mpt.** to find a
2ece0 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d   page in the in-
2ecf0 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72  memory cache fir
2ed00 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  st.  If the page
2ed10 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
2ed20 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68  ** in memory, th
2ed30 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  is routine goes 
2ed40 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20  to disk to read 
2ed50 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f  it in whereas Lo
2ed60 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72  okup().** just r
2ed70 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20  eturns 0.  This 
2ed80 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73  routine acquires
2ed90 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65   a read-lock the
2eda0 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a   first time it.*
2edb0 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64  * has to go to d
2edc0 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61  isk, and could a
2edd0 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20  lso playback an 
2ede0 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  old journal if n
2edf0 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e  ecessary..** Sin
2ee00 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65  ce Lookup() neve
2ee10 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20  r goes to disk, 
2ee20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20  it never has to 
2ee30 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a  deal with locks.
2ee40 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  ** or journal fi
2ee50 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
2ee60 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
2ee70 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2ee80 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
2ee90 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ger open on the 
2eea0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2eeb0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
2eec0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
2eed0 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a  umber to fetch *
2eee0 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50  /.  DbPage **ppP
2eef0 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
2ef00 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
2ef10 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  e page here */. 
2ef20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20   int noContent  
2ef30 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62       /* Do not b
2ef40 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f  other reading co
2ef50 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20  ntent from disk 
2ef60 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
2ef70 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
2ef80 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pPg;..  assert(
2ef90 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
2efa0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
2efb0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
2efc0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
2efd0 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
2efe0 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pgno==0 ){.    r
2eff0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2f000 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
2f010 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
2f020 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  r is in the erro
2f030 72 20 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20  r state, return 
2f040 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64 69 61  an error immedia
2f050 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65  tely. .  ** Othe
2f060 72 77 69 73 65 2c 20 72 65 71 75 65 73 74 20 74  rwise, request t
2f070 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
2f080 20 50 43 61 63 68 65 20 6c 61 79 65 72 2e 20 2a   PCache layer. *
2f090 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
2f0a0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
2f0b0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  OK && pPager->er
2f0c0 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
2f0d0 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  LL ){.    rc = p
2f0e0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
2f0f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
2f100 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  = sqlite3PcacheF
2f110 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
2f120 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 70  ache, pgno, 1, p
2f130 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69  pPage);.  }..  i
2f140 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f150 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65   ){.    /* Eithe
2f160 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  r the call to sq
2f170 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
2f180 28 29 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65  () returned an e
2f190 72 72 6f 72 20 6f 72 20 74 68 65 0a 20 20 20 20  rror or the.    
2f1a0 2a 2a 20 70 61 67 65 72 20 77 61 73 20 61 6c 72  ** pager was alr
2f1b0 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f  eady in the erro
2f1c0 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r-state when thi
2f1d0 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  s function was c
2f1e0 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65  alled..    ** Se
2f1f0 74 20 70 50 67 20 74 6f 20 30 20 61 6e 64 20 6a  t pPg to 0 and j
2f200 75 6d 70 20 74 6f 20 74 68 65 20 65 78 63 65 70  ump to the excep
2f210 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a  tion handler.  *
2f220 2f 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20  /.    pPg = 0;. 
2f230 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
2f240 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20  quire_err;.  }. 
2f250 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
2f260 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29  e)->pgno==pgno )
2f270 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  ;.  assert( (*pp
2f280 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70  Page)->pPager==p
2f290 50 61 67 65 72 20 7c 7c 20 28 2a 70 70 50 61 67  Pager || (*ppPag
2f2a0 65 29 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b  e)->pPager==0 );
2f2b0 0a 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67 65  ..  if( (*ppPage
2f2c0 29 2d 3e 70 50 61 67 65 72 20 26 26 20 21 6e 6f  )->pPager && !no
2f2d0 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f  Content ){.    /
2f2e0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
2f2f0 68 65 20 70 63 61 63 68 65 20 61 6c 72 65 61 64  he pcache alread
2f300 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e  y contains an in
2f310 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f  itialized copy o
2f320 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67  f.    ** the pag
2f330 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  e. Return withou
2f340 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20  t further ado.  
2f350 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
2f360 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50  gno<=PAGER_MAX_P
2f370 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47  GNO && pgno!=PAG
2f380 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
2f390 72 29 20 29 3b 0a 20 20 20 20 50 41 47 45 52 5f  r) );.    PAGER_
2f3a0 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69  INCR(pPager->nHi
2f3b0 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
2f3c0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c  QLITE_OK;..  }el
2f3d0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  se{.    /* The p
2f3e0 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63  ager cache has c
2f3f0 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67  reated a new pag
2f400 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e  e. Its content n
2f410 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20  eeds to .    ** 
2f420 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  be initialized. 
2f430 20 2a 2f 0a 0a 20 20 20 20 50 41 47 45 52 5f 49   */..    PAGER_I
2f440 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73  NCR(pPager->nMis
2f450 73 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 2a 70  s);.    pPg = *p
2f460 70 50 61 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e  pPage;.    pPg->
2f470 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
2f480 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78  ..    /* The max
2f490 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72  imum page number
2f4a0 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e   is 2^31. Return
2f4b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
2f4c0 69 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a 2a  if a page.    **
2f4d0 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
2f4e0 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74 68  than this, or th
2f4f0 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67  e unused locking
2f500 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75 65 73  -page, is reques
2f510 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ted. */.    if( 
2f520 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50  pgno>PAGER_MAX_P
2f530 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  GNO || pgno==PAG
2f540 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
2f550 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
2f560 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2f570 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
2f580 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
2f590 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rr;.    }..    i
2f5a0 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67  f( MEMDB || pPag
2f5b0 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29  er->dbSize<(int)
2f5c0 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e  pgno || noConten
2f5d0 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61  t || !isOpen(pPa
2f5e0 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
2f5f0 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
2f600 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20  r->mxPgno ){.   
2f610 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2f620 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67  _FULL;.        g
2f630 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
2f640 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
2f650 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65       if( noConte
2f660 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  nt ){.        /*
2f670 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20   Failure to set 
2f680 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20  the bits in the 
2f690 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65  InJournal bit-ve
2f6a0 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e  ctors is benign.
2f6b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d  .        ** It m
2f6c0 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74  erely means that
2f6d0 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d   we might do som
2f6e0 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20  e extra work to 
2f6f0 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20  journal a .     
2f700 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20     ** page that 
2f710 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
2f720 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20   be journaled.  
2f730 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65  Nevertheless, be
2f740 20 73 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a   sure .        *
2f750 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 63 61  * to test the ca
2f760 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f  se where a mallo
2f770 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  c error occurs w
2f780 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73  hile trying to s
2f790 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  et .        ** a
2f7a0 20 62 69 74 20 69 6e 20 61 20 62 69 74 20 76 65   bit in a bit ve
2f7b0 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ctor..        */
2f7c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f7d0 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
2f7e0 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  c();.        if(
2f7f0 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64   pgno<=pPager->d
2f800 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20  bOrigSize ){.   
2f810 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28         TESTONLY(
2f820 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42   rc = ) sqlite3B
2f830 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
2f840 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e  >pInJournal, pgn
2f850 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  o);.          te
2f860 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
2f870 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
2f880 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45      }.        TE
2f890 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61  STONLY( rc = ) a
2f8a0 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
2f8b0 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e  vecs(pPager, pgn
2f8c0 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  o);.        test
2f8d0 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
2f8e0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
2f8f0 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
2f900 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
2f910 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
2f920 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20  (pPg->pData, 0, 
2f930 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
2f940 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
2f950 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22  (("ZERO %p %d\n"
2f960 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
2f970 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2f980 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
2f990 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29  pPager==pPager )
2f9a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ;.      rc = rea
2f9b0 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20  dDbPage(pPg);.  
2f9c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2f9d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2f9e0 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
2f9f0 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  ire_err;.      }
2fa00 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
2fa10 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
2fa20 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
2fa30 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
2fa40 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
2fa50 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
2fa60 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72  QLITE_OK;..pager
2fa70 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20  _acquire_err:.  
2fa80 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
2fa90 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70  TE_OK );.  if( p
2faa0 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Pg ){.    sqlite
2fab0 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
2fac0 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c  ;.  }.  pagerUnl
2fad0 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67  ockIfUnused(pPag
2fae0 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20  er);..  *ppPage 
2faf0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
2fb00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
2fb10 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20  re a page if it 
2fb20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
2fb30 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
2fb40 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65  e.  Do.** not re
2fb50 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ad the page from
2fb60 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61   disk.  Return a
2fb70 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2fb80 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66  page,.** or 0 if
2fb90 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
2fba0 20 69 6e 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c   in cache. Also,
2fbb0 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   return 0 if the
2fbc0 20 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e   .** pager is in
2fbd0 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74   PAGER_UNLOCK st
2fbe0 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
2fbf0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2fc00 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 70  ,.** or if the p
2fc10 61 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72  ager is in an er
2fc20 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20  ror state other 
2fc30 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  than SQLITE_FULL
2fc40 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
2fc50 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
2fc60 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65  ().  The differe
2fc70 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
2fc80 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20   routine.** and 
2fc90 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
2fca0 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29  ) is that _get()
2fcb0 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20   will go to the 
2fcc0 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a  disk and read.**
2fcd0 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20   in the page if 
2fce0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
2fcf0 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
2fd00 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
2fd10 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20  ** returns NULL 
2fd20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
2fd30 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69  ot in cache or i
2fd40 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72  f a disk I/O err
2fd50 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20  or .** has ever 
2fd60 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50  happened..*/.DbP
2fd70 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65  age *sqlite3Page
2fd80 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  rLookup(Pager *p
2fd90 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
2fda0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
2fdb0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
2fdc0 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
2fdd0 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
2fde0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2fdf0 72 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b  r->pPCache!=0 );
2fe00 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2fe10 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
2fe20 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 73 71 6c  _READER );.  sql
2fe30 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
2fe40 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
2fe50 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b   pgno, 0, &pPg);
2fe60 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d  .  return pPg;.}
2fe70 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
2fe80 61 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  a page reference
2fe90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
2fea0 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
2feb0 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
2fec0 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68  drop to zero, th
2fed0 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69  en the.** page i
2fee0 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c  s added to the L
2fef0 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61  RU list.  When a
2ff00 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ll references to
2ff10 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72   all pages.** ar
2ff20 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f  e released, a ro
2ff30 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e  llback occurs an
2ff40 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
2ff50 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a  e database is.**
2ff60 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69   removed..*/.voi
2ff70 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  d sqlite3PagerUn
2ff80 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  ref(DbPage *pPg)
2ff90 7b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  {.  if( pPg ){. 
2ffa0 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
2ffb0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
2ffc0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
2ffd0 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20  eRelease(pPg);. 
2ffe0 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66     pagerUnlockIf
2fff0 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a  Unused(pPager);.
30000 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
30010 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
30020 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74 61 72  lled at the star
30030 74 20 6f 66 20 65 76 65 72 79 20 77 72 69 74 65  t of every write
30040 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
30050 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65   There must alre
30060 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45  ady be a RESERVE
30070 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
30080 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
30090 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65  ase .** file whe
300a0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
300b0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
300c0 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
300d0 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
300e0 70 50 61 67 65 72 20 61 6e 64 20 77 72 69 74 65  pPager and write
300f0 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
30100 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72  r.** to the star
30110 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72  t of it. If ther
30120 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
30130 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68  epoints, open th
30140 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
30150 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66   as well. This f
30160 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
30170 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f  used when the jo
30180 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65  urnal file is be
30190 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74  ing .** opened t
301a0 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61  o write a rollba
301b0 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61  ck log for a tra
301c0 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  nsaction. It is 
301d0 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65  not used .** whe
301e0 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20  n opening a hot 
301f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
30200 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  roll it back..**
30210 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
30220 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61  al file is alrea
30230 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d  dy open (as it m
30240 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69  ay be in exclusi
30250 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65  ve mode),.** the
30260 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
30270 6a 75 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f  just writes a jo
30280 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
30290 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
302a0 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  .** already open
302b0 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68   file. .**.** Wh
302c0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
302d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
302e0 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20   opened by this 
302f0 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a  function, the.**
30300 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
30310 6c 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75  l bitvec structu
30320 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e  re is allocated.
30330 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
30340 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
30350 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
30360 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ful. Otherwise, 
30370 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
30380 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61  E_NOMEM if the a
30390 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61  ttempt to alloca
303a0 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  te Pager.pInJour
303b0 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a  nal fails, or .*
303c0 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  * an IO error co
303d0 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72  de if opening or
303e0 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75   writing the jou
303f0 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e  rnal file fails.
30400 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
30410 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
30420 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
30430 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
30440 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
30450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30460 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
30470 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
30480 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
30490 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a  ager->pVfs;   /*
304a0 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
304b0 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a  vfs pointer */..
304c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
304d0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
304e0 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
304f0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
30500 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
30510 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
30520 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
30530 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20  urnal==0 );.  . 
30540 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69   /* If already i
30550 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
30560 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
30570 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75   is a no-op.  Bu
30580 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74  t on.  ** the ot
30590 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72  her hand, this r
305a0 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
305b0 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65  called if we are
305c0 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a   already in.  **
305d0 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e   an error state.
305e0 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
305f0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
30600 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
30610 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66  ->errCode;..  if
30620 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
30630 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72  Pager) && pPager
30640 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
30650 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
30660 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70 50 61 67  _OFF ){.    pPag
30670 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
30680 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
30690 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53  eate(pPager->dbS
306a0 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ize);.    if( pP
306b0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
306c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
306d0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
306e0 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
306f0 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
30700 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  al file if it is
30710 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
30720 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69  n. */.    if( !i
30730 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
30740 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  d) ){.      if( 
30750 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
30760 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
30770 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
30780 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30790 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70  MemJournalOpen(p
307a0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
307b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
307c0 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
307d0 73 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20  s =             
307e0 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61        /* VFS fla
307f0 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e  gs to open journ
30800 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20  al file */.     
30810 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
30820 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
30830 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20  E_OPEN_CREATE|. 
30840 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
30850 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20  ->tempFile ? .  
30860 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54            (SQLIT
30870 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
30880 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  LOSE|SQLITE_OPEN
30890 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a  _TEMP_JOURNAL):.
308a0 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c              (SQL
308b0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
308c0 55 52 4e 41 4c 29 0a 20 20 20 20 20 20 20 20 20  URNAL).         
308d0 20 29 3b 0a 20 20 23 69 66 64 65 66 20 53 51 4c   );.  #ifdef SQL
308e0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
308f0 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 20  C_WRITE.        
30900 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72  rc = sqlite3Jour
30910 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20  nalOpen(.       
30920 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65       pVfs, pPage
30930 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
30940 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
30950 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
30960 70 50 61 67 65 72 29 0a 20 20 20 20 20 20 20 20  pPager).        
30970 29 3b 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 20  );.  #else.     
30980 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
30990 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
309a0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
309b0 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73  ager->jfd, flags
309c0 2c 20 30 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20  , 0);.  #endif. 
309d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
309e0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
309f0 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
30a00 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20  ger->jfd) );.   
30a10 20 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20   }.  .  .    /* 
30a20 57 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20  Write the first 
30a30 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
30a40 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
30a50 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20  le and open .   
30a60 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
30a70 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
30a80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
30a90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
30aa0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a  {.      /* TODO:
30ab0 20 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66   Check if all of
30ac0 20 74 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c   these are reall
30ad0 79 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  y required. */. 
30ae0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
30af0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  c = 0;.      pPa
30b00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
30b10 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
30b20 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
30b30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
30b40 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
30b50 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
30b60 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
30b70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
30b80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30b90 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
30ba0 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
30bb0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
30bc0 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  l);.    pPager->
30bd0 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
30be0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
30bf0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
30c00 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
30c10 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20  R_LOCKED );.    
30c20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
30c30 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41   PAGER_WRITER_CA
30c40 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72  CHEMOD;.  }..  r
30c50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
30c60 2a 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74 65  ** Begin a write
30c70 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20  -transaction on 
30c80 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
30c90 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61  ger object. If a
30ca0 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73   .** write-trans
30cb0 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
30cc0 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  dy been opened, 
30cd0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
30ce0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
30cf0 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 61 72  If the exFlag ar
30d00 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c  gument is false,
30d10 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74   then acquire at
30d20 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45   least a RESERVE
30d30 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  D.** lock on the
30d40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
30d50 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75  If exFlag is tru
30d60 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  e, then acquire 
30d70 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45  at least.** an E
30d80 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
30d90 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
30da0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e   already held, n
30db0 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75  o locking .** fu
30dc0 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20  nctions need be 
30dd0 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
30de0 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   the subjInMemor
30df0 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  y argument is no
30e00 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79  n-zero, then any
30e10 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65   sub-journal ope
30e20 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  ned.** within th
30e30 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  is transaction w
30e40 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73  ill be opened as
30e50 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
30e60 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20  le. This.** has 
30e70 6e 6f 20 65 66 66 65 63 74 20 69 66 20 74 68 65  no effect if the
30e80 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
30e90 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28  already opened (
30ea0 61 73 20 69 74 20 6d 61 79 20 62 65 20 77 68 65  as it may be whe
30eb0 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20  n.** running in 
30ec0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20  exclusive mode) 
30ed0 6f 72 20 69 66 20 74 68 65 20 74 72 61 6e 73 61  or if the transa
30ee0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72  ction does not r
30ef0 65 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d  equire a.** sub-
30f00 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20  journal. If the 
30f10 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67  subjInMemory arg
30f20 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74  ument is zero, t
30f30 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64  hen any required
30f40 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  .** sub-journal 
30f50 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69  is implemented i
30f60 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67  n-memory if pPag
30f70 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  er is an in-memo
30f80 72 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a  ry database, .**
30f90 20 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70   or using a temp
30fa0 6f 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72  orary file other
30fb0 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  wise..*/.int sql
30fc0 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 50  ite3PagerBegin(P
30fd0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
30fe0 74 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75  t exFlag, int su
30ff0 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69  bjInMemory){.  i
31000 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
31010 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
31020 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
31030 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 70  ER_READER );.  p
31040 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d  Pager->subjInMem
31050 6f 72 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e  ory = (u8)subjIn
31060 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20 70  Memory;..  if( p
31070 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
31080 41 47 45 52 5f 52 45 41 44 45 52 20 29 7b 0a 20  AGER_READER ){. 
31090 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
310a0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
310b0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67   );..    if( pag
310c0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
310d0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
310e0 74 68 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e  the pager is con
310f0 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c  figured to use l
31100 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
31110 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20  usive, and an.  
31120 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65      ** exclusive
31130 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
31140 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72  abase is not alr
31150 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69  eady held, obtai
31160 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20  n it now..      
31170 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  */.      if( pPa
31180 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
31190 64 65 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c  de && sqlite3Wal
311a0 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
311b0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20  ager->pWal, -1) 
311c0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
311d0 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
311e0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
311f0 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CK);.        if(
31200 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31210 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
31220 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
31230 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
31240 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
31250 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31  (pPager->pWal, 1
31260 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
31270 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72    /* Grab the wr
31280 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
31290 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63  log file. If suc
312a0 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65  cessful, upgrade
312b0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47   to.      ** PAG
312c0 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74  ER_RESERVED stat
312d0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  e. Otherwise, re
312e0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
312f0 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
31300 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62  ..      ** The b
31310 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e  usy-handler is n
31320 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e  ot invoked if an
31330 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
31340 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a   already.      *
31350 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74  * holds the writ
31360 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69  e-lock. If possi
31370 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c  ble, the upper l
31380 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69  ayer will call i
31390 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
313a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
313b0 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73  lBeginWriteTrans
313c0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
313d0 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Wal);.    }else{
313e0 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e  .      /* Obtain
313f0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
31400 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
31410 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78   file. If the ex
31420 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20  Flag parameter. 
31430 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c       ** is true,
31440 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c   then immediatel
31450 79 20 75 70 67 72 61 64 65 20 74 68 69 73 20 74  y upgrade this t
31460 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  o an EXCLUSIVE l
31470 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 2a  ock. The.      *
31480 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  * busy-handler c
31490 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75  allback can be u
314a0 73 65 64 20 77 68 65 6e 20 75 70 67 72 61 64 69  sed when upgradi
314b0 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53  ng to the EXCLUS
314c0 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63  IVE.      ** loc
314d0 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20  k, but not when 
314e0 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45  obtaining the RE
314f0 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20  SERVED lock..   
31500 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
31510 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
31520 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  ger, RESERVED_LO
31530 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
31540 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
31550 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  exFlag ){.      
31560 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
31570 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
31580 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
31590 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
315a0 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
315b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
315c0 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57 52   /* Change to WR
315d0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
315e0 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
315f0 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65    ** WAL mode se
31600 74 73 20 50 61 67 65 72 2e 65 53 74 61 74 65 20  ts Pager.eState 
31610 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  to PAGER_WRITER_
31620 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45 4d  LOCKED or CACHEM
31630 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  OD.      ** when
31640 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 20   it has an open 
31650 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74  transaction, but
31660 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44 20   never to DBMOD 
31670 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20 20  or FINISHED..   
31680 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65     ** This is be
31690 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20 73  cause in those s
316a0 74 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74  tates the code t
316b0 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65  o roll back save
316c0 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20  point .      ** 
316d0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79  transactions may
316e0 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   copy data from 
316f0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
31700 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
31710 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  e .      ** file
31720 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f   as well as into
31730 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
31740 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20   Which would be 
31750 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20 20  incorrect in .  
31760 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e      ** WAL mode.
31770 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
31780 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
31790 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
317a0 43 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61 67  CKED;.      pPag
317b0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
317c0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
317d0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
317e0 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Size;.      pPag
317f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
31800 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61   0;.    }..    a
31810 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
31820 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
31830 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
31840 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73 73 65  ADER );.    asse
31850 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
31860 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  K || pPager->eSt
31870 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
31880 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20  R_LOCKED );.    
31890 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
318a0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
318b0 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  r) );.  }..  PAG
318c0 45 52 54 52 41 43 45 28 28 22 54 52 41 4e 53 41  ERTRACE(("TRANSA
318d0 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
318e0 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
318f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
31900 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e  /*.** Mark a sin
31910 67 6c 65 20 64 61 74 61 20 70 61 67 65 20 61 73  gle data page as
31920 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20   writeable. The 
31930 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
31940 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69  into the .** mai
31950 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62  n journal or sub
31960 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75  -journal as requ
31970 69 72 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  ired. If the pag
31980 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
31990 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20  o.** one of the 
319a0 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f  journals, the co
319b0 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
319c0 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a  is set in the .*
319d0 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  * Pager.pInJourn
319e0 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20 74 68  al bitvec and th
319f0 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
31a00 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69  .pInSavepoint bi
31a10 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20  tvecs.** of any 
31a20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
31a30 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  as appropriate..
31a40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
31a50 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20  ger_write(PgHdr 
31a60 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70  *pPg){.  void *p
31a70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
31a80 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  a;.  Pager *pPag
31a90 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
31aa0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
31ab0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68  ITE_OK;..  /* Th
31ac0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f  is routine is no
31ad0 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20  t called unless 
31ae0 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
31af0 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
31b00 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74 61 72 74  .  ** been start
31b10 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  ed. The journal 
31b20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20  file may or may 
31b30 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61 74 20 74  not be open at t
31b40 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20  his point..  ** 
31b50 49 74 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  It is never call
31b60 65 64 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20  ed in the ERROR 
31b70 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  state..  */.  as
31b80 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
31b90 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
31ba0 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20  ER_LOCKED.      
31bb0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
31bc0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
31bd0 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
31be0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
31bf0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
31c00 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73  _DBMOD.  );.  as
31c10 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
31c20 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
31c30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20   );..  /* If an 
31c40 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70  error has been p
31c50 72 65 76 69 6f 75 73 6c 79 20 64 65 74 65 63 74  reviously detect
31c60 65 64 2c 20 72 65 70 6f 72 74 20 74 68 65 20 73  ed, report the s
31c70 61 6d 65 20 65 72 72 6f 72 0a 20 20 2a 2a 20 61  ame error.  ** a
31c80 67 61 69 6e 2e 20 54 68 69 73 20 73 68 6f 75 6c  gain. This shoul
31c90 64 20 6e 6f 74 20 68 61 70 70 65 6e 2c 20 62 75  d not happen, bu
31ca0 74 20 74 68 65 20 63 68 65 63 6b 20 70 72 6f 76  t the check prov
31cb0 69 64 65 73 20 72 6f 62 75 73 74 6e 65 73 73 2e  ides robustness.
31cc0 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
31cd0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
31ce0 20 29 20 20 72 65 74 75 72 6e 20 70 50 61 67 65   )  return pPage
31cf0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f  r->errCode;..  /
31d00 2a 20 48 69 67 68 65 72 2d 6c 65 76 65 6c 20 72  * Higher-level r
31d10 6f 75 74 69 6e 65 73 20 6e 65 76 65 72 20 63 61  outines never ca
31d20 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
31d30 20 69 66 20 64 61 74 61 62 61 73 65 20 69 73 20   if database is 
31d40 6e 6f 74 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c  not.  ** writabl
31d50 65 2e 20 20 42 75 74 20 63 68 65 63 6b 20 61 6e  e.  But check an
31d60 79 77 61 79 2c 20 6a 75 73 74 20 66 6f 72 20 72  yway, just for r
31d70 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20  obustness. */.  
31d80 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
31d90 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 20 72 65  ->readOnly) ) re
31da0 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
31db0 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28  ;..  CHECK_PAGE(
31dc0 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b  pPg);..  /* Mark
31dd0 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
31de0 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ty.  If the page
31df0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
31e00 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  n written.  ** t
31e10 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  o the journal th
31e20 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e  en we can return
31e30 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a   right away..  *
31e40 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  /.  sqlite3Pcach
31e50 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b  eMakeDirty(pPg);
31e60 0a 20 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75  .  if( pageInJou
31e70 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21 73 75  rnal(pPg) && !su
31e80 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
31e90 50 67 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Pg) ){.    asser
31ea0 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
31eb0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 61  pPager) );.    a
31ec0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
31ed0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
31ee0 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a  TER_CACHEMOD );.
31ef0 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a    }else{..    /*
31f00 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20   If we get this 
31f10 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  far, it means th
31f20 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64  at the page need
31f30 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77  s to be.    ** w
31f40 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72  ritten to the tr
31f50 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
31f60 6c 20 6f 72 20 74 68 65 20 63 68 65 63 6b 70 6f  l or the checkpo
31f70 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  int journal.    
31f80 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20  ** or both..    
31f90 2a 2a 0a 20 20 20 20 2a 2a 20 48 69 67 68 65 72  **.    ** Higher
31fa0 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20   level routines 
31fb0 68 61 76 65 20 61 6c 72 65 61 64 79 20 6f 62 74  have already obt
31fc0 61 69 6e 65 64 20 74 68 65 20 6e 65 63 65 73 73  ained the necess
31fd0 61 72 79 20 6c 6f 63 6b 73 0a 20 20 20 20 2a 2a  ary locks.    **
31fe0 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20 77 72   to begin the wr
31ff0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
32000 20 62 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63   but the rollbac
32010 6b 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  k journal might 
32020 6e 6f 74 20 0a 20 20 20 20 2a 2a 20 79 65 74 20  not .    ** yet 
32030 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e 20 69 74  be open. Open it
32040 20 6e 6f 77 20 69 66 20 74 68 69 73 20 69 73 20   now if this is 
32050 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  the case..    */
32060 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
32070 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
32080 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a  RITER_LOCKED ){.
32090 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
320a0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
320b0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
320c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
320d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
320e0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
320f0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
32100 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
32110 4d 4f 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  MOD );.    asser
32120 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
32130 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
32140 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74  .  .    /* The t
32150 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
32160 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e  al now exists an
32170 64 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45  d we have a RESE
32180 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a  RVED or an.    *
32190 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
321a0 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   on the main dat
321b0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69  abase file.  Wri
321c0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
321d0 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68  age to.    ** th
321e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
321f0 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e  urnal if it is n
32200 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
32210 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
32220 20 21 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28   !pageInJournal(
32230 70 50 67 29 20 26 26 20 21 70 61 67 65 72 55 73  pPg) && !pagerUs
32240 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
32250 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 61        assert( pa
32260 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
32270 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )==0 );.      if
32280 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  ( pPg->pgno<=pPa
32290 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
322a0 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
322b0 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
322c0 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20    u32 cksum;.   
322d0 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
322e0 32 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  2;.        i64 i
322f0 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
32300 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 20 20 20  urnalOff;..     
32310 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20     /* We should 
32320 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74  never write to t
32330 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
32340 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20  the page that.  
32350 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
32360 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  s the database l
32370 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ocks.  The follo
32380 77 69 6e 67 20 61 73 73 65 72 74 20 76 65 72 69  wing assert veri
32390 66 69 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  fies.        ** 
323a0 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20  that we do not. 
323b0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
323c0 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41  t( pPg->pgno!=PA
323d0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
323e0 65 72 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  er) );..        
323f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
32400 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d 70 50 61 67  journalHdr<=pPag
32410 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
32420 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 32  ;.        CODEC2
32430 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
32440 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65  pPg->pgno, 7, re
32450 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
32460 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20  M, pData2);.    
32470 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65      cksum = page
32480 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
32490 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 0a 20  (u8*)pData2);.. 
324a0 20 20 20 20 20 20 20 2f 2a 20 45 76 65 6e 20 69         /* Even i
324b0 66 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66  f an IO or diskf
324c0 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ull error occurs
324d0 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69   while journalli
324e0 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ng the.        *
324f0 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c  * page in the bl
32500 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74  ock above, set t
32510 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61  he need-sync fla
32520 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  g for the page..
32530 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72          ** Other
32540 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74  wise, when the t
32550 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
32560 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c  lled back, the l
32570 6f 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20  ogic in.        
32580 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  ** playback_one_
32590 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e  page() will thin
325a0 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  k that the page 
325b0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74  needs to be rest
325c0 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ored.        ** 
325d0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
325e0 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20  file. And if an 
325f0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
32600 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a  while doing so,.
32610 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
32620 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66  corruption may f
32630 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a  ollow..        *
32640 2f 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66  /.        pPg->f
32650 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
32660 45 44 5f 53 59 4e 43 3b 0a 0a 20 20 20 20 20 20  ED_SYNC;..      
32670 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
32680 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
32690 69 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  iOff, pPg->pgno)
326a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
326b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
326c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
326d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
326e0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
326f0 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
32700 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f 66 66  ->pageSize, iOff
32710 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  +4);.        if(
32720 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
32730 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
32740 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
32750 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
32760 2c 20 69 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70  , iOff+pPager->p
32770 61 67 65 53 69 7a 65 2b 34 2c 20 63 6b 73 75 6d  ageSize+4, cksum
32780 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
32790 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
327a0 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20  eturn rc;..     
327b0 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55     IOTRACE(("JOU
327c0 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c  T %p %d %lld %d\
327d0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
327e0 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20  >pgno, .        
327f0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
32800 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61  >journalOff, pPa
32810 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b  ger->pageSize));
32820 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 5f 49  .        PAGER_I
32830 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
32840 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b  r_writej_count);
32850 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
32860 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE(("JOURNAL %d
32870 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
32880 63 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  c=%d hash(%08x)\
32890 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
328a0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
328b0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20  , pPg->pgno, .  
328c0 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67             ((pPg
328d0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
328e0 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70  ED_SYNC)?1:0), p
328f0 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
32900 67 29 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 70  g)));..        p
32910 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
32920 66 20 2b 3d 20 38 20 2b 20 70 50 61 67 65 72 2d  f += 8 + pPager-
32930 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20  >pageSize;.     
32940 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b     pPager->nRec+
32950 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
32960 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
32970 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
32980 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
32990 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72  BitvecSet(pPager
329a0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
329b0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
329c0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
329d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
329e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
329f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
32a00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
32a10 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  M );.        rc 
32a20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e  |= addToSavepoin
32a30 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c  tBitvecs(pPager,
32a40 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
32a50 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
32a60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32a70 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
32a80 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
32a90 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
32aa0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
32ab0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
32ac0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
32ad0 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52  eState!=PAGER_WR
32ae0 49 54 45 52 5f 44 42 4d 4f 44 20 29 7b 0a 20 20  ITER_DBMOD ){.  
32af0 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61          pPg->fla
32b00 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
32b10 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 7d  _SYNC;.        }
32b20 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
32b30 41 43 45 28 28 22 41 50 50 45 4e 44 20 25 64 20  ACE(("APPEND %d 
32b40 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
32b50 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
32b60 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
32b70 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
32b80 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
32b90 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26     ((pPg->flags&
32ba0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
32bb0 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 20 20 7d  ?1:0)));.      }
32bc0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
32bd0 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
32be0 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  t journal is ope
32bf0 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  n and the page i
32c00 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20  s not in it,.   
32c10 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74   ** then write t
32c20 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
32c30 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  to the statement
32c40 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20   journal.  Note 
32c50 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
32c60 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
32c70 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73  l format differs
32c80 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61   from the standa
32c90 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  rd journal forma
32ca0 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74  t.    ** in that
32cb0 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68   it omits the ch
32cc0 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20  ecksums and the 
32cd0 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  header..    */. 
32ce0 20 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69     if( subjRequi
32cf0 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a  resPage(pPg) ){.
32d00 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f        rc = subjo
32d10 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a  urnalPage(pPg);.
32d20 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
32d30 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  Update the datab
32d40 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74  ase size and ret
32d50 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  urn..  */.  if( 
32d60 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70  pPager->dbSize<p
32d70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  Pg->pgno ){.    
32d80 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
32d90 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a   pPg->pgno;.  }.
32da0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
32db0 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74  /*.** Mark a dat
32dc0 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61  a page as writea
32dd0 62 6c 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ble. This routin
32de0 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  e must be called
32df0 20 62 65 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69   before .** maki
32e00 6e 67 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20  ng changes to a 
32e10 70 61 67 65 2e 20 54 68 65 20 63 61 6c 6c 65 72  page. The caller
32e20 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20   must check the 
32e30 72 65 74 75 72 6e 20 76 61 6c 75 65 20 0a 2a 2a  return value .**
32e40 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
32e50 6e 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c  n and be careful
32e60 20 6e 6f 74 20 74 6f 20 63 68 61 6e 67 65 20 61   not to change a
32e70 6e 79 20 70 61 67 65 20 64 61 74 61 20 75 6e 6c  ny page data unl
32e80 65 73 73 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ess .** this rou
32e90 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
32ea0 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68  ITE_OK..**.** Th
32eb0 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
32ec0 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  ween this functi
32ed0 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69  on and pager_wri
32ee0 74 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69  te() is that thi
32ef0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c  s.** function al
32f00 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74 68  so deals with th
32f10 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77  e special case w
32f20 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70  here 2 or more p
32f30 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61  ages.** fit on a
32f40 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
32f50 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73  tor. In this cas
32f60 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e  e all co-residen
32f70 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20  t pages.** must 
32f80 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
32f90 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
32fa0 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74   file before ret
32fb0 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
32fc0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
32fd0 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f  , SQLITE_NOMEM o
32fe0 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  r an IO error co
32ff0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  de is returned.*
33000 2a 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  * as appropriate
33010 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
33020 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
33030 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
33040 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
33050 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
33060 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64  LITE_OK;..  PgHd
33070 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65  r *pPg = pDbPage
33080 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
33090 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
330a0 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72  .  Pgno nPagePer
330b0 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72  Sector = (pPager
330c0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61  ->sectorSize/pPa
330d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
330e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
330f0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
33100 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
33110 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
33120 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
33130 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73  R_ERROR );.  ass
33140 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
33150 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
33160 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67 65 50  );..  if( nPageP
33170 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20  erSector>1 ){.  
33180 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e    Pgno nPageCoun
33190 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
331a0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
331b0 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
331c0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e   file */.    Pgn
331d0 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20  o pg1;          
331e0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
331f0 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74  page of the sect
33200 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65  or pPg is locate
33210 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  d on. */.    int
33220 20 6e 50 61 67 65 20 3d 20 30 3b 20 20 20 20 20   nPage = 0;     
33230 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
33240 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69   of pages starti
33250 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75  ng at pg1 to jou
33260 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rnal */.    int 
33270 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
33280 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
33290 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  unter */.    int
332a0 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 20   needSync = 0;  
332b0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
332c0 66 20 61 6e 79 20 70 61 67 65 20 68 61 73 20 50  f any page has P
332d0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a  GHDR_NEED_SYNC *
332e0 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  /..    /* Set th
332f0 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  e doNotSyncSpill
33300 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73   flag to 1. This
33310 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20 63   is because we c
33320 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a 20 20 20 20  annot allow.    
33330 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61  ** a journal hea
33340 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74 65  der to be writte
33350 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61  n between the pa
33360 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79  ges journaled by
33370 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  .    ** this fun
33380 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ction..    */.  
33390 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
333a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
333b0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
333c0 63 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  cSpill==0 );.   
333d0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
333e0 6e 63 53 70 69 6c 6c 2b 2b 3b 0a 0a 20 20 20 20  ncSpill++;..    
333f0 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61 73  /* This trick as
33400 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20  sumes that both 
33410 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e  the page-size an
33420 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72  d sector-size ar
33430 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65  e.    ** an inte
33440 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20  ger power of 2. 
33450 49 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65  It sets variable
33460 20 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e   pg1 to the iden
33470 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66  tifier.    ** of
33480 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
33490 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
334a0 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
334b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20  .    */.    pg1 
334c0 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29  = ((pPg->pgno-1)
334d0 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63   & ~(nPagePerSec
334e0 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20  tor-1)) + 1;..  
334f0 20 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 70    nPageCount = p
33500 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
33510 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
33520 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20  >nPageCount ){. 
33530 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50       nPage = (pP
33540 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31  g->pgno - pg1)+1
33550 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
33560 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63  (pg1+nPagePerSec
33570 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e  tor-1)>nPageCoun
33580 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  t ){.      nPage
33590 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d   = nPageCount+1-
335a0 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  pg1;.    }else{.
335b0 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50        nPage = nP
335c0 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20  agePerSector;.  
335d0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e    }.    assert(n
335e0 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73  Page>0);.    ass
335f0 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67  ert(pg1<=pPg->pg
33600 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  no);.    assert(
33610 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d  (pg1+nPage)>pPg-
33620 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72  >pgno);..    for
33630 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20  (ii=0; ii<nPage 
33640 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
33650 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50  ; ii++){.      P
33660 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b  gno pg = pg1+ii;
33670 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
33680 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  age;.      if( p
33690 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20  g==pPg->pgno || 
336a0 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65  !sqlite3BitvecTe
336b0 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  st(pPager->pInJo
336c0 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20  urnal, pg) ){.  
336d0 20 20 20 20 20 20 69 66 28 20 70 67 21 3d 50 41        if( pg!=PA
336e0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
336f0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  er) ){.         
33700 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
33710 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67  erGet(pPager, pg
33720 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20  , &pPage);.     
33730 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
33740 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
33750 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
33760 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20  _write(pPage);. 
33770 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
33780 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44  Page->flags&PGHD
33790 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20  R_NEED_SYNC ){. 
337a0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 65               nee
337b0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
337c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
337d0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
337e0 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
337f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
33800 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
33810 20 69 66 28 20 28 70 50 61 67 65 20 3d 20 70 61   if( (pPage = pa
33820 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
33830 72 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a 20 20  r, pg))!=0 ){.  
33840 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
33850 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
33860 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20  D_SYNC ){.      
33870 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
33880 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33890 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
338a0 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
338b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
338c0 20 2f 2a 20 49 66 20 74 68 65 20 50 47 48 44 52   /* If the PGHDR
338d0 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
338e0 69 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f  is set for any o
338f0 66 20 74 68 65 20 6e 50 61 67 65 20 70 61 67 65  f the nPage page
33900 73 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69  s .    ** starti
33910 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20  ng at pg1, then 
33920 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  it needs to be s
33930 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68  et for all of th
33940 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20  em. Because.    
33950 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  ** writing to an
33960 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65  y of these nPage
33970 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67   pages may damag
33980 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68  e the others, th
33990 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  e.    ** journal
339a0 20 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61   file must conta
339b0 69 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69  in sync()ed copi
339c0 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65  es of all of the
339d0 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  m.    ** before 
339e0 61 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20  any of them can 
339f0 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  be written out t
33a00 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
33a10 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
33a20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
33a30 4b 20 26 26 20 6e 65 65 64 53 79 6e 63 20 29 7b  K && needSync ){
33a40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
33a50 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20 20 66  MEMDB );.      f
33a60 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
33a70 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  e; ii++){.      
33a80 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d    PgHdr *pPage =
33a90 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
33aa0 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20  ager, pg1+ii);. 
33ab0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
33ac0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
33ad0 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  age->flags |= PG
33ae0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
33af0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
33b00 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
33b10 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
33b20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
33b30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
33b40 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d  doNotSyncSpill==
33b50 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 );.    pPager-
33b60 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2d  >doNotSyncSpill-
33b70 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  -;.  }else{.    
33b80 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
33b90 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20  (pDbPage);.  }. 
33ba0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
33bb0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
33bc0 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76   if the page giv
33bd0 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
33be0 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  nt was previousl
33bf0 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73  y passed.** to s
33c00 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
33c10 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ().  In other wo
33c20 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
33c30 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20   if it is ok.** 
33c40 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f  to change the co
33c50 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
33c60 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  e..*/.#ifndef ND
33c70 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33  EBUG.int sqlite3
33c80 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
33c90 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
33ca0 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61   return pPg->fla
33cb0 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 3b 0a  gs&PGHDR_DIRTY;.
33cc0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
33cd0 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
33ce0 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
33cf0 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69   pager that it i
33d00 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
33d10 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20  to.** write the 
33d20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70  information on p
33d30 61 67 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20  age pPg back to 
33d40 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74  the disk, even t
33d50 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61  hough.** that pa
33d60 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b  ge might be mark
33d70 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 54 68  ed as dirty.  Th
33d80 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20  is happens, for 
33d90 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a  example, when.**
33da0 20 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65   the page has be
33db0 65 6e 20 61 64 64 65 64 20 61 73 20 61 20 6c 65  en added as a le
33dc0 61 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  af of the freeli
33dd0 73 74 20 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a  st and so its.**
33de0 20 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67   content no long
33df0 65 72 20 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a  er matters..**.*
33e00 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20  * The overlying 
33e10 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63  software layer c
33e20 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
33e30 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68  e when all of th
33e40 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65  e data.** on the
33e50 20 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75   given page is u
33e60 6e 75 73 65 64 2e 20 54 68 65 20 70 61 67 65 72  nused. The pager
33e70 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20   marks the page 
33e80 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74  as clean so.** t
33e90 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
33ea0 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64  get written to d
33eb0 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73  isk..**.** Tests
33ec0 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20   show that this 
33ed0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
33ee0 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73   quadruple the s
33ef0 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 0a 2a  peed of large .*
33f00 2a 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69  * DELETE operati
33f10 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ons..*/.void sql
33f20 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
33f30 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  te(PgHdr *pPg){.
33f40 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
33f50 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
33f60 20 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73   if( (pPg->flags
33f70 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 26 26  &PGHDR_DIRTY) &&
33f80 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
33f90 69 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 50 41  int==0 ){.    PA
33fa0 47 45 52 54 52 41 43 45 28 28 22 44 4f 4e 54 5f  GERTRACE(("DONT_
33fb0 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66  WRITE page %d of
33fc0 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e   %d\n", pPg->pgn
33fd0 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
33fe0 72 29 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43  r)));.    IOTRAC
33ff0 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c  E(("CLEAN %p %d\
34000 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
34010 3e 70 67 6e 6f 29 29 0a 20 20 20 20 70 50 67 2d  >pgno)).    pPg-
34020 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
34030 44 4f 4e 54 5f 57 52 49 54 45 3b 0a 23 69 66 64  DONT_WRITE;.#ifd
34040 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
34050 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70  PAGES.    pPg->p
34060 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
34070 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
34080 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  endif.  }.}../*.
34090 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
340a0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63  is called to inc
340b0 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65  rement the value
340c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
340d0 20 66 69 6c 65 20 0a 2a 2a 20 63 68 61 6e 67 65   file .** change
340e0 2d 63 6f 75 6e 74 65 72 2c 20 73 74 6f 72 65 64  -counter, stored
340f0 20 61 73 20 61 20 34 2d 62 79 74 65 20 62 69 67   as a 4-byte big
34100 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
34110 73 74 61 72 74 69 6e 67 20 61 74 20 0a 2a 2a 20  starting at .** 
34120 62 79 74 65 20 6f 66 66 73 65 74 20 32 34 20 6f  byte offset 24 o
34130 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  f the pager file
34140 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
34150 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67  sDirectMode flag
34160 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   is zero, then t
34170 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79 20 63  his is done by c
34180 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74  alling .** sqlit
34190 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
341a0 6e 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 6d  n page 1, then m
341b0 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e  odifying the con
341c0 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20  tents of the.** 
341d0 70 61 67 65 20 64 61 74 61 2e 20 49 6e 20 74 68  page data. In th
341e0 69 73 20 63 61 73 65 20 74 68 65 20 66 69 6c 65  is case the file
341f0 20 77 69 6c 6c 20 62 65 20 75 70 64 61 74 65 64   will be updated
34200 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   when the curren
34210 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
34220 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a   is committed..*
34230 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69 72 65 63  *.** The isDirec
34240 74 4d 6f 64 65 20 66 6c 61 67 20 6d 61 79 20 6f  tMode flag may o
34250 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20  nly be non-zero 
34260 69 66 20 74 68 65 20 6c 69 62 72 61 72 79 20 77  if the library w
34270 61 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77  as compiled.** w
34280 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 45  ith the SQLITE_E
34290 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
342a0 54 45 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64  TE macro defined
342b0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
342c0 2a 2a 20 69 66 20 69 73 44 69 72 65 63 74 20 69  ** if isDirect i
342d0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
342e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
342f0 6c 65 20 69 73 20 75 70 64 61 74 65 64 20 64 69  le is updated di
34300 72 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77 72 69  rectly.** by wri
34310 74 69 6e 67 20 61 6e 20 75 70 64 61 74 65 64 20  ting an updated 
34320 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20  version of page 
34330 31 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74  1 using a call t
34340 6f 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65  o the .** sqlite
34350 33 4f 73 57 72 69 74 65 28 29 20 66 75 6e 63 74  3OsWrite() funct
34360 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
34370 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  nt pager_incr_ch
34380 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65  angecounter(Page
34390 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69  r *pPager, int i
343a0 73 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a 20 20  sDirectMode){.  
343b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
343c0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
343d0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
343e0 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
343f0 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  EMOD.       || p
34400 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
34410 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
34420 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  D.  );.  assert(
34430 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
34440 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  ate(pPager) );..
34450 20 20 2f 2a 20 44 65 63 6c 61 72 65 20 61 6e 64    /* Declare and
34460 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 6e 73   initialize cons
34470 74 61 6e 74 20 69 6e 74 65 67 65 72 20 27 69 73  tant integer 'is
34480 44 69 72 65 63 74 27 2e 20 49 66 20 74 68 65 0a  Direct'. If the.
34490 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74    ** atomic-writ
344a0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
344b0 73 20 65 6e 61 62 6c 65 64 20 69 6e 20 74 68 69  s enabled in thi
344c0 73 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 69 73  s build, then is
344d0 44 69 72 65 63 74 0a 20 20 2a 2a 20 69 73 20 69  Direct.  ** is i
344e0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68  nitialized to th
344f0 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  e value passed a
34500 73 20 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f  s the isDirectMo
34510 64 65 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a  de parameter.  *
34520 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  * to this functi
34530 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  on. Otherwise, i
34540 74 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20  t is always set 
34550 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20  to zero..  **.  
34560 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74  ** The idea is t
34570 68 61 74 20 69 66 20 74 68 65 20 61 74 6f 6d 69  hat if the atomi
34580 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
34590 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  tion is not.  **
345a0 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
345b0 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 20 63 6f  ile time, the co
345c0 6d 70 69 6c 65 72 20 63 61 6e 20 6f 6d 69 74 20  mpiler can omit 
345d0 74 68 65 20 74 65 73 74 73 20 6f 66 0a 20 20 2a  the tests of.  *
345e0 2a 20 27 69 73 44 69 72 65 63 74 27 20 62 65 6c  * 'isDirect' bel
345f0 6f 77 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 74  ow, as well as t
34600 68 65 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65  he block enclose
34610 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 69  d in the.  ** "i
34620 66 28 20 69 73 44 69 72 65 63 74 20 29 22 20 63  f( isDirect )" c
34630 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  ondition..  */.#
34640 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
34650 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
34660 45 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45 43  E.# define DIREC
34670 54 5f 4d 4f 44 45 20 30 0a 20 20 61 73 73 65 72  T_MODE 0.  asser
34680 74 28 20 69 73 44 69 72 65 63 74 4d 6f 64 65 3d  t( isDirectMode=
34690 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =0 );.  UNUSED_P
346a0 41 52 41 4d 45 54 45 52 28 69 73 44 69 72 65 63  ARAMETER(isDirec
346b0 74 4d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 23 20  tMode);.#else.# 
346c0 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f  define DIRECT_MO
346d0 44 45 20 69 73 44 69 72 65 63 74 4d 6f 64 65 0a  DE isDirectMode.
346e0 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 21 70  #endif..  if( !p
346f0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
34700 6e 74 44 6f 6e 65 20 26 26 20 70 50 61 67 65 72  ntDone && pPager
34710 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20  ->dbSize>0 ){.  
34720 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
34730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34740 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20  /* Reference to 
34750 70 61 67 65 20 31 20 2a 2f 0a 20 20 20 20 75 33  page 1 */.    u3
34760 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  2 change_counter
34770 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
34780 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20  nitial value of 
34790 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66  change-counter f
347a0 69 65 6c 64 20 2a 2f 0a 0a 20 20 20 20 61 73 73  ield */..    ass
347b0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
347c0 6d 70 46 69 6c 65 20 26 26 20 69 73 4f 70 65 6e  mpFile && isOpen
347d0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
347e0 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67  .    /* Open pag
347f0 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20  e 1 of the file 
34800 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a  for writing. */.
34810 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
34820 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
34830 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20   1, &pPgHdr);.  
34840 20 20 61 73 73 65 72 74 28 20 70 50 67 48 64 72    assert( pPgHdr
34850 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
34860 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  E_OK );..    /* 
34870 49 66 20 70 61 67 65 20 6f 6e 65 20 77 61 73 20  If page one was 
34880 66 65 74 63 68 65 64 20 73 75 63 63 65 73 73 66  fetched successf
34890 75 6c 6c 79 2c 20 61 6e 64 20 74 68 69 73 20 66  ully, and this f
348a0 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20  unction is not. 
348b0 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20     ** operating 
348c0 69 6e 20 64 69 72 65 63 74 2d 6d 6f 64 65 2c 20  in direct-mode, 
348d0 6d 61 6b 65 20 70 61 67 65 20 31 20 77 72 69 74  make page 1 writ
348e0 61 62 6c 65 2e 20 20 57 68 65 6e 20 6e 6f 74 20  able.  When not 
348f0 69 6e 20 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  in .    ** direc
34900 74 20 6d 6f 64 65 2c 20 70 61 67 65 20 31 20 69  t mode, page 1 i
34910 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 69 6e  s always held in
34920 20 63 61 63 68 65 20 61 6e 64 20 68 65 6e 63 65   cache and hence
34930 20 74 68 65 20 50 61 67 65 72 47 65 74 28 29 0a   the PagerGet().
34940 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 69 73 20      ** above is 
34950 61 6c 77 61 79 73 20 73 75 63 63 65 73 73 66 75  always successfu
34960 6c 20 2d 20 68 65 6e 63 65 20 74 68 65 20 41 4c  l - hence the AL
34970 57 41 59 53 20 6f 6e 20 72 63 3d 3d 53 51 4c 49  WAYS on rc==SQLI
34980 54 45 5f 4f 4b 2e 0a 20 20 20 20 2a 2f 0a 20 20  TE_OK..    */.  
34990 20 20 69 66 28 20 21 44 49 52 45 43 54 5f 4d 4f    if( !DIRECT_MO
349a0 44 45 20 26 26 20 41 4c 57 41 59 53 28 72 63 3d  DE && ALWAYS(rc=
349b0 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20  =SQLITE_OK) ){. 
349c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
349d0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48  3PagerWrite(pPgH
349e0 64 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  dr);.    }..    
349f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
34a00 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  K ){.      /* In
34a10 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
34a20 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20  e just read and 
34a30 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f  write it back to
34a40 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20   byte 24. */.   
34a50 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65     change_counte
34a60 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  r = sqlite3Get4b
34a70 79 74 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d  yte((u8*)pPager-
34a80 3e 64 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20  >dbFileVers);.  
34a90 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74      change_count
34aa0 65 72 2b 2b 3b 0a 20 20 20 20 20 20 70 75 74 33  er++;.      put3
34ab0 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
34ac0 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c  gHdr->pData)+24,
34ad0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29   change_counter)
34ae0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f  ;..      /* Also
34af0 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74   store the SQLit
34b00 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
34b10 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39   in bytes 96..99
34b20 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 2a 2a   and in.      **
34b30 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20 73 74   bytes 92..95 st
34b40 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ore the change c
34b50 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68  ounter for which
34b60 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d   the version num
34b70 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ber.      ** is 
34b80 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 20 20 20 20  valid. */.      
34b90 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
34ba0 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29  *)pPgHdr->pData)
34bb0 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e  +92, change_coun
34bc0 74 65 72 29 3b 0a 20 20 20 20 20 20 70 75 74 33  ter);.      put3
34bd0 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
34be0 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 39 36 2c  gHdr->pData)+96,
34bf0 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f   SQLITE_VERSION_
34c00 4e 55 4d 42 45 52 29 3b 0a 0a 20 20 20 20 20 20  NUMBER);..      
34c10 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e  /* If running in
34c20 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 77 72   direct mode, wr
34c30 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ite the contents
34c40 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20 74 68   of page 1 to th
34c50 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  e file. */.     
34c60 20 69 66 28 20 44 49 52 45 43 54 5f 4d 4f 44 45   if( DIRECT_MODE
34c70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
34c80 74 20 76 6f 69 64 20 2a 7a 42 75 66 3b 0a 20 20  t void *zBuf;.  
34c90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
34ca0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
34cb0 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 43 4f  >0 );.        CO
34cc0 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 50 67  DEC2(pPager, pPg
34cd0 48 64 72 2d 3e 70 44 61 74 61 2c 20 31 2c 20 36  Hdr->pData, 1, 6
34ce0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
34cf0 4d 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  M, zBuf);.      
34d00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
34d10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
34d20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
34d30 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
34d40 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70   zBuf, pPager->p
34d50 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20  ageSize, 0);.   
34d60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
34d70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
34d80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
34d90 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
34da0 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  tDone = 1;.     
34db0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
34dc0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
34dd0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
34de0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 1;.      }. 
34df0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c     }..    /* Rel
34e00 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65  ease the page re
34e10 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20  ference. */.    
34e20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
34e30 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20  f(pPgHdr);.  }. 
34e40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
34e50 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 70 61  *.** Sync the pa
34e60 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69 73 6b  ger file to disk
34e70 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
34e80 70 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  p for in-memory 
34e90 66 69 6c 65 73 0a 2a 2a 20 6f 72 20 70 61 67 65  files.** or page
34ea0 73 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72  s with the Pager
34eb0 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 73 65 74  .noSync flag set
34ec0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
34ed0 73 73 66 75 6c 2c 20 6f 72 20 63 61 6c 6c 65 64  ssful, or called
34ee0 20 6f 6e 20 61 20 70 61 67 65 72 20 66 6f 72 20   on a pager for 
34ef0 77 68 69 63 68 20 69 74 20 69 73 20 61 20 6e 6f  which it is a no
34f00 2d 6f 70 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e  -op, this.** fun
34f10 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
34f20 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69  LITE_OK. Otherwi
34f30 73 65 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  se, an IO error 
34f40 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
34f50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
34f60 50 61 67 65 72 53 79 6e 63 28 50 61 67 65 72 20  PagerSync(Pager 
34f70 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
34f80 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
34f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34fa0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
34fb0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  */.  assert( !ME
34fc0 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61  MDB );.  if( pPa
34fd0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
34fe0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
34ff0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
35000 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
35010 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  nc(pPager->fd, p
35020 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
35030 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  s);.  }.  return
35040 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
35050 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
35060 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77  only be called w
35070 68 69 6c 65 20 61 20 77 72 69 74 65 2d 74 72 61  hile a write-tra
35080 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
35090 76 65 20 69 6e 0a 2a 2a 20 72 6f 6c 6c 62 61 63  ve in.** rollbac
350a0 6b 2e 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63  k. If the connec
350b0 74 69 6f 6e 20 69 73 20 69 6e 20 57 41 4c 20 6d  tion is in WAL m
350c0 6f 64 65 2c 20 74 68 69 73 20 63 61 6c 6c 20 69  ode, this call i
350d0 73 20 61 20 6e 6f 2d 6f 70 2e 20 0a 2a 2a 20 4f  s a no-op. .** O
350e0 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
350f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 6f 65 73   connection does
35100 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 61 76   not already hav
35110 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
35120 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64  ock on .** the d
35130 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e  atabase file, an
35140 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
35150 20 74 6f 20 6f 62 74 61 69 6e 20 6f 6e 65 2e 0a   to obtain one..
35160 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 43  **.** If the EXC
35170 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 61  LUSIVE lock is a
35180 6c 72 65 61 64 79 20 68 65 6c 64 20 6f 72 20 74  lready held or t
35190 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62  he attempt to ob
351a0 74 61 69 6e 20 69 74 20 69 73 0a 2a 2a 20 73 75  tain it is.** su
351b0 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 74 68 65  ccessful, or the
351c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69   connection is i
351d0 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 53 51 4c 49  n WAL mode, SQLI
351e0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
351f0 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  d..** Otherwise,
35200 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 42   either SQLITE_B
35210 55 53 59 20 6f 72 20 61 6e 20 53 51 4c 49 54 45  USY or an SQLITE
35220 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72  _IOERR_XXX error
35230 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74   code is .** ret
35240 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
35250 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73  lite3PagerExclus
35260 69 76 65 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70  iveLock(Pager *p
35270 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
35280 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
35290 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
352a0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
352b0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 0a 20  ITER_CACHEMOD . 
352c0 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
352d0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
352e0 52 49 54 45 52 5f 44 42 4d 4f 44 20 0a 20 20 20  RITER_DBMOD .   
352f0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
35300 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
35310 54 45 52 5f 4c 4f 43 4b 45 44 20 0a 20 20 29 3b  TER_LOCKED .  );
35320 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
35330 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
35340 61 67 65 72 29 20 29 3b 0a 20 20 69 66 28 20 30  ager) );.  if( 0
35350 3d 3d 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ==pagerUseWal(pP
35360 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63 20  ager) ){.    rc 
35370 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
35380 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
35390 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
353a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
353b0 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
353c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
353d0 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61  or the pager pPa
353e0 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  ger. zMaster poi
353f0 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a  nts to the name.
35400 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ** of a master j
35410 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
35420 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
35430 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69  en into the indi
35440 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61  vidual.** journa
35450 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20  l file. zMaster 
35460 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69  may be NULL, whi
35470 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  ch is interprete
35480 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  d as no master.*
35490 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e  * journal (a sin
354a0 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
354b0 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
354c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
354d0 73 75 72 65 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a  sures that:.**.*
354e0 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61 62 61  *   * The databa
354f0 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63  se file change-c
35500 6f 75 6e 74 65 72 20 69 73 20 75 70 64 61 74 65  ounter is update
35510 64 2c 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6a 6f  d,.**   * the jo
35520 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
35530 28 75 6e 6c 65 73 73 20 74 68 65 20 61 74 6f 6d  (unless the atom
35540 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
35550 61 74 69 6f 6e 20 69 73 20 75 73 65 64 29 2c 0a  ation is used),.
35560 2a 2a 20 20 20 2a 20 61 6c 6c 20 64 69 72 74 79  **   * all dirty
35570 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74   pages are writt
35580 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
35590 73 65 20 66 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a  se file, .**   *
355a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
355b0 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
355c0 28 69 66 20 72 65 71 75 69 72 65 64 29 2c 20 61  (if required), a
355d0 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61  nd.**   * the da
355e0 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63  tabase file sync
355f0 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  ed. .**.** The o
35600 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 20 72  nly thing that r
35610 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74  emains to commit
35620 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
35630 20 69 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20   is to finalize 
35640 0a 2a 2a 20 28 64 65 6c 65 74 65 2c 20 74 72 75  .** (delete, tru
35650 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68  ncate or zero th
35660 65 20 66 69 72 73 74 20 70 61 72 74 20 6f 66 29  e first part of)
35670 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
35680 65 20 28 6f 72 20 0a 2a 2a 20 64 65 6c 65 74 65  e (or .** delete
35690 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
356a0 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63  nal file if spec
356b0 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  ified)..**.** No
356c0 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74  te that if zMast
356d0 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64  er==NULL, this d
356e0 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74  oes not overwrit
356f0 65 20 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c  e a previous val
35700 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20  ue.** passed to 
35710 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  an sqlite3PagerC
35720 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
35730 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  call..**.** If t
35740 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74  he final paramet
35750 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73  er - noSync - is
35760 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
35770 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74  database file it
35780 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73  self.** is not s
35790 79 6e 63 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  ynced. The calle
357a0 72 20 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c 69  r must call sqli
357b0 74 65 33 50 61 67 65 72 53 79 6e 63 28 29 20 64  te3PagerSync() d
357c0 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79  irectly to.** sy
357d0 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
357e0 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c  file before call
357f0 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73 65 54  ing CommitPhaseT
35800 77 6f 28 29 20 74 6f 20 64 65 6c 65 74 65 20 74  wo() to delete t
35810 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
35820 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  le in this case.
35830 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
35840 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
35850 6e 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ne(.  Pager *pPa
35860 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
35870 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
35880 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  bject */.  const
35890 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20   char *zMaster, 
358a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
358b0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 6d   not NULL, the m
358c0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
358d0 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53 79  me */.  int noSy
358e0 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nc              
358f0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
35900 74 6f 20 6f 6d 69 74 20 74 68 65 20 78 53 79 6e  to omit the xSyn
35910 63 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65  c on the db file
35920 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
35930 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
35940 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
35950 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73  rn code */..  as
35960 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
35970 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
35980 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20  ER_LOCKED.      
35990 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
359a0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
359b0 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
359c0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
359d0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
359e0 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  _DBMOD.       ||
359f0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
35a00 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20 29  =PAGER_ERROR.  )
35a10 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
35a20 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
35a30 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20  Pager) );..  /* 
35a40 49 66 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72  If a prior error
35a50 20 6f 63 63 75 72 72 65 64 2c 20 72 65 70 6f 72   occurred, repor
35a60 74 20 74 68 61 74 20 65 72 72 6f 72 20 61 67 61  t that error aga
35a70 69 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  in. */.  if( pPa
35a80 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72  ger->errCode ) r
35a90 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
35aa0 72 43 6f 64 65 3b 0a 0a 20 20 50 41 47 45 52 54  rCode;..  PAGERT
35ab0 52 41 43 45 28 28 22 44 41 54 41 42 41 53 45 20  RACE(("DATABASE 
35ac0 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d  SYNC: File=%s zM
35ad0 61 73 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25  aster=%s nSize=%
35ae0 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61  d\n", .      pPa
35af0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
35b00 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
35b10 3e 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20 2f 2a  >dbSize));..  /*
35b20 20 49 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20   If no database 
35b30 63 68 61 6e 67 65 73 20 68 61 76 65 20 62 65 65  changes have bee
35b40 6e 20 6d 61 64 65 2c 20 72 65 74 75 72 6e 20 65  n made, return e
35b50 61 72 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70  arly. */.  if( p
35b60 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41  Pager->eState<PA
35b70 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
35b80 4d 4f 44 20 29 20 72 65 74 75 72 6e 20 53 51 4c  MOD ) return SQL
35b90 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 4d  ITE_OK;..  if( M
35ba0 45 4d 44 42 20 29 7b 0a 20 20 20 20 2f 2a 20 49  EMDB ){.    /* I
35bb0 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d  f this is an in-
35bc0 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f  memory db, or no
35bd0 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
35be0 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20   written to, or 
35bf0 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 75 6e 63  this.    ** func
35c00 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
35c10 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74   been called, it
35c20 20 69 73 20 6d 6f 73 74 6c 79 20 61 20 6e 6f 2d   is mostly a no-
35c30 6f 70 2e 20 20 48 6f 77 65 76 65 72 2c 20 61 6e  op.  However, an
35c40 79 0a 20 20 20 20 2a 2a 20 62 61 63 6b 75 70 20  y.    ** backup 
35c50 69 6e 20 70 72 6f 67 72 65 73 73 20 6e 65 65 64  in progress need
35c60 73 20 74 6f 20 62 65 20 72 65 73 74 61 72 74 65  s to be restarte
35c70 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  d..    */.    sq
35c80 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
35c90 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  rt(pPager->pBack
35ca0 75 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  up);.  }else{.  
35cb0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
35cc0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
35cd0 20 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 20     PgHdr *pList 
35ce0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
35cf0 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
35d00 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 20  >pPCache);.     
35d10 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
35d20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
35d30 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72  WalFrames(pPager
35d40 2c 20 70 4c 69 73 74 2c 20 70 50 61 67 65 72 2d  , pList, pPager-
35d50 3e 64 62 53 69 7a 65 2c 20 31 2c 20 0a 20 20 20  >dbSize, 1, .   
35d60 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
35d70 2d 3e 66 75 6c 6c 53 79 6e 63 20 3f 20 70 50 61  ->fullSync ? pPa
35d80 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20  ger->sync_flags 
35d90 3a 20 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  : 0).        );.
35da0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
35db0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
35dc0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
35dd0 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
35de0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
35df0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
35e00 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54  else{.      /* T
35e10 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
35e20 63 6b 20 75 70 64 61 74 65 73 20 74 68 65 20 63  ck updates the c
35e30 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 45  hange-counter. E
35e40 78 61 63 74 6c 79 20 68 6f 77 20 69 74 0a 20 20  xactly how it.  
35e50 20 20 20 20 2a 2a 20 64 6f 65 73 20 74 68 69 73      ** does this
35e60 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
35e70 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61  her or not the a
35e80 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74  tomic-update opt
35e90 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 20  imization.      
35ea0 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61  ** was enabled a
35eb0 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
35ec0 61 6e 64 20 69 66 20 74 68 69 73 20 74 72 61 6e  and if this tran
35ed0 73 61 63 74 69 6f 6e 20 6d 65 65 74 73 20 74 68  saction meets th
35ee0 65 20 0a 20 20 20 20 20 20 2a 2a 20 72 75 6e 74  e .      ** runt
35ef0 69 6d 65 20 63 72 69 74 65 72 69 61 20 74 6f 20  ime criteria to 
35f00 75 73 65 20 74 68 65 20 6f 70 65 72 61 74 69 6f  use the operatio
35f10 6e 3a 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  n: .      **.   
35f20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 65 20 66     **    * The f
35f30 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f  ile-system suppo
35f40 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  rts the atomic-w
35f50 72 69 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f  rite property fo
35f60 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  r.      **      
35f70 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20 70  blocks of size p
35f80 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 20 0a 20  age-size, and . 
35f90 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 69       **    * Thi
35fa0 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20  s commit is not 
35fb0 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d  part of a multi-
35fc0 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  file transaction
35fd0 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 20  , and.      **  
35fe0 20 20 2a 20 45 78 61 63 74 6c 79 20 6f 6e 65 20    * Exactly one 
35ff0 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  page has been mo
36000 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f 72 65  dified and store
36010 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
36020 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  file..      **. 
36030 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f       ** If the o
36040 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61 73 20  ptimization was 
36050 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61 74 20 63  not enabled at c
36060 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65  ompile time, the
36070 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70  n the.      ** p
36080 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
36090 63 6f 75 6e 74 65 72 28 29 20 66 75 6e 63 74 69  counter() functi
360a0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
360b0 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
360c0 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74  e.      ** count
360d0 65 72 20 69 6e 20 27 69 6e 64 69 72 65 63 74 2d  er in 'indirect-
360e0 6d 6f 64 65 27 2e 20 49 66 20 74 68 65 20 6f 70  mode'. If the op
360f0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f  timization is co
36100 6d 70 69 6c 65 64 20 69 6e 20 62 75 74 0a 20 20  mpiled in but.  
36110 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 70      ** is not ap
36120 70 6c 69 63 61 62 6c 65 20 74 6f 20 74 68 69 73  plicable to this
36130 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63 61   transaction, ca
36140 6c 6c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  ll sqlite3Journa
36150 6c 43 72 65 61 74 65 28 29 0a 20 20 20 20 20 20  lCreate().      
36160 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ** to make sure 
36170 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
36180 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 62 65   has actually be
36190 65 6e 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e  en created, then
361a0 20 63 61 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 70   call.      ** p
361b0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
361c0 63 6f 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64  counter() to upd
361d0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ate the change-c
361e0 6f 75 6e 74 65 72 20 69 6e 20 69 6e 64 69 72 65  ounter in indire
361f0 63 74 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  ct.      ** mode
36200 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  . .      **.    
36210 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
36220 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  if the optimizat
36230 69 6f 6e 20 69 73 20 62 6f 74 68 20 65 6e 61 62  ion is both enab
36240 6c 65 64 20 61 6e 64 20 61 70 70 6c 69 63 61 62  led and applicab
36250 6c 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  le,.      ** the
36260 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f 69 6e 63  n call pager_inc
36270 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
36280 29 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  ) to update the 
36290 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 0a 20  change-counter. 
362a0 20 20 20 20 20 2a 2a 20 69 6e 20 27 64 69 72 65       ** in 'dire
362b0 63 74 27 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69  ct' mode. In thi
362c0 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
362d0 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76  al file will nev
362e0 65 72 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 63  er be.      ** c
362f0 72 65 61 74 65 64 20 66 6f 72 20 74 68 69 73 20  reated for this 
36300 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
36310 20 20 20 2a 2f 0a 20 20 23 69 66 64 65 66 20 53     */.  #ifdef S
36320 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
36330 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20  MIC_WRITE.      
36340 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
36350 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
36360 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20  (pPager->jfd) . 
36370 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
36380 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
36390 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
363a0 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
363b0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a      || pPager->j
363c0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
363d0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
363e0 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  L .      );.    
363f0 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 26    if( !zMaster &
36400 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
36410 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 26 26  >jfd) .       &&
36420 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
36430 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53  Off==jrnlBufferS
36440 69 7a 65 28 70 50 61 67 65 72 29 20 0a 20 20 20  ize(pPager) .   
36450 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64      && pPager->d
36460 62 53 69 7a 65 3e 3d 70 50 61 67 65 72 2d 3e 64  bSize>=pPager->d
36470 62 4f 72 69 67 53 69 7a 65 0a 20 20 20 20 20 20  bOrigSize.      
36480 20 26 26 20 28 30 3d 3d 28 70 50 67 20 3d 20 73   && (0==(pPg = s
36490 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
364a0 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
364b0 43 61 63 68 65 29 29 20 7c 7c 20 30 3d 3d 70 50  Cache)) || 0==pP
364c0 67 2d 3e 70 44 69 72 74 79 29 0a 20 20 20 20 20  g->pDirty).     
364d0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55   ){.        /* U
364e0 70 64 61 74 65 20 74 68 65 20 64 62 20 66 69 6c  pdate the db fil
364f0 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
36500 20 76 69 61 20 74 68 65 20 64 69 72 65 63 74 2d   via the direct-
36510 77 72 69 74 65 20 6d 65 74 68 6f 64 2e 20 54 68  write method. Th
36520 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  e .        ** fo
36530 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c  llowing call wil
36540 6c 20 6d 6f 64 69 66 79 20 74 68 65 20 69 6e 2d  l modify the in-
36550 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
36560 61 74 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  ation of page 1 
36570 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 69  .        ** to i
36580 6e 63 6c 75 64 65 20 74 68 65 20 75 70 64 61 74  nclude the updat
36590 65 64 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  ed change counte
365a0 72 20 61 6e 64 20 74 68 65 6e 20 77 72 69 74 65  r and then write
365b0 20 70 61 67 65 20 31 20 0a 20 20 20 20 20 20 20   page 1 .       
365c0 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20   ** directly to 
365d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
365e0 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74 68  e. Because of th
365f0 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 0a  e atomic-write .
36600 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 70 65          ** prope
36610 72 74 79 20 6f 66 20 74 68 65 20 68 6f 73 74 20  rty of the host 
36620 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 69  file-system, thi
36630 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20 20  s is safe..     
36640 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
36650 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68   = pager_incr_ch
36660 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67  angecounter(pPag
36670 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65  er, 1);.      }e
36680 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
36690 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
366a0 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  Create(pPager->j
366b0 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  fd);.        if(
366c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
366d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
366e0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
366f0 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72  gecounter(pPager
36700 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
36710 20 20 20 20 20 20 7d 0a 20 20 23 65 6c 73 65 0a        }.  #else.
36720 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
36730 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
36740 74 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ter(pPager, 0);.
36750 20 20 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69    #endif.      i
36760 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
36770 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70   ) goto commit_p
36780 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20  hase_one_exit;. 
36790 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68   .      /* If th
367a0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  is transaction h
367b0 61 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61  as made the data
367c0 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68  base smaller, th
367d0 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20  en all pages.   
367e0 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63     ** being disc
367f0 61 72 64 65 64 20 62 79 20 74 68 65 20 74 72 75  arded by the tru
36800 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  ncation must be 
36810 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
36820 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
36830 66 69 6c 65 2e 20 54 68 69 73 20 63 61 6e 20 6f  file. This can o
36840 6e 6c 79 20 68 61 70 70 65 6e 20 69 6e 20 61 75  nly happen in au
36850 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 2e 0a  to-vacuum mode..
36860 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
36870 2a 20 42 65 66 6f 72 65 20 72 65 61 64 69 6e 67  * Before reading
36880 20 74 68 65 20 70 61 67 65 73 20 77 69 74 68 20   the pages with 
36890 70 61 67 65 20 6e 75 6d 62 65 72 73 20 6c 61 72  page numbers lar
368a0 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ger than the .  
368b0 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 76      ** current v
368c0 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
368d0 53 69 7a 65 2c 20 73 65 74 20 64 62 53 69 7a 65  Size, set dbSize
368e0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c   back to the val
368f0 75 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ue.      ** that
36900 20 69 74 20 74 6f 6f 6b 20 61 74 20 74 68 65 20   it took at the 
36910 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
36920 6e 73 61 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77  nsaction. Otherw
36930 69 73 65 2c 20 74 68 65 0a 20 20 20 20 20 20 2a  ise, the.      *
36940 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
36950 65 33 50 61 67 65 72 47 65 74 28 29 20 72 65 74  e3PagerGet() ret
36960 75 72 6e 20 7a 65 72 6f 65 64 20 70 61 67 65 73  urn zeroed pages
36970 20 69 6e 73 74 65 61 64 20 6f 66 20 0a 20 20 20   instead of .   
36980 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 64 61     ** reading da
36990 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ta from the data
369a0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
369b0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 68 65   **.      ** Whe
369c0 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 3d  n journal_mode==
369d0 4f 46 46 20 74 68 65 20 64 62 4f 72 69 67 53 69  OFF the dbOrigSi
369e0 7a 65 20 69 73 20 61 6c 77 61 79 73 20 7a 65 72  ze is always zer
369f0 6f 2c 20 73 6f 20 74 68 69 73 0a 20 20 20 20 20  o, so this.     
36a00 20 2a 2a 20 62 6c 6f 63 6b 20 6e 65 76 65 72 20   ** block never 
36a10 72 75 6e 73 20 69 66 20 6a 6f 75 72 6e 61 6c 5f  runs if journal_
36a20 6d 6f 64 65 3d 4f 46 46 2e 0a 20 20 20 20 20 20  mode=OFF..      
36a30 2a 2f 0a 20 20 23 69 66 6e 64 65 66 20 53 51 4c  */.  #ifndef SQL
36a40 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
36a50 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 50  UUM.      if( pP
36a60 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 61  ager->dbSize<pPa
36a70 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
36a80 0a 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65  .       && pPage
36a90 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
36aa0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
36ab0 45 5f 4f 46 46 0a 20 20 20 20 20 20 29 7b 0a 20  E_OFF.      ){. 
36ac0 20 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 20 20         Pgno i;  
36ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36af0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
36b00 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  iable */.       
36b10 20 63 6f 6e 73 74 20 50 67 6e 6f 20 69 53 6b 69   const Pgno iSki
36b20 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  p = PAGER_MJ_PGN
36b30 4f 28 70 50 61 67 65 72 29 3b 20 2f 2a 20 50 65  O(pPager); /* Pe
36b40 6e 64 69 6e 67 20 6c 6f 63 6b 20 70 61 67 65 20  nding lock page 
36b50 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  */.        const
36b60 20 50 67 6e 6f 20 64 62 53 69 7a 65 20 3d 20 70   Pgno dbSize = p
36b70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 20 20  Pager->dbSize;  
36b80 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
36b90 20 69 6d 61 67 65 20 73 69 7a 65 20 2a 2f 20 0a   image size */ .
36ba0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
36bb0 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
36bc0 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 20  >dbOrigSize;.   
36bd0 20 20 20 20 20 66 6f 72 28 20 69 3d 64 62 53 69       for( i=dbSi
36be0 7a 65 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d  ze+1; i<=pPager-
36bf0 3e 64 62 4f 72 69 67 53 69 7a 65 3b 20 69 2b 2b  >dbOrigSize; i++
36c00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
36c10 28 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63  ( !sqlite3Bitvec
36c20 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
36c30 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20 69  Journal, i) && i
36c40 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20  !=iSkip ){.     
36c50 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50         PgHdr *pP
36c60 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
36c70 20 2f 2a 20 50 61 67 65 20 74 6f 20 6a 6f 75 72   /* Page to jour
36c80 6e 61 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  nal */.         
36c90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
36ca0 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
36cb0 69 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20  i, &pPage);.    
36cc0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
36cd0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
36ce0 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
36cf0 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  e_exit;.        
36d00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36d10 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
36d20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
36d30 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
36d40 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
36d50 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
36d60 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f  ITE_OK ) goto co
36d70 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
36d80 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  xit;.          }
36d90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
36da0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
36db0 65 20 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20 20  e = dbSize;.    
36dc0 20 20 7d 20 0a 20 20 23 65 6e 64 69 66 0a 20 20    } .  #endif.  
36dd0 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  .      /* Write 
36de0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
36df0 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65  al name into the
36e00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
36e10 66 20 61 20 6d 61 73 74 65 72 20 0a 20 20 20 20  f a master .    
36e20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
36e30 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61  e name has alrea
36e40 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
36e50 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
36e60 69 6c 65 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f  ile, .      ** o
36e70 72 20 69 66 20 7a 4d 61 73 74 65 72 20 69 73 20  r if zMaster is 
36e80 4e 55 4c 4c 20 28 6e 6f 20 6d 61 73 74 65 72 20  NULL (no master 
36e90 6a 6f 75 72 6e 61 6c 29 2c 20 74 68 65 6e 20 74  journal), then t
36ea0 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
36eb0 2d 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  -op..      */.  
36ec0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61      rc = writeMa
36ed0 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
36ee0 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
36ef0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
36f00 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
36f10 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
36f20 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20  it;.  .      /* 
36f30 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
36f40 20 66 69 6c 65 20 61 6e 64 20 77 72 69 74 65 20   file and write 
36f50 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
36f60 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
36f70 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
36f80 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f   atomic-update o
36f90 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62  ptimization is b
36fa0 65 69 6e 67 20 75 73 65 64 2c 20 74 68 69 73 20  eing used, this 
36fb0 73 79 6e 63 20 77 69 6c 6c 20 6e 6f 74 20 0a 20  sync will not . 
36fc0 20 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20 74       ** create t
36fd0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
36fe0 6f 72 20 70 65 72 66 6f 72 6d 20 61 6e 79 20 72  or perform any r
36ff0 65 61 6c 20 49 4f 2e 0a 20 20 20 20 20 20 2a 2a  eal IO..      **
37000 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73  .      ** Becaus
37010 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
37020 6e 74 65 72 20 70 61 67 65 20 77 61 73 20 6a 75  nter page was ju
37030 73 74 20 6d 6f 64 69 66 69 65 64 2c 20 75 6e 6c  st modified, unl
37040 65 73 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ess the.      **
37050 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f   atomic-update o
37060 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75  ptimization is u
37070 73 65 64 20 69 74 20 69 73 20 61 6c 6d 6f 73 74  sed it is almost
37080 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 74 68   certain that th
37090 65 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  e.      ** journ
370a0 61 6c 20 72 65 71 75 69 72 65 73 20 61 20 73 79  al requires a sy
370b0 6e 63 20 68 65 72 65 2e 20 48 6f 77 65 76 65 72  nc here. However
370c0 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  , in locking_mod
370d0 65 3d 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20  e=exclusive.    
370e0 20 20 2a 2a 20 6f 6e 20 61 20 73 79 73 74 65 6d    ** on a system
370f0 20 75 6e 64 65 72 20 6d 65 6d 6f 72 79 20 70 72   under memory pr
37100 65 73 73 75 72 65 20 69 74 20 69 73 20 6a 75 73  essure it is jus
37110 74 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  t possible that 
37120 74 68 69 73 20 69 73 20 0a 20 20 20 20 20 20 2a  this is .      *
37130 2a 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 20  * not the case. 
37140 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  In this case it 
37150 69 73 20 6c 69 6b 65 6c 79 20 65 6e 6f 75 67 68  is likely enough
37160 20 74 68 61 74 20 74 68 65 20 72 65 64 75 6e 64   that the redund
37170 61 6e 74 0a 20 20 20 20 20 20 2a 2a 20 78 53 79  ant.      ** xSy
37180 6e 63 28 29 20 63 61 6c 6c 20 77 69 6c 6c 20 62  nc() call will b
37190 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61 20 6e  e changed to a n
371a0 6f 2d 6f 70 20 62 79 20 74 68 65 20 4f 53 20 61  o-op by the OS a
371b0 6e 79 68 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2f  nyhow. .      */
371c0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63  .      rc = sync
371d0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
371e0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
371f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
37200 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
37210 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20  one_exit;.  .   
37220 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
37230 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61  ite_pagelist(pPa
37240 67 65 72 2c 73 71 6c 69 74 65 33 50 63 61 63 68  ger,sqlite3Pcach
37250 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
37260 72 2d 3e 70 50 43 61 63 68 65 29 29 3b 0a 20 20  r->pPCache));.  
37270 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
37280 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
37290 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
372a0 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
372b0 44 20 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  D );.        got
372c0 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
372d0 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  ne_exit;.      }
372e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
372f0 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
37300 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
37310 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68   .      /* If th
37320 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
37330 73 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 73  s not the same s
37340 69 7a 65 20 61 73 20 74 68 65 20 64 61 74 61 62  ize as the datab
37350 61 73 65 20 69 6d 61 67 65 2c 0a 20 20 20 20 20  ase image,.     
37360 20 2a 2a 20 74 68 65 6e 20 75 73 65 20 70 61 67   ** then use pag
37370 65 72 5f 74 72 75 6e 63 61 74 65 20 74 6f 20 67  er_truncate to g
37380 72 6f 77 20 6f 72 20 73 68 72 69 6e 6b 20 74 68  row or shrink th
37390 65 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20  e file here..   
373a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
373b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 21 3d  pPager->dbSize!=
373c0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
373d0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  ze ){.        Pg
373e0 6e 6f 20 6e 4e 65 77 20 3d 20 70 50 61 67 65 72  no nNew = pPager
373f0 2d 3e 64 62 53 69 7a 65 20 2d 20 28 70 50 61 67  ->dbSize - (pPag
37400 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 41 47 45  er->dbSize==PAGE
37410 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
37420 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ));.        asse
37430 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
37440 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
37450 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 20 20 20 20  _DBMOD );.      
37460 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
37470 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 4e  ncate(pPager, nN
37480 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
37490 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
374a0 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
374b0 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20  se_one_exit;.   
374c0 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a     }.  .      /*
374d0 20 46 69 6e 61 6c 6c 79 2c 20 73 79 6e 63 20 74   Finally, sync t
374e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
374f0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21  . */.      if( !
37500 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26  pPager->noSync &
37510 26 20 21 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  & !noSync ){.   
37520 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
37530 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
37540 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
37550 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d  _flags);.      }
37560 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
37570 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  "DBSYNC %p\n", p
37580 50 61 67 65 72 29 29 0a 20 20 20 20 7d 0a 20 20  Pager)).    }.  
37590 7d 0a 0a 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  }..commit_phase_
375a0 6f 6e 65 5f 65 78 69 74 3a 0a 20 20 69 66 28 20  one_exit:.  if( 
375b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
375c0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
375d0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70 50 61  ager) ){.    pPa
375e0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
375f0 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
37600 48 45 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  HED;.  }.  retur
37610 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
37620 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
37630 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
37640 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
37650 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74  has been complet
37660 65 6c 79 0a 2a 2a 20 75 70 64 61 74 65 64 20 74  ely.** updated t
37670 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20 63 68  o reflect the ch
37680 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
37690 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
376a0 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 73 79 6e  ction and.** syn
376b0 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 54 68 65  ced to disk. The
376c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 74   journal file st
376d0 69 6c 6c 20 65 78 69 73 74 73 20 69 6e 20 74 68  ill exists in th
376e0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a  e file-system .*
376f0 2a 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 69 66  * though, and if
37700 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
37710 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
37720 69 74 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c  it will eventual
37730 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 61 73  ly.** be used as
37740 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61   a hot-journal a
37750 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
37760 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 65  ransaction rolle
37770 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  d back..**.** Th
37780 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 61  is function fina
37790 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e 61  lizes the journa
377a0 6c 20 66 69 6c 65 2c 20 65 69 74 68 65 72 20 62  l file, either b
377b0 79 20 64 65 6c 65 74 69 6e 67 2c 20 0a 2a 2a 20  y deleting, .** 
377c0 74 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 70 61  truncating or pa
377d0 72 74 69 61 6c 6c 79 20 7a 65 72 6f 69 6e 67 20  rtially zeroing 
377e0 69 74 2c 20 73 6f 20 74 68 61 74 20 69 74 20 63  it, so that it c
377f0 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 0a 2a  annot be used .*
37800 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f 75 72 6e 61  * for hot-journa
37810 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 6e 63 65  l rollback. Once
37820 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 74 68   this is done th
37830 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
37840 0a 2a 2a 20 69 72 72 65 76 6f 63 61 62 6c 79 20  .** irrevocably 
37850 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
37860 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
37870 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72  urs, an IO error
37880 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
37890 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 0a  d and the pager.
378a0 2a 2a 20 6d 6f 76 65 73 20 69 6e 74 6f 20 74 68  ** moves into th
378b0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 4f  e error state. O
378c0 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
378d0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
378e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
378f0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
37900 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  wo(Pager *pPager
37910 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
37920 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
37930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
37940 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
37950 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
37960 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c  hould not be cal
37970 6c 65 64 20 69 66 20 61 20 70 72 69 6f 72 20 65  led if a prior e
37980 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
37990 64 2e 0a 20 20 2a 2a 20 42 75 74 20 69 66 20 28  d..  ** But if (
379a0 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20  due to a coding 
379b0 65 72 72 6f 72 20 65 6c 73 65 77 68 65 72 65 20  error elsewhere 
379c0 69 6e 20 74 68 65 20 73 79 73 74 65 6d 29 20 69  in the system) i
379d0 74 20 64 6f 65 73 20 67 65 74 0a 20 20 2a 2a 20  t does get.  ** 
379e0 63 61 6c 6c 65 64 2c 20 6a 75 73 74 20 72 65 74  called, just ret
379f0 75 72 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72  urn the same err
37a00 6f 72 20 63 6f 64 65 20 77 69 74 68 6f 75 74 20  or code without 
37a10 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
37a20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
37a30 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
37a40 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
37a50 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 61 73 73  >errCode;..  ass
37a60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
37a70 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
37a80 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20  R_LOCKED.       
37a90 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
37aa0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
37ab0 46 49 4e 49 53 48 45 44 0a 20 20 20 20 20 20 20  FINISHED.       
37ac0 7c 7c 20 28 70 61 67 65 72 55 73 65 57 61 6c 28  || (pagerUseWal(
37ad0 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65  pPager) && pPage
37ae0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
37af0 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
37b00 29 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ).  );.  assert(
37b10 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
37b20 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  ate(pPager) );..
37b30 20 20 2f 2a 20 41 6e 20 6f 70 74 69 6d 69 7a 61    /* An optimiza
37b40 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 64 61 74  tion. If the dat
37b50 61 62 61 73 65 20 77 61 73 20 6e 6f 74 20 61 63  abase was not ac
37b60 74 75 61 6c 6c 79 20 6d 6f 64 69 66 69 65 64 20  tually modified 
37b70 64 75 72 69 6e 67 0a 20 20 2a 2a 20 74 68 69 73  during.  ** this
37b80 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
37b90 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
37ba0 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ng in exclusive-
37bb0 6d 6f 64 65 20 61 6e 64 20 69 73 0a 20 20 2a 2a  mode and is.  **
37bc0 20 75 73 69 6e 67 20 70 65 72 73 69 73 74 65 6e   using persisten
37bd0 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e  t journals, then
37be0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
37bf0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a  s a no-op..  **.
37c00 20 20 2a 2a 20 54 68 65 20 73 74 61 72 74 20 6f    ** The start o
37c10 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
37c20 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  le currently con
37c30 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 6a  tains a single j
37c40 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61  ournal .  ** hea
37c50 64 65 72 20 77 69 74 68 20 74 68 65 20 6e 52 65  der with the nRe
37c60 63 20 66 69 65 6c 64 20 73 65 74 20 74 6f 20 30  c field set to 0
37c70 2e 20 49 66 20 73 75 63 68 20 61 20 6a 6f 75 72  . If such a jour
37c80 6e 61 6c 20 69 73 20 75 73 65 64 20 61 73 0a 20  nal is used as. 
37c90 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
37ca0 6c 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75  l during hot-jou
37cb0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 30  rnal rollback, 0
37cc0 20 63 68 61 6e 67 65 73 20 77 69 6c 6c 20 62 65   changes will be
37cd0 20 6d 61 64 65 0a 20 20 2a 2a 20 74 6f 20 74 68   made.  ** to th
37ce0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
37cf0 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20   So there is no 
37d00 6e 65 65 64 20 74 6f 20 7a 65 72 6f 20 74 68 65  need to zero the
37d10 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68   journal .  ** h
37d20 65 61 64 65 72 2e 20 53 69 6e 63 65 20 74 68 65  eader. Since the
37d30 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
37d40 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65  lusive mode, the
37d50 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20  re is no need.  
37d60 2a 2a 20 74 6f 20 64 72 6f 70 20 61 6e 79 20 6c  ** to drop any l
37d70 6f 63 6b 73 20 65 69 74 68 65 72 2e 0a 20 20 2a  ocks either..  *
37d80 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
37d90 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
37da0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 0a 20 20 20  ITER_LOCKED .   
37db0 26 26 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  && pPager->exclu
37dc0 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20  siveMode .   && 
37dd0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
37de0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
37df0 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20  ALMODE_PERSIST. 
37e00 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
37e10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
37e20 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
37e30 53 5a 28 70 50 61 67 65 72 29 20 7c 7c 20 21 70  SZ(pPager) || !p
37e40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
37e50 66 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  f );.    pPager-
37e60 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
37e70 52 45 41 44 45 52 3b 0a 20 20 20 20 72 65 74 75  READER;.    retu
37e80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
37e90 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  }..  PAGERTRACE(
37ea0 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20  ("COMMIT %d\n", 
37eb0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
37ec0 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  );.  rc = pager_
37ed0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
37ee0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
37ef0 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  setMaster);.  re
37f00 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
37f10 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a  (pPager, rc);.}.
37f20 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 77 72 69 74  ./*.** If a writ
37f30 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
37f40 20 6f 70 65 6e 2c 20 74 68 65 6e 20 61 6c 6c 20   open, then all 
37f50 63 68 61 6e 67 65 73 20 6d 61 64 65 20 77 69 74  changes made wit
37f60 68 69 6e 20 74 68 65 20 0a 2a 2a 20 74 72 61 6e  hin the .** tran
37f70 73 61 63 74 69 6f 6e 20 61 72 65 20 72 65 76 65  saction are reve
37f80 72 74 65 64 20 61 6e 64 20 74 68 65 20 63 75 72  rted and the cur
37f90 72 65 6e 74 20 77 72 69 74 65 2d 74 72 61 6e 73  rent write-trans
37fa0 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64  action is closed
37fb0 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 66  ..** The pager f
37fc0 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47  alls back to PAG
37fd0 45 52 5f 52 45 41 44 45 52 20 73 74 61 74 65 20  ER_READER state 
37fe0 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
37ff0 72 20 50 41 47 45 52 5f 45 52 52 4f 52 0a 2a 2a  r PAGER_ERROR.**
38000 20 73 74 61 74 65 20 69 66 20 61 6e 20 65 72 72   state if an err
38010 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  or occurs..**.**
38020 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
38030 20 61 6c 72 65 61 64 79 20 69 6e 20 50 41 47 45   already in PAGE
38040 52 5f 45 52 52 4f 52 20 73 74 61 74 65 20 77 68  R_ERROR state wh
38050 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
38060 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 69   is called,.** i
38070 74 20 72 65 74 75 72 6e 73 20 50 61 67 65 72 2e  t returns Pager.
38080 65 72 72 43 6f 64 65 20 69 6d 6d 65 64 69 61 74  errCode immediat
38090 65 6c 79 2e 20 4e 6f 20 77 6f 72 6b 20 69 73 20  ely. No work is 
380a0 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 69  performed in thi
380b0 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74  s case..**.** Ot
380c0 68 65 72 77 69 73 65 2c 20 69 6e 20 72 6f 6c 6c  herwise, in roll
380d0 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 69 73 20  back mode, this 
380e0 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d  function perform
380f0 73 20 74 77 6f 20 66 75 6e 63 74 69 6f 6e 73 3a  s two functions:
38100 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 74 20 72  .**.**   1) It r
38110 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 20 6a 6f  olls back the jo
38120 75 72 6e 61 6c 20 66 69 6c 65 2c 20 72 65 73 74  urnal file, rest
38130 6f 72 69 6e 67 20 61 6c 6c 20 64 61 74 61 62 61  oring all databa
38140 73 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20  se file and .** 
38150 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 63       in-memory c
38160 61 63 68 65 20 70 61 67 65 73 20 74 6f 20 74 68  ache pages to th
38170 65 20 73 74 61 74 65 20 74 68 65 79 20 77 65 72  e state they wer
38180 65 20 69 6e 20 77 68 65 6e 20 74 68 65 20 74 72  e in when the tr
38190 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20  ansaction.**    
381a0 20 20 77 61 73 20 6f 70 65 6e 65 64 2c 20 61 6e    was opened, an
381b0 64 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 74 20  d.**.**   2) It 
381c0 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f  finalizes the jo
381d0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 6f 20 74  urnal file, so t
381e0 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 75 73  hat it is not us
381f0 65 64 20 66 6f 72 20 68 6f 74 0a 2a 2a 20 20 20  ed for hot.**   
38200 20 20 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61     rollback at a
38210 6e 79 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  ny point in the 
38220 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 46 69  future..**.** Fi
38230 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68  nalization of th
38240 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
38250 74 61 73 6b 20 32 29 20 69 73 20 6f 6e 6c 79 20  task 2) is only 
38260 70 65 72 66 6f 72 6d 65 64 20 69 66 20 74 68 65  performed if the
38270 20 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 73   .** rollback is
38280 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 0a   successful..**.
38290 2a 2a 20 49 6e 20 57 41 4c 20 6d 6f 64 65 2c 20  ** In WAL mode, 
382a0 61 6c 6c 20 63 61 63 68 65 2d 65 6e 74 72 69 65  all cache-entrie
382b0 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 64 61 74  s containing dat
382c0 61 20 6d 6f 64 69 66 69 65 64 20 77 69 74 68 69  a modified withi
382d0 6e 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  n the.** current
382e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65   transaction are
382f0 20 65 69 74 68 65 72 20 65 78 70 65 6c 6c 65 64   either expelled
38300 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20   from the cache 
38310 6f 72 20 72 65 76 65 72 74 65 64 20 74 6f 0a 2a  or reverted to.*
38320 2a 20 74 68 65 69 72 20 70 72 65 2d 74 72 61 6e  * their pre-tran
38330 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 62 79  saction state by
38340 20 72 65 2d 72 65 61 64 69 6e 67 20 64 61 74 61   re-reading data
38350 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
38360 73 65 20 6f 72 0a 2a 2a 20 57 41 4c 20 66 69 6c  se or.** WAL fil
38370 65 73 2e 20 54 68 65 20 57 41 4c 20 74 72 61 6e  es. The WAL tran
38380 73 61 63 74 69 6f 6e 20 69 73 20 74 68 65 6e 20  saction is then 
38390 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  closed..*/.int s
383a0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
383b0 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
383c0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
383d0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
383e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
383f0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50  turn code */.  P
38400 41 47 45 52 54 52 41 43 45 28 28 22 52 4f 4c 4c  AGERTRACE(("ROLL
38410 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45  BACK %d\n", PAGE
38420 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 0a  RID(pPager)));..
38430 20 20 2f 2a 20 50 61 67 65 72 52 6f 6c 6c 62 61    /* PagerRollba
38440 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20  ck() is a no-op 
38450 69 66 20 63 61 6c 6c 65 64 20 69 6e 20 52 45 41  if called in REA
38460 44 45 52 20 6f 72 20 4f 50 45 4e 20 73 74 61 74  DER or OPEN stat
38470 65 2e 20 49 66 0a 20 20 2a 2a 20 74 68 65 20 70  e. If.  ** the p
38480 61 67 65 72 20 69 73 20 61 6c 72 65 61 64 79 20  ager is already 
38490 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  in the ERROR sta
384a0 74 65 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  te, the rollback
384b0 20 69 73 20 6e 6f 74 20 0a 20 20 2a 2a 20 61 74   is not .  ** at
384c0 74 65 6d 70 74 65 64 20 68 65 72 65 2e 20 49 6e  tempted here. In
384d0 73 74 65 61 64 2c 20 74 68 65 20 65 72 72 6f 72  stead, the error
384e0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
384f0 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
38500 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
38510 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
38520 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
38530 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
38540 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te==PAGER_ERROR 
38550 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
38560 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69 66 28 20  >errCode;.  if( 
38570 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 3d  pPager->eState<=
38580 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 20 72  PAGER_READER ) r
38590 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
385a0 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
385b0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
385c0 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20     int rc2;.    
385d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
385e0 72 53 61 76 65 70 6f 69 6e 74 28 70 50 61 67 65  rSavepoint(pPage
385f0 72 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  r, SAVEPOINT_ROL
38600 4c 42 41 43 4b 2c 20 2d 31 29 3b 0a 20 20 20 20  LBACK, -1);.    
38610 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f  rc2 = pager_end_
38620 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
38630 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  er, pPager->setM
38640 61 73 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20  aster);.    if( 
38650 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
38660 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 65 6c 73  rc = rc2;.  }els
38670 65 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50  e if( !isOpen(pP
38680 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50  ager->jfd) || pP
38690 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
386a0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
386b0 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  D ){.    rc = pa
386c0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
386d0 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ion(pPager, 0);.
386e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
386f0 3d 20 70 61 67 65 72 5f 70